2014-09-19 1 views
1

내가 사용하고 다음 -항상 HTTP 407 : 프록시 인증이 필요합니까?

Traceback (most recent call last): 
    File ".\proxy.py", line 8, in <module> 
    conn = req.urlopen('http://google.com') 
    File "D:\Python34\lib\urllib\request.py", line 153, in urlopen 
    return opener.open(url, data, timeout) 
    File "D:\Python34\lib\urllib\request.py", line 461, in open 
    response = meth(req, response) 
    File "D:\Python34\lib\urllib\request.py", line 571, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "D:\Python34\lib\urllib\request.py", line 499, in error 
    return self._call_chain(*args) 
    File "D:\Python34\lib\urllib\request.py", line 433, in _call_chain 
    result = func(*args) 
    File "D:\Python34\lib\urllib\request.py", line 579, in http_error_default 
    raise HTTPError(req.full_url, code, msg, hdrs, fp) 
urllib.error.HTTPError: HTTP Error 407: Proxy Authentication Required 

이 난 항상 407: Proxy Authentication Required 받고 있어요 어떻게해야 간단한에도 불구하고 - 여기

import urllib.request as req 

proxy = req.ProxyHandler({'http': r'http://USER:[email protected]:PORT'}) 
auth = req.HTTPBasicAuthHandler() 
opener = req.build_opener(proxy, auth, req.HTTPHandler) 
req.install_opener(opener) 
conn = req.urlopen('http://google.com') 
return_str = conn.read() 

것은 내 역 추적입니다. 나는이 문제에 관해 너무 많은 질문을했지만 그 답을 찾을 수는 없습니다. urllib이 내 자격 증명을 전혀 통과하지 않는 것처럼 보입니다. 가짜 암호를 넣을 수는 있지만 자격 증명이 잘못되었다는 메시지가 반환되지 않습니다.

무엇이 누락 되었습니까?

답변

2

대부분의 경우 프록시는 URL에 포함 된 사용자 이름과 암호를 허용하지 않습니다. ProxyHandler은 URL에서 자동으로 제거하지 않고 인증에 사용합니다. 그래서, 당신은 프록시가 원하는 어떤 유형의 인증을보고 사용할 필요가 ProxyBasicAuthHandler 또는 ProxyDigestAuthHandler

당신이 Examples 보면, 8 일에는이 작업을 수행하는 방법을 보여줍니다

proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'}) 
proxy_auth_handler = urllib.request.ProxyBasicAuthHandler() 
proxy_auth_handler.add_password('realm', 'host', 'username', 'password') 

opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler) 
# This time, rather than install the OpenerDirector, we use it directly: 
opener.open('http://www.example.com/login.html') 
+0

그거 알아? 나는'realm'을'None'으로 설정하여 그것을 시도했고, 모두 돌아 왔을 때'AbstractBasicAuthHandler는 'NEGOTIATE'라는 스키마를 지원하지 않습니다. –

+0

@ user3238014 : 글쎄, 프록시가 코드를 작성하기 전에 인증 방법을 알아 내야합니다. 시행 착오를 통해이 작업을 수행 할 수 있습니다. 브라우저의 구성을 살펴보고 프록시의 구성을보고 브라우저와 프록시 간 트래픽을 관찰하여 의미를 이해합니다.하지만 어떻게 든해야합니다. – abarnert

-1

다음은 urllib 사용 예입니다.

from urllib import * 

proxy = urllib.request.ProxyHandler({'http': 'http://username:[email protected]_host:proxy_port'}) 
auth = urllib.request.HTTPBasicAuthHandler() 
opener = urllib.build_opener(proxy, auth, urllib.request.HTTPHandler) 
urllib.install_opener(opener) 

conn = urllib.urlopen('http://python.org') 
return_str = conn.read()