2010-11-19 22 views
5

Estoy intentando iniciar sesión en un sitio web utilizando Python y Mechanize, sin embargo, tengo problemas al intentar que los datos POST se comporten como yo quiero.Python mecanize iniciar sesión en el sitio web

Esencialmente Quiero replicar esto utilizando mecanizar y Python:

wget --quiet --save-cookies cookiejar --keep-session-cookies --post-data "action=login&login_nick=USERNAME&login_pwd=PASSWORD" -O outfile.htm http://domain.com/index.php 

El formulario se ve así:

<login POST http://domain.com/index.php application/x-www-form-urlencoded 
    <TextControl(login_nick=USERNAME)> 
    <PasswordControl(login_pwd=PASSWORD)> 
    <CheckboxControl(login_auto=[1])> 
    <SubmitButtonControl(<None>=) (readonly)>> 

Configuración de los valores apropiados y enviar el formulario no es un problema, pero eso deja fuera la "acción = inicio de sesión" - parte.

response = self.browser.open(self.url+"/index.php") 
self.browser.select_form(name="login") 

self.browser["login_nick"] = self.encoded_username 
self.browser["login_pwd"] = self.encoded_password 

self.browser.method = "POST" 

response = self.browser.open(self.browser.submit()) 

print (response.read()) 

Ahora la pregunta es, ¿cómo puedo añadir la parte action=login?

EDIT: Bueno, por lo que añade un campo oculto llamado acción y establezca el valor de inicio de sesión . Al analizar la secuencia TCP con Wireshark, los datos POST están estructurados de la manera que deberían. Sin embargo, parece que mecanizar está jugando con mi urlencoding (ya he codificado los valores específicamente para el juego de caracteres que usa el sitio web). Por ejemplo, mi nombre de usuario contiene un Å - que he urlencoded a% C5. Sin embargo, cuando se envía con mecanizar, se muestra como% 25C5. ¿Cómo impido que mechanize cambie las cadenas?

EDIT: Me di cuenta de que en lugar de luchar con el mecanizado, podía simplemente no urlencode mis cadenas antes de enviarlas. Caso cerrado.

+0

En lugar de editar su pregunta y agregar la respuesta al cuerpo de la pregunta, debe publicar una respuesta a su pregunta y luego aceptarla. Es más * natural * de esta manera. – Felix

+2

Lo hice. Simplemente no puedo aceptarlo por otros 2 días. –

Respuesta

8

Mechanize parece urlencode las cuerdas de todos modos, por lo que no tiene sentido luchar contra ella. Esta es la solución final (obviamente no es sintácticamente válida, pero espero que entiendas la idea).

import mechanize 

self.browser = mechanize.Browser() 
self.browser.open(self.url) 
self.browser.select_form(name="login") 

self.browser["login_nick"] = self.username 
self.browser["login_pwd"] = self.password 
self.browser.new_control("HIDDEN", "action", {}) 
control = self.browser.form.find_control("action") 
control.readonly = False 
self.browser["action"] = "login" 
self.browser.method = "POST" 
self.browser.action = self.url 

response = self.browser.submit() 
Cuestiones relacionadas