2010-05-26 38 views
53

¿Cómo puedo hacerlo? yo estaba tratando de entrar en algún tipo de relación especificada (con urllib), pero para hacerlo, necesito que entrar¿Cómo puedo iniciar sesión en un sitio web con Python?

que tienen esta fuente desde el sitio:.

<form id="login-form" action="auth/login" method="post"> 
    <div> 
    <!--label for="rememberme">Remember me</label><input type="checkbox" class="remember" checked="checked" name="remember me" /--> 
    <label for="email" id="email-label" class="no-js">Email</label> 
    <input id="email-email" type="text" name="handle" value="" autocomplete="off" /> 
    <label for="combination" id="combo-label" class="no-js">Combination</label> 
    <input id="password-clear" type="text" value="Combination" autocomplete="off" /> 
    <input id="password-password" type="password" name="password" value="" autocomplete="off" /> 
    <input id="sumbitLogin" class="signin" type="submit" value="Sign In" /> 

Es esto posible?

Respuesta

50

Quizás quieras usar twill (está basado en mechanize). Es bastante fácil de usar y debería poder hacer lo que quieras.

Se verá como la siguiente:

from twill.commands import * 
go('http://mysite.org') 

fv("1", "email-email", "blabla.com") 
fv("1", "password-clear", "testpass") 

submit('0') 

Puede utilizar showforms() enumerar todas formas, una vez que utilizó go(...) para buscar el sitio que desea iniciar sesión. Inténtalo con el intérprete de Python.

+0

tenga en cuenta que en algunos casos necesita utilizar submit().ver: http://lists.idyll.org/pipermail/twill/2006-August/000526.html Confirmo este problema, para mí, iniciando sesión en www.pge.com, utilizando los trabajos de submit(). – user391339

+0

¿Hay una solución para Python 3.6? Parece que Twill no es compatible con Python 3.5 ni 3.6. Intenté descargarlo y convertirlo usando '2to3' pero ahora obtengo' ModuleNotFoundError' cuando intento importarlo. – CGFoX

+0

En realidad, pude resolver el 'ModuleNotFoundError' usando/convirtiendo Twill 1.8.0 e instalando' lxml' y 'requests' con' pip install'. Pero ahora obtengo un 'SyntaxError' cuando trato de importar porque en algún lugar' False = 0' .... – CGFoX

5

Los sitios web en general pueden verificar la autorización de muchas maneras diferentes, pero la que está buscando parece que la hace razonablemente fácil.

Todo lo que necesita es POST a la URL auth/login una mancha forma codificada con los diversos campos que se ven allí (olvidar las etiquetas for, son decoración para los visitantes humanos). handle=whatever&password-clear=pwd y así sucesivamente, siempre que sepa los valores para el identificador (AKA) y la contraseña, estará bien.

Es de suponer que POST lo redireccionará a alguna página "ha iniciado sesión exitosamente" con un encabezado Set-Cookie validando su sesión (¡asegúrese de guardar esa cookie y enviarla de nuevo a la interacción durante la sesión!).

14
import cookielib 
import urllib 
import urllib2 

url = 'http://www.someserver.com/auth/login' 
values = {'email-email' : '[email protected]', 
      'password-clear' : 'Combination', 
      'password-password' : 'mypassword' } 

data = urllib.urlencode(values) 
cookies = cookielib.CookieJar() 

opener = urllib2.build_opener(
    urllib2.HTTPRedirectHandler(), 
    urllib2.HTTPHandler(debuglevel=0), 
    urllib2.HTTPSHandler(debuglevel=0), 
    urllib2.HTTPCookieProcessor(cookies)) 

response = opener.open(url, data) 
the_page = response.read() 
http_headers = response.info() 
# The login cookies should be contained in the cookies variable 

Para obtener más información, visite: https://docs.python.org/2/library/urllib2.html

+0

El enlace no funciona: se agregó un '2' en las URL de' docs.python.org': https://docs.python.org/2/library/urllib2.html –

21

Normalmente necesitaremos cookies para iniciar sesión en un sitio, lo que significa cookielib, urllib y urllib2. Aquí está una clase que escribí cuando yo estaba jugando juegos de Facebook web:

import cookielib 
import urllib 
import urllib2 

# set these to whatever your fb account is 
fb_username = "[email protected]" 
fb_password = "secretpassword" 

class WebGamePlayer(object): 

    def __init__(self, login, password): 
     """ Start up... """ 
     self.login = login 
     self.password = password 

     self.cj = cookielib.CookieJar() 
     self.opener = urllib2.build_opener(
      urllib2.HTTPRedirectHandler(), 
      urllib2.HTTPHandler(debuglevel=0), 
      urllib2.HTTPSHandler(debuglevel=0), 
      urllib2.HTTPCookieProcessor(self.cj) 
     ) 
     self.opener.addheaders = [ 
      ('User-agent', ('Mozilla/4.0 (compatible; MSIE 6.0; ' 
          'Windows NT 5.2; .NET CLR 1.1.4322)')) 
     ] 

     # need this twice - once to set cookies, once to log in... 
     self.loginToFacebook() 
     self.loginToFacebook() 

    def loginToFacebook(self): 
     """ 
     Handle login. This should populate our cookie jar. 
     """ 
     login_data = urllib.urlencode({ 
      'email' : self.login, 
      'pass' : self.password, 
     }) 
     response = self.opener.open("https://login.facebook.com/login.php", login_data) 
     return ''.join(response.readlines()) 

Usted no necesariamente necesita el HTTPS o redirigir los manipuladores, pero no hacen daño, y hace que el abridor mucho más robusto. También es posible que no necesite cookies, pero es difícil decirlo solo desde el formulario que ha publicado. Sospecho que podrías, puramente por la entrada "Recordarme" que ha sido comentada.

33

Vamos a tratar de hacer que sea sencillo, supongamos que la URL del sitio es www.example.com y hay que inscribirse rellenando nombre de usuario y contraseña, así que ir a la página de inicio de sesión decir http://www.example.com/login.php ahora y ver su código fuente y la búsqueda de la URL de acción será en forma de etiqueta de algo así como

<form name="loginform" method="post" action="userinfo.php"> 

ahora a tomar para hacer userinfo.php URL absoluta que será 'http://example.com/userinfo.php ', ahora ejecute un script de python simple

import requests 
url = 'http://example.com/userinfo.php' 
values = {'username': 'user', 
      'password': 'pass'} 

r = requests.post(url, data=values) 
print r.content 

Espero que esto ayude a alguien en algún lugar algún día.

+0

esto no funciona para la mayoría de los sitios web que probé –

+0

De las dos docenas de páginas de ayuda/stackoverflow que miré, esta era la única solución que funcionaba en el único sitio que necesitaba. – Buoy

Cuestiones relacionadas