elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Python] Enviar peticiones POST a sitios Webs. - JaAViEr (0x5d)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Python] Enviar peticiones POST a sitios Webs. - JaAViEr (0x5d)  (Leído 3,159 veces)
0x5d

Desconectado Desconectado

Mensajes: 241



Ver Perfil WWW
[Python] Enviar peticiones POST a sitios Webs. - JaAViEr (0x5d)
« en: 24 Enero 2012, 19:53 pm »

Hola, muy buenos días a todos !
 En esta mini guía o vengo a explicar una cosa sencilla de Python, pero que muy pocos utilizan. Me refiero a enviar datos mediante la petición POST.
Primero que nada, quiero mostrar las diferentes formas de llevar a cabo estas peticiones, una de ellas, es mediante la librería "httplib", la otra es mediante la librería urllib o urllib2.

Una ventaja aparente que veo yo al utilizar la librería httplib, es que podemos manejar los códigos de error que nos devuelven las peticiones que hagamos. Por si no manejan dichos códigos de error, acá les dejo un listado de los principales :
  • 200 : OK, documento entregado correctamente.
  • 202 : Aceptada, pero la petición no es completada con éxito.
  • 204 : Sin contenido.
  • 301 : Movido permanentemente.
  • 302 : Movido Temporalmente.
  • 304 : No modificado.
  • 401 : No autorizado.
  • 403 : Prohibido, el conocido Forbidden
  • 404 : No encontrado.
  • 500 : Error interno.
  • 501 : No implementado.
Bueno, volviendo al tema... Para enviar una petición POST, debemos saber la URL a la que deseamos enviar los datos, eso es bastante fácil, ya que generalmente solo debemos mirar el código de fuente y buscar <form ... y ubicar el action="ACÁ LA URL". Una vez encontrado ello, debemos saber que datos tenemos que enviarle a la URL, para ello deberás buscar los <input type="text" o type="hidden".

  Ahora, si no te quieres complicar la vida buscando en el código de fuente, puedes usar otra herramienta proporcionada por mi, que detecta formulario y campos a enviar mediante el POST:
Código
  1. # -*- coding: utf-8 -*-
  2. # Autor: JaAViEr (0x5d)
  3. # Twitter: 0x5d
  4. import re,urllib,sys
  5. try:
  6.  var = urllib.urlopen(raw_input("URL ::> ")).read()
  7. except:
  8.  print "No es posible conectar..."
  9.  sys.exit(1)
  10. url_enviar=""
  11. for url in re.findall("<form (.*)>",var):
  12.  if "action" in url.lower():
  13.    for web in url.split():
  14.      if re.findall("action=(.*)",web):
  15.        url_enviar=web.replace("action=","")
  16. url_enviar = url_enviar.replace("\"","")
  17. datos_r = []
  18. for campos in re.findall("<input (.*)>",var):
  19.  if "name" in campos.lower():
  20.    for cam in campos.split():
  21.      if re.findall("name=(.*)",cam):
  22.        datos_r.append(cam.replace('"',""))
  23. print "URL a enviar POST:",url_enviar.replace(">","")
  24. print "Campos Detectados:"
  25. for s in datos_r:
  26.  print s.replace("name=","")
  Solo basta con ingresar la URL para saber a que URL apunta el formulario & los datos que tenemos que enviar, podría ser buena herramienta para esta ocasión.

  Ahora que ya tenemos todos nuestros datos necesarios y fundamentales, manos a la obra !
  Veamos que tal nos va con el famoso httplib y urllib para poder codificar los datos y que el navegador los comprenda, primero los importamos:
Código
  1. import httplib, urllib
Para poder crear una conexión utilizamos:
Código
  1. parametros = urllib.urlencode({'campo1': 'valor uno','campo2':'valor2'})
En este caso, estamos enviando campo1 con el valor: valor uno y campo2 con el valor: valor2
Y Bueno, necesitamos enviar la cabecera necesaria para poder realizar con éxito nuestra petición, Content-type : application/x-www-form-urlencoded, que en Python es:
Código
  1. cabeceras = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
