1. 程式人生 > >Python 通過ISA 代理訪問網際網路報錯 HTTP Error 407

Python 通過ISA 代理訪問網際網路報錯 HTTP Error 407

urllib2.HTTPError: HTTP Error 407: Proxy Authentication Required ( The ISA Server requires authorization to fulfill the request. Access to the Web Proxy service is denied.  )

程式碼如下:

#!/python
# coding = utf-8  
from urllib import urlencode
import cookielib, urllib2

webURL = "http://www.google.com"

# prepare the cookie
cj = cookielib.LWPCookieJar();
cookie_support = urllib2.HTTPCookieProcessor(cj)


# set the proxy server
proxy_info = {
              'user' : 'scmroad',
              'pass' : 'pass',
              'host' : '192.168.1.101',
              'port' :  9876
              }
proxy_support = urllib2 . ProxyHandler ( {'http':\
                                          'http://%(user)s:%(pass)
[email protected]
%(host)s:%(port)d' % proxy_info}) # construct the opener opener = urllib2. build_opener(cookie_support, proxy_support) urllib2.install_opener(opener) page = urllib2.urlopen(webURL) print page.read(1000) page.close()


出錯資訊如下:
C:\script\webpy>python test.py
Traceback (most recent call last):


  File "test.py", line 27, in <module>
    page = urllib2.urlopen(webURL)
  File "C:\Python27\lib\urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\Python27\lib\urllib2.py", line 398, in open
    response = meth(req, response)
  File "C:\Python27\lib\urllib2.py", line 511, in http_response

    'http', request, response, code, msg, hdrs)
  File "C:\Python27\lib\urllib2.py", line 436, in error
    return self._call_chain(*args)
  File "C:\Python27\lib\urllib2.py", line 370, in _call_chain
    result = func(*args)
  File "C:\Python27\lib\urllib2.py", line 519, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 407: Proxy Authentication Required ( The ISA Server requires authorization to fulfill the request. Access to the Web Proxy service is denied.  )
C:\script\webpy>

python urllib2 代理無效分析-NTLM

查了許久用urllib2通過代理訪問網路的貼子,也寫了測試程式碼,但是一直failed.Error Code: 407 Proxy Authentication Required. The ISA Server requires authorization to fulfill the request. Access to the Web Proxy filter is denied. (12209)
最後打算放棄用變通的方法現實現.
用curl庫,網上找了下有對應python的介面----(pycurl)
馬上down下,安裝測試
測試code:

#coding=utf-8

import pycurl
c = pycurl.Curl()
c.setopt(pycurl.URL, 'http://www.ifeng.com')
import StringIO
b = StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.setopt(pycurl.FOLLOWLOCATION, 1)
c.setopt(pycurl.MAXREDIRS, 5)
c.setopt(pycurl.PROXY, 'http://10.10.10.10:8080')
c.setopt(pycurl.PROXYUSERPWD, 'username:password')
c.perform()
print b.getvalue()


得到的結果還是:Error Code: 407 Proxy Authentication Required.
突然想起公司的OA都要加入域用代理才能上網。
又google下,搜到以下東東:

NTLM 身份驗證
在網路環境中,NTLM (NT LAN Manager)用作身份驗證協議以處理兩臺計算機(其中至少有一臺計算機執行 Windows NT 4.0 或更早版本)之間的事務。具有此配置的網路稱為“混合模式”,這是 Windows Server 2003 家族中的預設設定。
例如,以下配置將使用 NTLM 作為身份驗證機制:
Windows 2000 或 Windows XP Professional 客戶端向 Windows NT 4.0 的域控制器驗證身份。
Windows NT 4.0 Workstation 客戶端向 Windows 2000 或 Windows Server 2003 域控制器驗證身份。
Windows NT 4.0 Workstation 客戶端向 Windows NT 4.0 域控制器驗證身份。
Windows NT 4.0 域中的使用者向 Windows 2000 或執行 Windows Server 2003 家族的域驗證身份。
執行向任何域控制器驗證身份的 Windows 95、Windows 98 或 Windows Millennium Edition 的客戶端。
另外,NTLM 是為沒有加入到域中的計算機(如獨立伺服器和工作組)提供的身份驗證協議。


分析後加上:c.setopt(pycurl.PROXYAUTH, pycurl.HTTPAUTH_NTLM)。功能OK。真是曲折啊。
不過還有其它好多認證方式,以後用代理不行,可以換個方向用其它認證試試。