pythonのrequestsを用いてproxy越しのdigest認証をする方法について
pythonのrequestsモジュールでproxy越しのdigest認証をする方法が知りたいです。
(もしくはrequestsモジュール以外の方法でproxy越しのdigest認証をする方法が知りたいです。)
環境は
Mac OSX Yosemite 10.10.3
Python 3.4.1 | Anaconda 2.1.0 (x86_64)
requests 2.6.0
です。
英語版StackOverflowの同じような質問(私の質問内容自体はこれとほぼ同じです)を見て、HTTPProxyDigestAuthを使ってみたのですが、
>>> from proxydigest import *
>>> proxies = {"http": myproxy}
>>> auth = HTTPProxyDigestAuth(myuser, mypass)
>>> import requests
>>> r = requests.get(myurl, proxies=proxies, auth=auth)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/opt/pyenv/versions/anaconda3-2.1.0/lib/python3.4/site-packages/requests/api.py", line 59, in get
return request('get', url, **kwargs)
File "/usr/local/opt/pyenv/versions/anaconda3-2.1.0/lib/python3.4/site-packages/requests/api.py", line 48, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/local/opt/pyenv/versions/anaconda3-2.1.0/lib/python3.4/site-packages/requests/sessions.py", line 451, in request
resp = self.send(prep, **send_kwargs)
File "/usr/local/opt/pyenv/versions/anaconda3-2.1.0/lib/python3.4/site-packages/requests/sessions.py", line 563, in send
r = dispatch_hook('response', hooks, r, **kwargs)
File "/usr/local/opt/pyenv/versions/anaconda3-2.1.0/lib/python3.4/site-packages/requests/hooks.py", line 41, in dispatch_hook
_hook_data = hook(hook_data, **kwargs)
TypeError: handle_407() got an unexpected keyword argument 'proxies'
となり、うまくいきません。(proxydigestはHTTPProxyDigestAuthクラスがあるモジュールで、myproxy、myuserなどはそれぞれの情報が入った文字列変数です)
どうすればいいでしょうか?
(追記 2015年5月28日)
解答で頂いたように、
def handle_407(self, r, **kwargs):
としてみましたが、以下の様なエラーが出ました。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/requests/api.py", line 69, in get
return request('get', url, params=params, **kwargs)
File "/Library/Python/2.7/site-packages/requests/api.py", line 50, in request
response = session.request(method=method, url=url, **kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 465, in request
resp = self.send(prep, **send_kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 579, in send
r = dispatch_hook('response', hooks, r, **kwargs)
File "/Library/Python/2.7/site-packages/requests/hooks.py", line 41, in dispatch_hook
_hook_data = hook(hook_data, **kwargs)
File "proxydigest.py", line 22, in handle_407
r.request.send(anyway=True)
AttributeError: 'PreparedRequest' object has no attribute 'send'
また、requests 1.0.0でもやってみましたが、
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "tmprec.py", line 5, in <module>
r = requests.get('http://doi.acm.org/10.1145/2588555.2588558', proxies=proxies, auth=auth)
File "/Library/Python/2.7/site-packages/requests/api.py", line 49, in get
return request('get', url, **kwargs)
File "/Library/Python/2.7/site-packages/requests/api.py", line 38, in request
return session.request(method=method, url=url, **kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 256, in request
resp = self.send(prep, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 347, in send
r = adapter.send(request, **kwargs)
File "/Library/Python/2.7/site-packages/requests/adapters.py", line 148, in send
conn = self.get_connection(request.url, proxies)
File "/Library/Python/2.7/site-packages/requests/adapters.py", line 130, in get_connection
conn = self.poolmanager.ProxyManager(self.poolmanager.proxy_from_url(proxy))
AttributeError: 'PoolManager' object has no attribute 'ProxyManager'
というエラーが出ました...
(追記2 2015年5月29日)
解決しました。なぜバグが起きていたかまでは特定できませんでしたが、使ったものと状況を記しておきます。
実行環境
Mac OSX Yosemite 10.10.3
Python 3.4.1 | Anaconda 2.1.0 (x86_64)
requests 2.4.1 (←Anaconda 2.1.0に付属のもの)
requests toolbeltには、HTTPProxyDigestAuthという欲しかった機能があったのですが、これではなぜかエラーが出てしまいました。なので、requests toolbeltからHTTPProxyDigestAuthクラスを抜き出して来て、以下のように修正しました。
6行目: from requests import cookies
→ from requests import cookies, utils
35行目: self.chal = cookies.parse_dict_header(
→ self.chal = utils.parse_dict_header(
こうすれば、
>>> from proxydigest import HTTPProxyDigestAuth
>>> proxies = {"http": myproxy}
>>> auth = HTTPProxyDigestAuth(myuser, mypass)
>>> import requests
>>> r = requests.get(myurl, proxies=proxies, auth=auth)
>>> r
<Response [200]>
となり、エラーもなく動かすことが出来ました。読んでいただいた皆様、ありがとうございました。