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.
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
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.
# -*- coding: utf-8 -*- # Autor: JaAViEr (0x5d) # Twitter: 0x5d import re,urllib,sys try: var = urllib.urlopen(raw_input("URL ::> ")).read() except: print "No es posible conectar..." sys.exit(1) url_enviar="" for url in re.findall("<form (.*)>",var): if "action" in url.lower(): for web in url.split(): if re.findall("action=(.*)",web): url_enviar=web.replace("action=","") url_enviar = url_enviar.replace("\"","") datos_r = [] for campos in re.findall("<input (.*)>",var): if "name" in campos.lower(): for cam in campos.split(): if re.findall("name=(.*)",cam): datos_r.append(cam.replace('"',"")) print "URL a enviar POST:",url_enviar.replace(">","") print "Campos Detectados:" for s in datos_r: print s.replace("name=","")
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
Para poder crear una conexión utilizamos:
import httplib, urllib
Código
En este caso, estamos enviando campo1 con el valor: valor uno y campo2 con el valor: valor2
parametros = urllib.urlencode({'campo1': 'valor uno','campo2':'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
Bien, una vez ya tenemos todo esto en nuestro código, debemos especificar a que host nos queremos conectar y con que puerto :
cabeceras = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
Código
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:
abrir_conexion = httplib.HTTPConnection("rootcodes.com:80")
Código
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:
abrir_conexion.request("POST", "/archivo_cualquiera.php", parametros, cabeceras)
Código
Ahí es donde entran en juego los códigos de error que les dejé más arriba.
respuesta = abrir_conexion.getresponse() print respuesta.status
PD: respuesta.status devolverá el código de error en número, mientras que:
Código
Nos devolverá en texto, en caso de ser una respuesta válida, el status será 200 y el reason "OK"
print respuesta.reason
Ya una vez finalizado todo, podemos obtener el código de fuente & posteriormente cerrar la conexión:
Código
Bien, código final:
ver_source = respuesta.read() abrir_conexion.close()
Código
import httplib, urllib parametros = urllib.urlencode({'campo1': 'valor uno','campo2':'valor2'}) cabeceras = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"} abrir_conexion = httplib.HTTPConnection("rootcodes.com:80") abrir_conexion.request("POST", "/archivo_cualquiera.php", parametros, cabeceras) respuesta = abrir_conexion.getresponse() print respuesta.status ver_source = respuesta.read() #Esto es opcional -> print ver_source 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
Para establecer los campos a enviar, es igual al anterior:
import urllib
Código
Y para establecer la web a la cuál enviar los datos:
campos = urllib.urlencode({"campo":"valor"})
Código
sitio = urllib.urlopen("http://rootcodes.com/el_archivo.php", campos) 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
De yapa les dejaré una mini clase que hice en Python, para enviar datos por POST fácilmente:
Código
Un ejemplo de uso:
# -*- coding: utf-8 -*- # Autor: JaAViEr (0x5d) # Twitter: 0x5d import re,urllib,sys try: var = urllib.urlopen(raw_input('URL ::> ')).read() except: print "No es posible conectar..." sys.exit(1) url_enviar="" for url in re.findall("<form (.*)>",var): if "action" in url.lower(): for web in url.split(): if re.findall("action=(.*)",web): url_enviar=web.replace("action=",'') url_enviar = url_enviar.replace("\"",'') datos_r = [] for campos in re.findall("<input (.*)>",var): if "name" in campos.lower(): for cam in campos.split(): if re.findall("name=(.*)",cam): datos_r.append(cam.replace('"','')) print "URL a enviar POST:",url_enviar.replace(">",'') print "Campos Detectados:" for s in datos_r: print s.replace("name=",'')
Código
Inserta la URL ::> http://sitio web Inserta las variables, separadas por ':' ::> campo1:campo2 Inserta los valores, separados por ':' ::> valor1:valor2 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.