2009-07-08 20 views
5

Mechanize (Python) non riesce con 401 per me per aprire gli URL di digest http. Ho cercato su google e provato il debug ma non ho avuto successo.Python mechanize può gestire l'autenticazione HTTP?

Il mio codice è simile a questo.

import mechanize 

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

Cosa vuol dire? Sta fallendo con un 403? Qualche altro errore o condizione? – ars

+0

È configurato Trac per verificare con l'autenticazione HTTP? O devi effettuare il login su un semplice modulo HTML? –

+1

Qualcosa sembra strano: sembra che tu stia navigando verso una pagina di accesso, che normalmente non ci si aspetterebbe di essere protetta. Con l'autenticazione basic/digest vai direttamente alla risorsa protetta, fornendo le tue credenziali nelle intestazioni HTTP (che la meccanizzazione fa per te, ovviamente). –

risposta

6

Mechanize afferma che i parametri dovrebbero essere uri, nome utente e password come parametri, ma si hanno quattro parametri. Quattro parametri sono corretti per urllib2.add_password, ma il primo parametro dovrebbe essere il regno, non l'uri.

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

mi piacerebbe provare a cambiare la situazione prima.

Il trac richiede la digestione? se non un passo successivo potrebbe essere quello di provare a utilizzare autenticazione di base, come un test per vedere se funziona, dato che è possibile aggiungere che con appena AddHeader:

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

L'ultimo parametro è facoltativo: realm, per impostazione predefinita su Nessuno. –

+0

Ah, OK. Non l'ho mai visto e i documenti non lo menzionano ... Ma comunque, hai notato che stava solo aprendo la schermata di accesso, quindi questo non è affatto un errore di autenticazione. –

+0

help -> add_password (self, url, user, password, realm = None) metodo di mechanize._mechanize.Browser instance In secondo luogo, uno script simile con Twill funziona bene. Twill a turno usa solo meccanizzazione. – Shekhar

0

seconda della complessità del progetto di automazione web è, considerare l'utilizzo di iMacros. A differenza di Mechanize, viene eseguito nel browser Web, quindi funziona con la maggior parte dei siti web immediatamente.

Uso sia l'addon gratuito di Firefox tramite una riga di comando (sul nostro server Linux) e l'iMacros Scripting Edition tramite oggetto COM (su un VMware Windows per siti con Flash e Java).

da linea di comando (freeware & open source): http://wiki.imacros.net/iMacros_for_Firefox#Command_Line_Support

oggetto COM (versione a pagamento richiesto): wiki.imacros.net/Python

Tim

+0

Interessante, tuttavia per il requisito, ho bisogno di qualcosa eseguito all'interno del programma python esistente. – Shekhar

+0

se si sta guidando un browser, utilizzare selenio/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

Questo non è per l'autenticazione http. Questo è quando la pagina in cui stai effettuando l'accesso ha un modulo sulla pagina. L'autenticazione Http non ha un modulo – bluerubez

3

per l'autenticazione HTTP con Mechanize è necessario fornire l'url completo al metodo add_password e non solo l'indirizzo di base dell'host.

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

Per il riferimento altrui, questo è cambiato o non sembra essere il caso. Fornendo 'baseurl' in questa istanza, almeno per mechanize 0.3.3, sembra che tutti gli URL inizino con quel baseurl esatto usando le credenziali specificate. – kungphu

Problemi correlati