Сбой прокси-соединения Python в urllib splituser _userprog

Я пытаюсь получить доступ к веб-службе http через брандмауэр с использованием прокси-сервера. Чтобы получить доступ к сервису, мне нужно сгенерировать токен, используя https-соединение от поставщика услуг. По какой-то причине мое соединение через прокси не работает, и интерпретатор Python выдает ошибку в строке 1072 в urllib, которая имеет дело с _userprog внутри splituser def:

match = _userprog.match(host)

Соответствующий текст ошибки — «ожидаемая строка или буфер». Я добавил как http_proxy, так и https_proxy в качестве переменных среды, используя SETX в командной строке...

SETX http_proxy http:\\user:pw@proxyIP:port
SETX https_proxy https:\\user:pw@proxyIP:port

... и добавил обработчики прокси перед кодом GetToken моего скрипта:

# set proxies
proxy = urllib2.ProxyHandler({
    'http': 'proxy_ip',
    'https': 'proxy_ip'
})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)

class GetToken(object):
        def urlopen(self, url, data=None):
        # open url, send response
        referer = "http://www.arcgis.com/arcgis/rest"
        req = urllib2.Request(url)
        req.add_header('Referer', referer)
        if data:
            response = urllib2.urlopen(req, data)
        else:
            response = urllib2.urlopen(req)
        return response

    def gentoken(self, username, password,
        referer = 'www.arcgis.com', expiration=60):
        # gets token from referrer
        query_dict = {'username': username,
            'password': password,
            'expiration': str(expiration),
            'client': 'referer',
            'referer': referer,
            'f': 'json'}
        query_string = urllib.urlencode(query_dict)
        token_url = "https://www.arcgis.com/sharing/rest/generateToken"
        token_response = urllib.urlopen(token_url, query_string)
        token = json.loads(token_response.read())
        if "token" not in token:
            print token['messages']
            exit()
        else:
            return token['token']

Но все равно выдает ту же ошибку. Любые советы будут высоко оценены и спасибо заранее!

ОБНОВЛЕНИЕ

Спасибо mhawke за предложение косой черты, это изменило ситуацию... но теперь я получаю новую ошибку, вот трассировка:

Traceback               
    <module>    C:\Users\tle\Desktop\Scripts\dl_extract2.py 161     
    main    C:\Users\tle\Desktop\Scripts\dl_extract2.py 157     
    __init__    C:\Users\tle\Desktop\Scripts\dl_extract2.py 53      
    gentoken    C:\Users\tle\Desktop\Scripts\dl_extract2.py 40      
    urlopen C:\Python26\ArcGIS10.0\lib\urllib.py    88      
    open    C:\Python26\ArcGIS10.0\lib\urllib.py    207     
    open_https  C:\Python26\ArcGIS10.0\lib\urllib.py    439     
    endheaders  C:\Python26\ArcGIS10.0\lib\httplib.py   904     
    _send_output    C:\Python26\ArcGIS10.0\lib\httplib.py   776     
    send    C:\Python26\ArcGIS10.0\lib\httplib.py   735     
    connect C:\Python26\ArcGIS10.0\lib\httplib.py   1112        
    wrap_socket C:\Python26\ArcGIS10.0\lib\ssl.py   350     
    __init__    C:\Python26\ArcGIS10.0\lib\ssl.py   118     
    do_handshake    C:\Python26\ArcGIS10.0\lib\ssl.py   293     
IOError: [Errno socket error] [Errno 1] _ssl.c:480: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol 

ОБНОВЛЕНИЕ 2

согласно предложению mhawke, попытался использовать urllib2() вместо urllib() для https-соединения для создания токена, что избавляет от ошибки рукопожатия. к сожалению, теперь я вернулся к исходной точке с ошибкой тайм-аута, за исключением того, что на этот раз она выбрасывается в строку 1136 urllib2. я полагаю, это потому, что urllib2 не поддерживает соединения https. означает ли это также, что мой прокси-сервер не поддерживает туннелирование http, или я могу проверить это с моей локальной машины? в любом случае, вот последняя трассировка:

Traceback               
    <module>    C:\Users\tle\Desktop\Scripts\dl_extract2.py 161     
    main    C:\Users\tle\Desktop\Scripts\dl_extract2.py 157     
    __init__    C:\Users\tle\Desktop\Scripts\dl_extract2.py 53      
    gentoken    C:\Users\tle\Desktop\Scripts\dl_extract2.py 40      
    urlopen C:\Python26\ArcGIS10.0\lib\urllib2.py   126     
    open    C:\Python26\ArcGIS10.0\lib\urllib2.py   391     
    _open   C:\Python26\ArcGIS10.0\lib\urllib2.py   409     
    _call_chain C:\Python26\ArcGIS10.0\lib\urllib2.py   369     
    https_open  C:\Python26\ArcGIS10.0\lib\urllib2.py   1169        
    do_open C:\Python26\ArcGIS10.0\lib\urllib2.py   1136        
URLError: <urlopen error [Errno 10060] Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat>   

ОБНОВЛЕНИЕ 3

Это оказалось очень простым решением — все, что нужно (в моем случае), — это переменные системной среды с обычными косыми чертами:

http_proxy: http://user:pw@proxyip:port
https_proxy: http://user:pw@proxyip:port

и следующий код удален из скрипта:

proxy = urllib2.ProxyHandler({
    'http': 'proxy_ip',
    'https': 'proxy_ip'
})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)

Эта ссылка объясняет, как и почему это работает:

http://lukasa.co.uk/2013/07/Python_Requests_And_Proxies/


person Crazy Otto    schedule 05.09.2014    source источник
comment
Пожалуйста, опубликуйте полную трассировку и покажите, что вы используете для «http»: «proxy_ip»   -  person mhawke    schedule 05.09.2014
comment
Кроме того, вместо использования обратной косой черты вы можете попробовать использовать косую черту в своих URL-адресах, например http://user:pw@proxyIP:port.   -  person mhawke    schedule 05.09.2014
comment
прокси_ip: 192.168.104.103   -  person Crazy Otto    schedule 08.09.2014


Ответы (2)


Первоначальная проблема, по-видимому, была решена с помощью косой черты в переменных среды прокси.

Что касается проблемы с подключением SSL, вы, похоже, используете один и тот же порт для прокси-серверов http и https. Может ли ваш прокси-сервер справиться с этим?

Во-первых, обратите внимание, что в gentoken() используется urllib.urlopen(). urllib.urlopen() подключается к настроенному прокси-серверу используя SSL, если эта схема установлена ​​для URL-адреса прокси-сервера. В вашем случае https_proxy равно https://user:pw@proxyIP:port, поэтому к вашему прокси будет установлено SSL-соединение. Может показаться, что ваш прокси-сервер не обрабатывает то, что могло бы объяснить исключение неудавшегося рукопожатия SSL. ** Попробуйте вместо этого использовать urllib2.urlopen().

Кроме того, код Python, который создает ProxyHandler, предназначен только для urllib2, а не urllib. urllib соединений будут использовать настройки переменных среды.

** Документировано здесь, что urllib2() не поддерживает https через прокси , но это может сработать, если ваш прокси поддерживает туннелирование HTTP через HTTP CONNECT.

person mhawke    schedule 08.09.2014
comment
еще раз спасибо за ответ, mhawke - прогресс и трассировка опубликованы в обновлении. я предполагаю, что мне нужно будет проверить с IT, чтобы видеть, поддерживает ли прокси-сервер туннелирование. - person Crazy Otto; 08.09.2014

Это оказалось очень простым решением — все, что нужно (в моем случае), — это переменные системной среды с обычными косыми чертами:

http_proxy: http://user:pw@proxyip:port
https_proxy: http://user:pw@proxyip:port

и следующий код удален из скрипта:

proxy = urllib2.ProxyHandler({
    'http': 'proxy_ip',
    'https': 'proxy_ip'
})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)

Эта ссылка объясняет, как и почему это работает:

http://lukasa.co.uk/2013/07/Python_Requests_And_Proxies/

person Crazy Otto    schedule 10.09.2014