Bien, una vez ya tenemos todo esto en nuestro código, debemos especificar a que host nos queremos conectar y con que puerto :
Código
  1. abrir_conexion = httplib.HTTPConnection("rootcodes.com:80")
Con eso ya abrimos nuestra conexión a rootcodes.com vía puerto 80 (HTTP). Por lo tanto, ahora necesitamos especificar la URL o el archivo en el servidor que nos receptará los datos:
Código
  1. abrir_conexion.request("POST", "/archivo_cualquiera.php", parametros, cabeceras)
Genial ! , ya tenemos nuestra conexión establecida con rootcodes.com y le acabamos de enviar los datos "campo1" y "campo2" con sus respectivos valores ! , pero falta algo, saber si nuestra apreciada petición fue realizada con éxito:
Código
  1. respuesta = abrir_conexion.getresponse()
  2. print respuesta.status
  Ahí es donde entran en juego los códigos de error que les dejé más arriba.
PD: respuesta.status devolverá el código de error en número, mientras que:
Código
  1. print respuesta.reason
  Nos devolverá en texto, en caso de ser una respuesta válida, el status será 200 y el reason "OK"
  Ya una vez finalizado todo, podemos obtener el código de fuente & posteriormente cerrar la conexión:
Código
  1. ver_source = respuesta.read()
  2. abrir_conexion.close()
  Bien, código final:
Código
  1. import httplib, urllib
  2. parametros = urllib.urlencode({'campo1': 'valor uno','campo2':'valor2'})
  3. cabeceras = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
  4. abrir_conexion = httplib.HTTPConnection("rootcodes.com:80")
  5. abrir_conexion.request("POST", "/archivo_cualquiera.php", parametros, cabeceras)
  6. respuesta = abrir_conexion.getresponse()
  7. print respuesta.status
  8. ver_source = respuesta.read()
  9. #Esto es opcional -> print ver_source
  10. abrir_conexion.close()

  Bien, eso es con la "famosa" httplib, qué tal si vemos ahora como hacerlo con urllib ?

  Bueno, empiezo de 0 con urllib, lo bueno es que esto es muchísimo más sencillo, ya verán ;)
 Primero, importamos la librería :
Código
  1. import urllib
  Para establecer los campos a enviar, es igual al anterior:
Código
  1. campos = urllib.urlencode({"campo":"valor"})
  Y para establecer la web a la cuál enviar los datos:
Código
  1. sitio = urllib.urlopen("http://rootcodes.com/el_archivo.php", campos)
  2. print sitio.read()

  Basta con eso, para enviar el campo: "nombre" con valor: JaAViEr.
 Sencillo no ? , pues claro, el único problema es que tendríamos que utilizar expresiones regulares para detectar si nuestra petición fue realizada con éxito o no, por lo que es mejor utilizar httplib, cosa que yo no hago :P

  De yapa les dejaré una mini clase que hice en Python, para enviar datos por POST fácilmente:
Código
  1. # -*- coding: utf-8 -*-
  2. # Autor: JaAViEr (0x5d)
  3. # Twitter: 0x5d
  4. import re,urllib,sys
  5. try:
  6.  var = urllib.urlopen(raw_input('URL ::> ')).read()
  7. except:
  8.  print "No es posible conectar..."
  9.  sys.exit(1)
  10. url_enviar=""
  11. for url in re.findall("<form (.*)>",var):
  12.  if "action" in url.lower():
  13.    for web in url.split():
  14.      if re.findall("action=(.*)",web):
  15.        url_enviar=web.replace("action=",'')
  16. url_enviar = url_enviar.replace("\"",'')
  17. datos_r = []
  18. for campos in re.findall("<input (.*)>",var):
  19.  if "name" in campos.lower():
  20.    for cam in campos.split():
  21.      if re.findall("name=(.*)",cam):
  22.        datos_r.append(cam.replace('"',''))
  23. print "URL a enviar POST:",url_enviar.replace(">",'')
  24. print "Campos Detectados:"
  25. for s in datos_r:
  26.  print s.replace("name=",'')
