Hola, muy buenos días a todos ! En esta mini guía o tutorial, 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 :
# -*- 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=","")
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 :
import httplib, urllib
Para poder crear una conexión utilizamos:
Código :
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 :
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 :
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 :
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 :
respuesta = abrir_conexion.getresponse() 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 :
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 :
ver_source = respuesta.read() abrir_conexion.close()
Bien, código final:
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 :
import urllib
Para establecer los campos a enviar, es igual al anterior:
Código :
campos = urllib.urlencode({"campo":"valor"})
Y para establecer la web a la cuál enviar los datos:
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 :
# -*- coding: utf-8 -*- import urllib class enviar_datos: def conectar(self,host,campo,valor): self.variables=[] self.valores=[] self.campo = campo self.valor = valor self.host = host self.datos = {} for campo_variables,valor_variables in zip(self.campo.split(":"),self.valor.split(":")): self.variables.append(campo_variables) self.valores.append(valor_variables) for variable,valor in zip(self.variables,self.valores): self.datos['%s'%variable] = valor try: return urllib.urlopen(self.host,urllib.urlencode(self.datos)).read() except: return "No se puede conectar a %s"%(self.host) url = raw_input("Inserta la URL ::> ") variables = raw_input("Inserta las variables, separadas por ':' ::> ") valores = raw_input("Inserta los valores, separados por ':' ::> ") conec = enviar_datos() print conec.conectar(url,variables,valores)
Un ejemplo de uso:
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, es mi primer tutorial y exclusivo para Cristalab.
Saludos, Javier.
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Kinduff el 24 de Enero de 2012
Gracias por el script.
Por jarlest el 24 de Enero de 2012
Por JaAViEr el 24 de Enero de 2012
Kinduff :
Gracias por el script.
Y pues gracias a ambos !
Saludos !
Por Ernesto el 03 de Febrero de 2012
Una duda, podre mandar varios POST antes de cerrar la conexion, es decir, primero envio la informacion para loguearme en la pagina, despues cambio la url y envio la informacion para desplazarme por la pagina y mandar los datos?
bueno gracias de todos modos, espero respuesta
Por JaAViEr el 08 de Febrero de 2012
Directo al grano... Si, puedes. Pero antes debes crear las cookies
y poder almacenarlas, usando la misma librería urllib, con el urllib.opener
si mal no recuerdo
Saludos.
Por orlando el 06 de Abril de 2013
gracias y un buen dia a todos
Por <h1>lol el 13 de Diciembre de 2013
Por Daniel el 09 de Marzo de 2014
Sere directo, quiero un codigo en python que envie sms a celulares, por ejemplo yo entro a esta web de Claro:
http://www.claro.com.ar/portal/ar/envioSMS/
y ahi completo los datos y en la URL de IEplorer aparece así (luego de pulsar el boton Enviar):
http://puntodeventa.claro.com.ar/sms/default.aspx?mensajito=Holaaa&dequien=Daniel&numerito=3814439521
osea que por lo casi nada que entiendo, directamente deberia entrar a ese enlace ya que estarian completados todos los datos, excepto la captcha y aqui es donde pierdo mallllll por Dios
bueno ya sin ganas y cansado de esto te lo dejo para que entres a esa web y me dejes el codigo de python listo para que con solo poner por ej el numero de la captcha, envie el msj al destinatario.
Por favor dame una mano que esto ya me tiene mal, muy cansado.
Dejamelo al codigo por fa ya que no puedo hacerlo solo porque no entiendo y no me gusta HTML por eso me cuesta tanto.
Gracias
Por wlopez2207 el 31 de Mayo de 2014
Por Carlos el 10 de Junio de 2014
Por Carlos Felipe el 07 de Abril de 2015
GRACIAS
Por Angel Mata el 26 de Mayo de 2015
Por resalpa84 el 16 de Diciembre de 2015
Por Jota el 19 de Diciembre de 2015
como puedo hacer para que soporte formulario que incluye <input type="file" name="archivo"></input>?
Salu2
Por lf8 el 03 de Noviembre de 2016