2009-07-08 28 views
5

Mechanize (Python) está fallando con 401 para que yo abra las URL de digest de http. Busqué en Google y probé la depuración pero no tuve éxito.¿Puede python mecanizar el control HTTP auth?

Mi código es así.

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

¿Qué significa el fracaso? ¿Está fallando con un 403? Algún otro error o condición? – ars

+0

¿Está Trac configurado para verificar con autenticación HTTP? ¿O tienes que iniciar sesión en un formulario HTML simple? –

+1

Algo parece extraño: parece que está navegando hacia una página de inicio de sesión, que normalmente no se esperaba que estuviera protegida. Con la autenticación básica/resumida vas directamente al recurso protegido, proporcionando tus credenciales en los encabezados HTTP (que mechanize hace por ti, por supuesto). –

Respuesta

6

Mechanize afirma que los parámetros deben ser uri, nombre de usuario y contraseña como parámetros, pero tiene cuatro parámetros. Cuatro parámetros son correctos para urllib2.add_password, pero luego el primer parámetro debe ser el reino, no el uri.

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

que iba a tratar de cambiar eso en primer lugar.

¿Necesita trac require digest? si no es un próximo paso podría ser probar el uso de autenticación básica, como una prueba para ver si funciona, ya que se puede añadir que con sólo addHeader:

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

El último parámetro es opcional: reino, por defecto a Ninguno. –

+0

Ah, está bien. Nunca lo he visto, y los documentos no lo mencionan ... Pero, de todos modos, te llamó la atención el hecho de que solo abría la pantalla de inicio de sesión, por lo que de hecho no es un error de autenticación. –

+0

help -> add_password (self, url, user, password, realm = None) método de mechanize._mechanize.Browser instancia Segundo script similar usando Twill funciona bien. La tela cruzada a su vez usa solo mecanizar. – Shekhar

0

Dependiendo de la complejidad de su proyecto de automatización web es, considerar el uso de iMacros. A diferencia de Mechanize, se ejecuta en el navegador web, por lo que funciona con la mayoría de los sitios web desde el primer momento.

Utilizo tanto el complemento gratuito de Firefox a través de una línea de comando (en nuestro servidor Linux) como iMacros Scripting Edition a través de un objeto COM (en Windows VMware para sitios con Flash y Java).

línea de comandos (freeware & de código abierto): http://wiki.imacros.net/iMacros_for_Firefox#Command_Line_Support

objeto COM (versión de pago requerido): wiki.imacros.net/Python

Tim

+0

Interesante, sin embargo por el requisito, necesito algo ejecutado dentro del programa python existente. – Shekhar

+0

si va a conducir un navegador, use selenium/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

Esto no es para la autenticación http. Aquí es cuando la página en la que inicia sesión tiene un formulario en la página. La autenticación Http no tiene un formulario – bluerubez

3

Para la autenticación HTTP con mecanizar debe proporcionar la URL completa al método add_password y no solo a la dirección base del 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

. Para referencia de otros, esto ha cambiado o no parece ser el caso. Proporcionar 'baseurl' en esta instancia, al menos para mechanize 0.3.3, parece dar como resultado que todas las URL comiencen con esa base exacta usando las credenciales especificadas. – kungphu

Cuestiones relacionadas