Un ejemplo de uso:
Código
  1. Inserta la URL ::> http://sitio web
  2. Inserta las variables, separadas por ':' ::> campo1:campo2
  3. Inserta los valores, separados por ':' ::> valor1:valor2
  4. ACÁ IRÁ LA SALIDA

  Espero no haber sido muy enredado en mi explicación.

Fuente Original : http://rootcodes.com/pythonenviar-peticiones-post-desde-python/  O TAMBIÉN -> http://foros.cristalab.com/enviar-peticiones-post-a-sitios-web-con-python-t103492/

Saludos, Javier.


En línea

¡ SIGUEME EN TWITTER -> @JavierEsteban__ !
WaAYa HaCK

Desconectado Desconectado

Mensajes: 292


Arduino, Android and music


Ver Perfil
Re: [Python] Enviar peticiones POST a sitios Webs. - JaAViEr (0x5d)
« Respuesta #1 en: 26 Enero 2012, 10:59 am »

BUENO!  ;-)

Voy a ver qué puedo sacar con esto...  :rolleyes:


En línea

La cacatúa yoyó es nueva en el zoo!
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.700



Ver Perfil
Re: [Python] Enviar peticiones POST a sitios Webs. - JaAViEr (0x5d)
« Respuesta #2 en: 8 Febrero 2012, 20:29 pm »

Hola 0x5d

Me parece interesantisimo esos codes

¿ Tu crees que con todo eso se podría crear un script para subir un archivo a mediafire ?  Ya que es por método POST, ¿No?

De momento no se ni el comando equivalente a "Pausar" en python, Llevo un día de aprendizaje, jugando con "print" xD, Pero analizar esos scripts tuyos sería un buen comienzo para ir aprendiendo más ^^

Un saludo

PD: WaAya, a ver si un día me das una put@ alegría xD


EDITO:
Mis conocimientos acerca de esto son nulos, Pero llevo casi un año intentando hacer/encontrar un script que suba un archivo a mediafire.

He usado tu 1ª utilidad, El único campo más o menos yo diría "coherente" que recibo de la url "http://mediafire.com" es:  "submit_login"  o  "fp_publish_stream_allow"

Podrías decirme si voy por buen camino o si eso no tiene nada que ver con mi propósito? xD

Gracias, hay mucho que aprender ahí, vaya FORs
« Última modificación: 8 Febrero 2012, 20:47 pm por EleKtro H@cker » En línea


0x5d

Desconectado Desconectado

Mensajes: 241



Ver Perfil WWW
Re: [Python] Enviar peticiones POST a sitios Webs. - JaAViEr (0x5d)
« Respuesta #3 en: 9 Febrero 2012, 21:02 pm »

Hola, buen día !

  Para ese caso te recomiendo que uses algo así como un rastreador de HTTP Headers...
Subes el archivo y miras las cabeceras que has enviado, así sabrás más fácilmente que campos enviaste
para luego enviarlos por Python

Saludos.
En línea

¡ SIGUEME EN TWITTER -> @JavierEsteban__ !
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Python]Localizador IP - JaAViEr(0x5d)
Scripting
0x5d 2 2,732 Último mensaje 30 Diciembre 2011, 15:11 pm
por Novlucker
[Código-Python-Android]Calculadora por secuencia - JaAViEr(0x5d)
Scripting
0x5d 0 2,344 Último mensaje 27 Diciembre 2011, 02:22 am
por 0x5d
[Python-Android]Algunas cosas para empezar - JaAViEr(0x5d)
Scripting
0x5d 1 2,082 Último mensaje 30 Diciembre 2011, 14:39 pm
por Chocala
[Código-Python]Contar repeticion de letras en un texto - JaAViEr|0x5d
Scripting
0x5d 1 11,967 Último mensaje 26 Abril 2012, 01:23 am
por Karcrack
[Código-Python]Código Ofuscado nº2 JaAViEr|0x5d [Actualizado]
Scripting
0x5d 6 4,301 Último mensaje 7 Mayo 2013, 23:52 pm
por CodeSource
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines