2011-11-29 19 views
14

Estoy tratando de iniciar sesión en este page usando Python.Iniciar sesión en el sitio web usando python

He intentado utilizar los pasos descritos en este other Stack Overflow post, y obtuve el siguiente código:

import urllib, urllib2, cookielib 

username = 'username' 
password = 'password' 

cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
login_data = urllib.urlencode({'username' : username, 'j_password' : password}) 
opener.open('http://friends.cisv.org/index.cfm', login_data) 
resp = opener.open('http://friends.cisv.org/index.cfm?fuseaction=activities.list') 
print resp.read() 

pero eso me dio el siguiente resultado:

<SCRIPT LANGUAGE="JavaScript"> 
    alert('Sorry. You need to log back in to continue. You will be returned to the home page when you click on OK.'); 
    document.location.href='index.cfm'; 
</SCRIPT> 

¿Qué estoy haciendo mal?

+0

De la extensión .cfm en su secuencia de comandos de manipulación, supongo que está utilizando un motor de ColdFusion para procesar realidad estos inicios de sesión. Necesitaríamos saber cuáles son los contenidos y el procedimiento en ese archivo, porque la respuesta está yendo muy bien a python, es Coldfusion que está devolviendo javascript y una redirección. Este problema está en el servidor y no en el cliente de Python. – DeaconDesperado

+0

Supongo que el OP no posee el sitio web, y solo espera interactuar con él programáticamente como usuario. Autenticar al sitio web no es ningún problema, solo tiene que echar un vistazo a los datos del formulario que se envían al iniciar sesión y proporcionar los mismos datos. No es necesario saber qué está sucediendo en el servidor. Vea mi ejemplo a continuación. – Acorn

Respuesta

29

Yo recomendaría usar el maravilloso módulo requests.

El siguiente código le permitirá iniciar sesión en el sitio y conservar las cookies durante la sesión.

import requests 
import sys 

EMAIL = '' 
PASSWORD = '' 

URL = 'http://friends.cisv.org' 

def main(): 
    # Start a session so we can have persistant cookies 
    session = requests.session(config={'verbose': sys.stderr}) 

    # This is the form data that the page sends when logging in 
    login_data = { 
     'loginemail': EMAIL, 
     'loginpswd': PASSWORD, 
     'submit': 'login', 
    } 

    # Authenticate 
    r = session.post(URL, data=login_data) 

    # Try accessing a page that requires you to be logged in 
    r = session.get('http://friends.cisv.org/index.cfm?fuseaction=user.fullprofile') 

if __name__ == '__main__': 
    main() 
+0

¡Gracias, eso funcionó como un encanto! – iomartin

+0

En la solución anterior después de "r = session.get ('http://friends.cisv.org/index.cfm?fuseaction=user.fullprofile')" –

+0

Esta solución no es aceptable cuando no tiene control y capacidad para instalar bibliotecas externas. Se prefiere una solución nativa lista para usar. – KoCMoHaBTa

3

El término "iniciar sesión" es lamentablemente muy vago. El código proporcionado aquí, obviamente, intentó iniciar sesión utilizando la autenticación básica de HTTP. Apostaría a que este sitio quiere que le envíe un nombre de usuario y contraseña en algún tipo de formulario POST (así es como funcionan la mayoría de los formularios de inicio de sesión basados ​​en la web). En este caso, deberá enviar la solicitud POST adecuada y conservar las cookies que le envíen para futuras solicitudes. Lamentablemente, no sé qué sería, depende del sitio. Tendrá que averiguar cómo normalmente registra a un usuario e intenta seguir ese patrón.

Cuestiones relacionadas