Foros del Web » Programando para Internet » Python »

Python Urllib2 Django (Autenticación, Enviar Datos)

Estas en el tema de Python Urllib2 Django (Autenticación, Enviar Datos) en el foro de Python en Foros del Web. Hola!, estoy tratando de pasar una pequeña aplicación que tengo en PHP a Python, consta de un formulario que recibe unos valores, y se envían ...
  #1 (permalink)  
Antiguo 27/07/2012, 19:54
 
Fecha de Ingreso: mayo-2012
Ubicación: Mexico
Mensajes: 82
Antigüedad: 11 años, 11 meses
Puntos: 7
Python Urllib2 Django (Autenticación, Enviar Datos)

Hola!, estoy tratando de pasar una pequeña aplicación que tengo en PHP a Python, consta de un formulario que recibe unos valores, y se envían a una API: login y send valúes.

El Código PHP
Código PHP:
//------------- datos recogidos ------------------
    
$postdata "p_num_text=$nop&smstemplate=&message=$mensaje";
        if(
$nop!="" && $mensaje!=""){
            
$ch curl_init();
      @
fclose($O);        
//------------- Login ------------------
            
curl_setopt($chCURLOPT_URL"http://dominio.com/subdominio/index.php");
            
curl_setopt($chCURLOPT_REFERER"http://dominio.com/subdominio/index.php");
            
curl_setopt ($chCURLOPT_POST1);
            
curl_setopt($chCURLOPT_USERAGENT"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13");
            
curl_setopt ($chCURLOPT_POSTFIELDS"app=page&inc=login&op=auth_login&username=$username&password=$pass");
            
curl_setopt ($chCURLOPT_COOKIEJAR$Cookies);
            
curl_setopt ($chCURLOPT_RETURNTRANSFER1);
            
$login curl_exec ($ch);

            
//----------------- Enviar mensaje -------------------
            
curl_setopt($chCURLOPT_URL"http://dominio.com/subdominio/index.php?app=menu&inc=send_sms&op=sendtopv_yes");
            
curl_setopt($chCURLOPT_REFERER"http://dominio.com/subdominio/index.php?app=menu&inc=send_sms&op=sendtopv");
            
curl_setopt ($chCURLOPT_POST1);
            
curl_setopt($chCURLOPT_USERAGENT"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13");
            
curl_setopt ($chCURLOPT_POSTFIELDS$postdata);
            
//curl_setopt($ch, CURLOPT_COOKIEFILE, $Cookies);
            
curl_setopt ($chCURLOPT_RETURNTRANSFER1);
            
$send curl_exec ($ch); 
Puedo decir que todo se divide en primero la autenticación y segundo el envío del mensaje.

El Código Python
Código Python:
Ver original
  1. import urllib, urllib2
  2.  
  3. user = 'xxx'
  4. clave = 'xxx'
  5. url = 'http://dominio.com/subdominio/index.php'
  6. params = urllib.urlencode({'app': 'page', 'inc': 'login', 'op': 'auth_login', 'username': user, 'password': clave})
  7. urlx = urllib2.urlopen('http://slidetwo.dyndns.org/vasquez/index.php?%s' % params)

¿Que opinan?, el detalle esta que no esta autenticando, si imprimo params y copio y pego la url en un navegador me funciona.

Muchas Gracias.
Saludos.
  #2 (permalink)  
Antiguo 27/07/2012, 21:09
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Python Urllib2 Django (Autenticación, Enviar Datos)

urllib y urllib2 tal vez son las API integradas en python, peor diseñadas de todas. Yo recomiendo usar requests que esta mucho mejor diseñado.
  #3 (permalink)  
Antiguo 27/07/2012, 22:28
 
Fecha de Ingreso: mayo-2012
Ubicación: Mexico
Mensajes: 82
Antigüedad: 11 años, 11 meses
Puntos: 7
Respuesta: Python Urllib2 Django (Autenticación, Enviar Datos)

Cita:
Iniciado por razpeitia Ver Mensaje
urllib y urllib2 tal vez son las API integradas en python, peor diseñadas de todas. Yo recomiendo usar [URL="http://docs.python-requests.org/en/latest/index.html"]requests[/URL] que esta mucho mejor diseñado.
Vaya Ricardo, estuve leyendo sobre este modulo y es fantástico e incluso logre lo que en urllib2 no conseguí hace un par de horas, fantástico contar con la ayuda de personas como tu, espero algún día tener bastantes gestos de agradecimientos con lo que concierne a la comunidad pythonista.

Voy a pasar esta aplicación por completo a Python.

Muchas Gracias.
Saludos.
  #4 (permalink)  
Antiguo 28/07/2012, 00:55
 
Fecha de Ingreso: mayo-2012
Ubicación: Mexico
Mensajes: 82
Antigüedad: 11 años, 11 meses
Puntos: 7
Respuesta: Python Urllib2 Django (Autenticación, Enviar Datos)

Cita:
Iniciado por razpeitia Ver Mensaje
urllib y urllib2 tal vez son las API integradas en python, peor diseñadas de todas. Yo recomiendo usar [URL="http://docs.python-requests.org/en/latest/index.html"]requests[/URL] que esta mucho mejor diseñado.
Tengo una duda, aun no logro entender como enviar varios parámetros a varias urls.

Como decía si volvemos al código de arriba en PHP, que consta de dos partes iniciar sesión y enviar el mensaje.

Aqui inicia sesión perfectamente.
Código Python:
Ver original
  1. import requests
  2. # login
  3. user = 'xxx'
  4. clave = 'xxx'
  5. url = 'http://dominio.com/subdominio/index.php'
  6. valores = {'app': 'page', 'inc': 'login', 'op': 'auth_login',
  7.            'username': user, 'password': clave}
  8. r = requests.post(url, data=valores)
  9. print r.content

Que parte me perdi, porque no entiendo como enviar el mensaje por post, seria algo como así:

Código Python:
Ver original
  1. # send mensaje
  2. valores2 = {'app': 'menu', 'inc': 'send_sms', 'op': 'sendsmstopv'}
  3. r2 = requests.post(url, data=valores2)
  4. print r2.content

Pero aparece como no ha iniciado sesión. Agradezco cualquier aporte, la idea principal es poder enviar el mensaje correctamente, tomando como plantilla el código PHP de arriba.

Muchas Gracias.
Saludos.
  #5 (permalink)  
Antiguo 28/07/2012, 08:30
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Python Urllib2 Django (Autenticación, Enviar Datos)

Es sencillo, lo único que te falta es poner un cookiejar para guarde tu sesión en las cookies.

http://stackoverflow.com/questions/6...in-a-cookiejar
  #6 (permalink)  
Antiguo 28/07/2012, 21:57
 
Fecha de Ingreso: mayo-2012
Ubicación: Mexico
Mensajes: 82
Antigüedad: 11 años, 11 meses
Puntos: 7
Respuesta: Python Urllib2 Django (Autenticación, Enviar Datos)

Hola, he logrado que funcione todo, aun así sugiero si alguien me puede ayudar a afinar un poco mas el código, como por ejemplo como pasar el posdata a un tipo de colección de datos (Diccionario), de igual modo que la variable valores, cualquier aporte lo agradezco amigos:

Código Python:
Ver original
  1. import requests
  2. import cookielib
  3. posdata = "p_num_text=00573122085989&smstemplate=&message=MIMENSAJE&txtcount=8 char : 1 Sms&hiddcount=153"
  4. jar = cookielib.CookieJar()
  5. user = 'xxx'
  6. clave = 'xxx'
  7. url =  'http://dominio.com/sub/index.php'
  8. headers = {'Referer':'http://dominio.com/sub/index.php'}
  9. valores = {'app': 'page', 'inc': 'login', 'op': 'auth_login',
  10.            'username': user, 'password': clave} # Valores para Login
  11. r = requests.post(url, data=valores, headers=headers, cookies=jar) # Login
  12. url = 'http://dominio.com/sub/index.php?app=menu&inc=send_sms&op=sendsmstopv_yes'
  13. headers = {'Referer': 'http://dominio.com/sub/index.php?app=menu&inc=send_sms&op=sendsmstopv' }
  14. r = requests.post(url, data=posdata, headers=headers, cookies=jar) # enviar sms
  15. print r.text

Muchas Gracias Amigos,
Saludos.
  #7 (permalink)  
Antiguo 28/07/2012, 22:04
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Python Urllib2 Django (Autenticación, Enviar Datos)

Código Python:
Ver original
  1. import requests
  2. import cookielib
  3.  
  4. jar = cookielib.CookieJar()
  5.  
  6. user = 'xxx'
  7. clave = 'xxx'
  8. url =  'http://dominio.com/sub/index.php'
  9. headers = {'Referer':'http://dominio.com/sub/index.php'}
  10. valores = {'app': 'page', 'inc': 'login', 'op': 'auth_login',
  11.            'username': user, 'password': clave} # Valores para Login
  12. r = requests.post(url, data=valores, headers=headers, cookies=jar) # Login
  13.  
  14. postdata = {'hiddcount': ['153'],
  15.  'message': ['MIMENSAJE'],
  16.  'p_num_text': ['00573122085989'],
  17.  'txtcount': ['8 char : 1 Sms']}
  18. url = 'http://dominio.com/sub/index.php?app=menu&inc=send_sms&op=sendsmstopv_yes'
  19. headers = {'Referer': 'http://dominio.com/sub/index.php?app=menu&inc=send_sms&op=sendsmstopv' }
  20. r = requests.post(url, data=posdata, headers=headers, cookies=jar) # enviar sms
  21. print r.text
Mas o menos así?
  #8 (permalink)  
Antiguo 28/07/2012, 22:15
 
Fecha de Ingreso: mayo-2012
Ubicación: Mexico
Mensajes: 82
Antigüedad: 11 años, 11 meses
Puntos: 7
Respuesta: Python Urllib2 Django (Autenticación, Enviar Datos)

Código Python:
Ver original
  1. posdata = "p_num_text=00573122085989&smstemplate=&message=variable&txtcount=8 char : 1 Sms&hiddcount=153"

Hola, lo que me dificulta es realizar la parte que esta en negrilla, smstemplate=&message=mensaje, si te fijas hay un =& y luego otro =, no veo como hacerlo.

¿Es algo como así?
Código Python:
Ver original
  1. values = {'smstemplate': ['messaje', '=', variable]}

Muchas Gracias,
Saludos.

Última edición por MacintoshD; 28/07/2012 a las 23:10
  #9 (permalink)  
Antiguo 29/07/2012, 01:31
 
Fecha de Ingreso: mayo-2012
Ubicación: Mexico
Mensajes: 82
Antigüedad: 11 años, 11 meses
Puntos: 7
Respuesta: Python Urllib2 Django (Autenticación, Enviar Datos)

Una preguntica, en el archivo que manejo el formulario he asignado unos campos a IntegerField que son numeros, pero no me lee los "ceros" y obligatoriamente he usado str.

Los parametros de la clase Freemsj son:
Numero y Cuerpo.
Código Python:
Ver original
  1. from project.apps.sms.forms import Freemsj
  2. def index_view(request):
  3.     info_enviado = False
  4.     pais = ''
  5.     numero = ''
  6.     cuerpo = ''
  7.     if request.method == 'POST':
  8.         formulario = Freemsj(request.POST)
  9.         if formulario.is_valid():
  10.             info_enviado = True
  11.             pais = formulario.cleaned_data['Pais']
  12.             numero = formulario.cleaned_data['Numero']
  13.             cuerpo = formulario.cleaned_data['Cuerpo']
  14.             posdata = 'p_num_text='+str(numero)+'&smstemplate=&message='+str(cuerpo)+
  15.                                         '&txtcount=8 char : 1 Sms&hiddcount=153'

Recibe un numero y un texto, no entiendo porque no extrae los parametros numero, cuerpo. tambien intente con:

Código Python:
Ver original
  1. formulario['Numero']
  2. formulario['Cuerpo']

Muchas Gracias amigos,
Saludos.

Última edición por MacintoshD; 29/07/2012 a las 02:46
  #10 (permalink)  
Antiguo 30/07/2012, 13:14
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Python Urllib2 Django (Autenticación, Enviar Datos)

Cita:
Iniciado por MacintoshD Ver Mensaje
Código Python:
Ver original
  1. posdata = "p_num_text=00573122085989&smstemplate=&message=variable&txtcount=8 char : 1 Sms&hiddcount=153"

Hola, lo que me dificulta es realizar la parte que esta en negrilla, smstemplate=&message=mensaje, si te fijas hay un =& y luego otro =, no veo como hacerlo.

¿Es algo como así?
Código Python:
Ver original
  1. values = {'smstemplate': ['messaje', '=', variable]}

Muchas Gracias,
Saludos.
No, lo que pasa es que es una variable vacía, osea contiene un cadena vacía como valor.
Lo puedes hacer con lo siguiente.
Código Python:
Ver original
  1. postdata = {'hiddcount': ['153'],
  2. 'smstemplate': '',
  3. 'message': ['MIMENSAJE'],
  4. 'p_num_text': ['00573122085989'],
  5. 'txtcount': ['8 char : 1 Sms']}

Etiquetas: django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:20.