Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Kasswed en 19 Agosto 2009, 13:52 pm



Título: [Python] Enviar un dato a traves de un input HTML
Publicado por: Kasswed en 19 Agosto 2009, 13:52 pm
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?


Título: Re: [Python] Enviar un dato a traves de un input HTML
Publicado por: 6666 en 19 Agosto 2009, 14:09 pm
Bueno no tengo ni idea de python pero mira:

Código:
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 (http://therning.org/magnus/archives/270)



Título: Re: [Python] Enviar un dato a traves de un input HTML
Publicado por: Novlucker en 19 Agosto 2009, 15:48 pm
Buenas

Básicamente lo que te ha dicho l0ve debería de servir, con urlopen (http://docs.python.org/library/urllib2.html) 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 (http://docs.python.org/library/urllib.html#urllib.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
  1. 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



Título: Re: [Python] Enviar un dato a traves de un input HTML
Publicado por: Kasswed en 20 Agosto 2009, 08:49 am
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
  1. import urllib, urllib2, cookielib, ClientForm
  2.  
  3. username = 'Kasswed'
  4. password = 'm3tronch0yBerroncho'
  5.  
  6. cj = cookielib.CookieJar()
  7. opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
  8.  
  9. login_data = urllib.urlencode({"username":username,"password":password})
  10.  
  11. urllib2.urlopen('http://meneame.net/login.php', login_data)
  12.  
  13. mensaje = urllib.urlencode({"comment": "hallo"})
  14. urllib2.urlopen('http://meneame.net/sneak.php', mensaje)


Título: Re: [Python] Enviar un dato a traves de un input HTML
Publicado por: Novlucker en 20 Agosto 2009, 15:45 pm
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
  1. import urllib, urllib2, cookielib, ClientForm
  2.  
  3. username = 'Kasswed'
  4. password = 'm3tronch0yBerroncho'
  5.  
  6. opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
  7. urllib2.install_opener(opener)
  8.  
  9. login_data = urllib.urlencode({"username":username,"password":password,"processlogin":"1","return":""})
  10.  
  11. opener.open('http://meneame.net/login.php', login_data)
  12.  
  13. mensaje = urllib.urlencode({"comment": "hallo"})
  14. 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


Título: Re: [Python] Enviar un dato a traves de un input HTML
Publicado por: Kasswed en 20 Agosto 2009, 15:56 pm
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!


Título: Re: [Python] Enviar un dato a traves de un input HTML
Publicado por: Kasswed en 21 Agosto 2009, 08:22 am
Nada, no funciona :(

Algun dia podremos... xD


Título: Re: [Python] Enviar un dato a traves de un input HTML
Publicado por: Jubjub en 21 Agosto 2009, 10:52 am
Cambia el user agent, muchas veces las paginas bloquean a los user angets de la urllib y curl, y demas hierbas :D


Título: Re: [Python] Enviar un dato a traves de un input HTML
Publicado por: Novlucker en 21 Agosto 2009, 14:06 pm
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
  1. respuesta = opener.open('http://meneame.net/login.php', login_data)
  2. 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
  1. 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:

(http://s3.subirimagenes.com:81/imagen/3075280temp.png)


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


Título: Re: [Python] Enviar un dato a traves de un input HTML
Publicado por: Kasswed en 21 Agosto 2009, 15:38 pm
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!


Título: Re: [Python] Enviar un dato a traves de un input HTML
Publicado por: Novlucker en 21 Agosto 2009, 16:36 pm
Ahora si veo donde quieres publicar, pero igual sigue siendo NO muy sencillo XD

Como imaginaba tienes varios campos más, y además el comentario tiene otro nombre:

(http://s3.subirimagenes.com:81/imagen/3075724tamp2.png)


Hay un par de variables identificables (el friends no es necesario para publicar en el principal), pero habría que ver de donde salen las otras

Yo que tu (al igual que yo) le meto Tamper Data (https://addons.mozilla.org/en-US/firefox/addon/966) al mozilla (si ya no lo tienes)... y a hacer pruebas :P

Saludos


Título: Re: [Python] Enviar un dato a traves de un input HTML
Publicado por: Kasswed en 21 Agosto 2009, 21:51 pm
Buag esto es imposible, he probao de to y nada xD

Ya si eso lo sigo mirando el año que viene, esto ha podido conmigo xD


Título: Re: [Python] Enviar un dato a traves de un input HTML
Publicado por: Novlucker en 22 Agosto 2009, 00:01 am
Pero al final llegaste al login?

Citar
Ya si eso lo sigo mirando el año que viene, esto ha podido conmigo xD
Entonces yo me voy a pelear con eso, no puede ser! a algo tengo que llegar, no puede ser que sea ten complicado :P

[Edito]
He estado revisando y los parámetros que comentaba antes se encuentran incrustados en la página (son generados con ‫javascript):

Código
  1. //<![CDATA[
  2. var my_version = '3';
  3. var ts=1250902917; // just due a freaking IE cache problem
  4. var server_name = 'meneame.net';
  5. var sneak_base_url = 'http://'+'meneame.net/'+'backend/sneaker.php';
  6. var mykey = 477;

Y efectivamente son esos los datos que son pasados en el post

Código
  1. function get_data() {
  2. abort_request();
  3. var options = get_options_obj();
  4. options.k=mykey;
  5. options.time=ts;
  6. options.v=my_version;
  7. options.r=total_requests;
  8. var date_object = new Date();
  9. ping_start = date_object.getTime();
  10. if(comment.length > 0) {
  11. options.chat = comment;
  12. xmlhttp=$.post(sneak_base_url, options, received_data);
  13. comment = '';
  14. } else {
  15. xmlhttp=$.get(sneak_base_url, options, received_data);
  16. }
  17. requests++;
  18. total_requests++;
  19. return false;
  20. }

Pero por más que intento no puedo enviar un mensaje sin necesidad de utilizar el inputbox :¬¬

Saludos