10696


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の同じような質問](https://stackoverflow.com/questions/13506455/how-
to-pass-proxy-authentication-requires-digest-auth-by-using-python-
requests)(私の質問内容自体はこれとほぼ同じです)を見て、HTTPProxyDigestAuthを使ってみたのですが、

[code]

    >>> 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'
    
[/code]

となり、うまくいきません。(proxydigestはHTTPProxyDigestAuthクラスがあるモジュールで、myproxy、myuserなどはそれぞれの情報が入った文字列変数です)  
どうすればいいでしょうか？

(追記 2015年5月28日)  
解答で頂いたように、

[code]

    def handle_407(self, r, **kwargs):
    
[/code]

としてみましたが、以下の様なエラーが出ました。

[code]

    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'
    
[/code]

また、requests 1.0.0でもやってみましたが、

[code]

    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'
    
[/code]

というエラーが出ました...

(追記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](https://toolbelt.readthedocs.org/en/latest/)には、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(`  
こうすれば、

[code]

    >>> from proxydigest import HTTPProxyDigestAuth
    >>> proxies = {"http": myproxy}
    >>> auth = HTTPProxyDigestAuth(myuser, mypass)
    >>> import requests 
    >>> r = requests.get(myurl, proxies=proxies, auth=auth)
    >>> r
    <Response [200]>
    
[/code]

となり、エラーもなく動かすことが出来ました。読んでいただいた皆様、ありがとうございました。


CC BY-SA 3.0
2015-05-27T13:24:19.343
10693
2015-05-29T07:03:57.823
2017-05-23T12:38:55.307
-1
2946
question
python
pythonのrequestsを用いてproxy越しのdigest認証をする方法について


このコードの作成当時は requests-1.0.0 でしたが、現在は 2.7.0 です。  
requests-1.0.0 （おそらく2.0未満）であれば動作すると思います。

あるいは、

[code]

    def handle_407(self, r):
    
[/code]

を

[code]

    def handle_407(self, r, **kwargs):
    
[/code]

に変えてみたら動作するかもしれません。


CC BY-SA 3.0
2015-05-27T14:21:49.737
10696
2015-05-27T14:21:49.737
806
10693
answer