4 Stimmen

Benutzerdefinierter Authentifizierungs-Handler mit Mechanize

Ich möchte python-ntlm mit mechanize.Browser() verwenden. Ich habe HTTPNtlmAuthHandler mit urllib2 und mechanize.urlopen() zum Laufen gebracht und versucht, es mit Browser() zu verwenden, aber es funktioniert nicht.

Hier ist der Code, den ich für urlopen verwende

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)

Nachverfolgung wie angefordert

harrisony@lithium:~$ python sitefoo.py 
now running mechanize.urlopen
>

now running mechanize.Browser then br.open
Traceback (most recent call last):
  File "sitescreaper.py", line 21, in 
    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

1voto

remmargorp Punkte 11

Es gibt möglicherweise bessere Optionen, aber der einzige Weg, den ich gefunden habe, um es zum Laufen zu bringen, war das Entfernen des HTTPRobotRulesProcessor-Handlers, der irgendwie verhinderte, dass der HTTPNtlmAuthHandler aufgerufen wurde.

Hinweis: Der folgende Code entfernt auch den ProxyHandler, um den Proxy-Server zu umgehen - entfernen Sie ihn, wenn zutreffend.

passman = mechanize.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, baseurl, benutzer, passwort)
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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X