2009-07-08 5 views
5

Mechanize (Python) schlägt bei 401 fehl, um http-Digest-URLs zu öffnen. Ich googelte und versuchte Debugging, aber keinen Erfolg.Kann python mechanize HTTP Auth behandeln?

Mein Code sieht so aus.

+0

Was bedeutet Fehler? Scheitert es mit einem 403? Irgendein anderer Fehler oder Zustand? – ars

+0

Ist trac für die Überprüfung mit HTTP-Authentifizierung konfiguriert? Oder müssen Sie sich über ein einfaches HTML-Formular anmelden? –

+1

Etwas sieht merkwürdig aus - Sie scheinen zu einer Anmeldeseite zu navigieren, die normalerweise nicht geschützt wäre. Mit basic/digest auth gehen Sie direkt zur geschützten Ressource und stellen Ihre Anmeldeinformationen in den HTTP-Headern zur Verfügung (was für Sie natürlich mechanisiert ist). –

Antwort

6

Mechanize behauptet, dass die Parameter uri, Benutzername und Passwort als Parameter sein sollten, aber Sie haben vier Parameter. Vier Parameter sind für urllib2.add_password korrekt, aber dann sollte der erste Parameter der Bereich sein, nicht der uri.

http://wwwsearch.sourceforge.net/mechanize/

Ich würde versuchen, die zuerst zu ändern.

Muss trac verdauen? wenn nicht in einem nächsten Schritt mit grundlegenden Auth, als Test sein könnte, um zu versuchen, um zu sehen, ob das funktioniert, da Sie, dass mit nur addHeader hinzufügen:

import base64 
from mechanize import Browser 
browser = Browser() 
browser.addheaders.append(('Authorization', 'Basic %s' % base64.encodestring('%s:%s' % (user, pwd)))) 
+0

Der letzte Parameter ist optional: realm, Standardwert ist None. –

+0

Ah, OK. Niemals gesehen, und Docs erwähnt es nicht ... Aber sowieso, Sie haben die Tatsache gefangen, dass er nur den Anmeldebildschirm öffnete, also ist dies in der Tat kein Authentifizierungsfehler überhaupt. –

+0

Hilfe -> add_password (self, URL, Benutzer, Passwort, Realm = None) Methode der mechanize._mechanize.Browser Instanz Zweitens ähnlich Skript mit Twill funktioniert gut. Twill wiederum verwendet nur Mechanisieren. – Shekhar

0

Je nachdem, wie komplex Ihr Web-Automatisierungsprojekt ist, sollten Sie mit iMacros. Im Gegensatz zu Mechanize läuft es im Webbrowser, so dass es mit den meisten Websites sofort funktioniert.

Ich benutze sowohl das kostenlose Firefox Addon über eine Kommandozeile (auf unserem Linux Server) als auch die iMacros Scripting Edition via COM Objekt (auf einem Windows VMware für Sites mit Flash und Java).

Befehlszeile (Freeware & Open Source): http://wiki.imacros.net/iMacros_for_Firefox#Command_Line_Support

COM-Objekt (Vollversion erforderlich): wiki.imacros.net/Python

Tim

+0

Interessant, aber durch die Anforderung, ich brauche etwas innerhalb des bestehenden Python-Programm ausgeführt. – Shekhar

+0

Wenn Sie einen Browser steuern möchten, verwenden Sie selen/webdriver –

1
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import mechanize 

a=mechanize.Browser() 
a.open("http://www.facebook.com/login.php") 
a.select_form(nr=0) #form number. 
a["email"]="mailaddress" 
a["pass"]="password" 
a.submit() 
print a 
+1

Dies ist nicht für http-Authentifizierung. Dies ist der Fall, wenn die Seite, an der Sie sich anmelden, ein Formular auf der Seite enthält. Die Http-Authentifizierung hat kein Formular – bluerubez

3

Für HTTP-Authentifizierung mit mechanize Sie müssen die vollständige URL der add_password-Methode und nicht nur der Host-Basisadresse angeben.

import mechanize 

project = "test" 
baseurl = "http://trac.somewhere.net" 
loginurl = "%s/%s/login" % (baseurl, project) 
b = mechanize.Browser() 
b.add_password(loginurl, "user", "secret", "some Realm") 
b.open(loginurl) 
+0

Für die Referenz von anderen hat sich das geändert oder scheint nicht der Fall zu sein. Die Bereitstellung von "baseurl" in diesem Fall, zumindest für mechanize 0.3.3, führt dazu, dass alle URLs, die mit dieser exakten Basis beginnen, die angegebenen Anmeldeinformationen verwenden. – kungphu