[Python] Enviar un dato a traves de un input HTML

Iniciado por Kasswed, 19 Agosto 2009, 13:52 PM

0 Miembros y 1 Visitante están viendo este tema.

Kasswed

Hola.

Necesito hacer en python lo siguiente:

Tengo un archivo HTML con diversos inputs, y necesito rellenar uno de esos inputs y darle al boton de enviar. Para todo ello necesito estar logueado, creo que ya consigo hacer el login, pero no consigo hacer lo del input.

Alguna sugerencia?
"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.

6666

#1
Bueno no tengo ni idea de python pero mira:

import urllib2_file
import urllib2

data = {'name': 'value',
        'file':  open('/etc/services')
       }
urllib2.urlopen('http://site.com/script_upload.php', data)


Ahi se envia por metodo post la info a un upload y los input serian "name" y "file" con sus respectivos valores.

lo que puedes hacer es .. ver como se loguea .. crear una funcion logear() o algo asi .. y  luego hacer otra funcion con lo que quieres hacer.

además ese code es muy facil de entender y modificar .. un poco más de info:



Python, web forms and cookies:
http://therning.org/magnus/archives/270


Novlucker

#2
Buenas

Básicamente lo que te ha dicho l0ve debería de servir, con urlopen de urllib2 puedes hacer el envío de los datos, a esta función debes de pasarle la url base y los parámetros que siguen (los tomas del formulario)

Eso si .. ten en cuenta 1 cosa ... antes del envío de los datos debes de convertir la url (parámetros) al formato correcto, para lo cual puedes hacer uso de urlencode de urllib, a esta solo debes de pasar tuplas de datos (clave/variable - valor), y te devuelve una cadena con la url "armada" :P

Código (python) [Seleccionar]
camposform = urllib.urlencode({"usuario":"Kasswed","contraseña":"mipass","lang":"es"})

Continuando con el primer ejemplo que te han dejado sería como codificar data

Saludos

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Kasswed

Gracias por la ayuda pero no me ha funcionado.

Un ejemplo de uso seria, por ejemplo, la web www.meneame.net

La pagina de login es:

http://meneame.net/login.php

Y luego el input a rellenar seria el de:

http://meneame.net/sneak.php

Lo estoy probando con esta web y nada.

Alguna idea?

Mirad mi codigo:

Código (python) [Seleccionar]
import urllib, urllib2, cookielib, ClientForm

username = 'Kasswed'
password = 'm3tronch0yBerroncho'

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

login_data = urllib.urlencode({"username":username,"password":password})

urllib2.urlopen('http://meneame.net/login.php', login_data)

mensaje = urllib.urlencode({"comment": "hallo"})
urllib2.urlopen('http://meneame.net/sneak.php', mensaje)
"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.

Novlucker

#4
Que versión de Python tienes? yo estoy probando ahora en la 3 ... la verdad que hay muchas cosas que no he tocado luego de migrar .. y es lindo cuando ves que le han hecho tantos cambios ... sobre todo cuando la mitad de las cosas ya no funcionan, ni los import, ni las funciones :¬¬ (por ejemplo ya no existe urllib2)

He creado un código pero es bastante diferente al tuyo y no lo puedo probar correctamente porque hasta dentro de 2 hrs no puedo comentar (me acabo de crear una cuenta a modo de prueba en meneame), además de que no estoy en mi pc y acabo de meterle python a esta donde estoy

Pero eso si ..he visto algo que al menos a mi me causaba problemas en el login .. si revisas justamente el login que tienes actualmente verás que la web de menéame no devuelve nada como respuesta al ingreso de usuario y pass, ni que esta bien, ni que esta mal, simplemente recarga la web (esto lo he visto con read()).

El problema en esto esta en que revisando el formulario de autentificación veo dos parametros más ... processlogin=1 y return="", así que deberías de pasarlos también

Código (python) [Seleccionar]
import urllib, urllib2, cookielib, ClientForm

username = 'Kasswed'
password = 'm3tronch0yBerroncho'

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
urllib2.install_opener(opener)

login_data = urllib.urlencode({"username":username,"password":password,"processlogin":"1","return":""})

opener.open('http://meneame.net/login.php', login_data)

mensaje = urllib.urlencode({"comment": "hallo"})
opener.open('http://meneame.net/sneak.php', mensaje)

Así si debería de ir :D .. igual si te fijas verás que además de la linea de login_data le he hecho un par de cambios más;


  • La cookie no es necesaria referenciarla, ya que se crea sola (salvo que quieras utilizarla para otra cosa o definir tu propia cookie) y el HTTPCookieProcessor se encarga de lo demás
  • Se establece el openerdirectory por defecto por medio de install_opener, para utilizar el mismo opener/cookies en respectivos request (así no se pierde la cookie)
  • Se utiliza la referencia al opener y la función open, en lugar de urllib2.urlopen, ya que al igual que antes, trabajamos con la referencia y cookies almacenadas.

Obviamente prueba primero con tu code simplemente modificando los parámetros del login .. y si no sirve prueba con este segundo (el cual no esta probado por lo comentado antes)

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Kasswed

#5
Muchísimas gracias, mañana lo pruebo ya que en la máquina donde estoy no tengo python ni nada.

Editaré el post con los resultados que obtenga, de nuevo, gracias!

PD: Uso la versión 2 de python!
"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.

Kasswed

"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.

Jubjub

Cambia el user agent, muchas veces las paginas bloquean a los user angets de la urllib y curl, y demas hierbas :D
Jugando con Fósforoshacking con un tono diferente


.
porno

Novlucker

XD ... pero creo que ahora esta bien y el problema lo tienes en otro lado :-X

Llegas a logarte? ... prueba modificando un poco el script aquí...

Código (python) [Seleccionar]
respuesta = opener.open('http://meneame.net/login.php', login_data)
print(respuesta.read())


Esto para verificar lo que imprime .. y si corresponde con lo que debería de salir luego de logarte, para que sea más gráfico sin que tengas que ponerte a programar algo más, puedes comentar las líneas siguientes (las que están después de las que he puesto antes) y directamente redireccionar la salida del script a un html

Código (dos) [Seleccionar]
python.exe elscript.py > print.html

Si esto funciona .. entonces el script sirve ... solo que seguimos con los problemas de los parámetros a la hora de publicar un mensaje XD
De donde salió esa url sneak.php? porque no doy con ella :-\ ... y por otra parte a la hora de comentar una noticia tengo varias cosas que pasarle para poder publicarla, ej:




Además como se ve si tendrás que referencias la cookie, ya que necesitas leer su contenido para obtener el user_id, además necesitas identificar el id de la noticia, etc

En definitiva, que el problema puede que sea otro y no necesariamente el script, ya que en este tipo de "programas" el problema es justamente el identificar todos los campos/parámetros que hay que pasar, además de como obtener o generar estos :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Kasswed

No no, lo de publicar la noticia ya es demasiado avanzado xD

Yo quiero comentar aquí:

http://meneame.net/sneak.php

Es como un chat.

Probaré lo que dices, pero ya te digo que no hay forma.

Gracias de nuevo!
"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.