Я пытаюсь получить доступ к веб-службе 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://user:pw@proxyIP:port
. - person mhawke   schedule 05.09.2014