2010-01-28 1 views
4

Я хотел бы использовать python-ntlm с mechanize.Browser() У меня HTTPNtlmAuthHandler работы с urllib2 и mechanize.urlopen() и пытался использовать его с браузером(), но он не работаетпользовательский обработчик аутентификации с Mechanize

Вот код, я использую для urlopen

passman = mechanize.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, url, user, password) 
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman) 

opener = mechanize.build_opener(auth_NTLM) 
mechanize.install_opener(opener) 
mechanize.urlopen(baseurl) 

TraceBack по просьбе

[email protected]:~$ python sitefoo.py 
now running mechanize.urlopen 
<addinfourl at 169181868 whose fp = <httplib.HTTPResponse instance at 0xa15858c>> 


now running mechanize.Browser then br.open 
Traceback (most recent call last): 
    File "sitescreaper.py", line 21, in <module> 
    br.open(baseurl) 
    File "/usr/lib/python2.6/dist-packages/mechanize/_mechanize.py", line 209, in open 
    return self._mech_open(url, data, timeout=timeout) 
    File "/usr/lib/python2.6/dist-packages/mechanize/_mechanize.py", line 261, in _mech_open 
    raise response 
mechanize._response.httperror_seek_wrapper: HTTP Error 401: Unauthorized 
+0

У вас есть ошибка? Если да, добавьте трассировку исключения в свой вопрос. – codeape

ответ

1

Могут быть лучшие варианты, но единственный способ заставить его работать - удалить обработчик HTTPRobotRulesProcessor, который каким-то образом препятствовал вызову HTTPNtlmAuthHandler.

Примечание: Следующий код также удаляет ProxyHandler, чтобы обойти прокси-сервер - удалите, если применимо.

passman = mechanize.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, baseurl, user, password) 
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman) 

browser = mechanize.Browser() 
browser.add_handler(auth_NTLM) 

handlersToKeep = [] 
for handler in browser.handlers: 
    if not isinstance(handler, (mechanize._auth.ProxyHandler, 
           mechanize._urllib2_support.HTTPRobotRulesProcessor)): 
     handlersToKeep.append(handler) 
browser.handlers = handlersToKeep 

browser.open(url)