Como posso fazer o login em um site com Python?


87

Como eu posso fazer isso? Eu estava tentando entrar em algum link especificado (com urllib), mas para fazer isso, preciso fazer o login.

Eu tenho esta fonte do site:

<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" />

Isso é possível?

Respostas:


70

Talvez você queira usar sarja . É muito fácil de usar e deve ser capaz de fazer o que você quiser.

Será parecido com o seguinte:

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

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

submit('0')

Você pode usar showforms()para listar todos os formulários depois go…de navegar até o site que deseja fazer login. Basta tentar a partir do interpretador python.


observe que em alguns casos você precisa usar submit (). consulte: lists.idyll.org/pipermail/twill/2006-August/000526.html Confirmo esse problema, para mim, fazendo login em www.pge.com, usando submit () works.
user391339

2
Existe uma solução para Python 3.6? Parece que o twill não suporta Python 3.5 nem 3.6. Tentei fazer o download e converter usando, 2to3mas agora recebo um ModuleNotFoundErrorao tentar importá-lo.
CGFoX

Na verdade, consegui resolver o problema ModuleNotFoundErrorusando / convertendo Twill 1.8.0 e instalando lxmle requestscom pip install. Mas agora recebo um SyntaxErrorquando tento importar porque em algum lugar False = 0...
CGFoX 02 de

2
É meio
chato

Ele funciona com sites HTTPS ou eu tenho que fazer alguma coisa como esta ?
Mahesha999

51

Deixe-me tentar simplificar, suponha que o URL do site seja www.example.com e você precise se inscrever preenchendo o nome de usuário e a senha, então vamos para a página de login dizer http://www.example.com/login .php agora e veja seu código-fonte e pesquise o URL de ação que estará em forma de tag como

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

agora pegue userinfo.php para criar um URL absoluto que será ' http://example.com/userinfo.php ', agora execute um script python simples

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

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

Espero que algum dia isso ajude alguém em algum lugar.


isso não funciona para a maioria dos sites que experimentei
Anurag Pandey

Das duas dúzias de páginas de ajuda / stackoverflow que examinei, essa era a única solução que funcionava no único site de que eu precisava.
Buoy

a melhor escolha para automação da web é o webbot. stackoverflow.com/a/51170181/6665568
Natesh bhat

Todos os valores são sempre nome de usuário e senha? Eu não acho que isso parece estar funcionando para o meu site escolhido.
Dylan Logan

@DylanLogan Você sempre deve inspecionar o que a página real envia ao servidor e adaptar seu script a ela. O servidor não deve ser capaz de distinguir entre o seu script e o navegador da web.
Jeyekomon

28

Normalmente, você precisará de cookies para fazer login em um site, o que significa cookielib, urllib e urllib2. Aqui está uma aula que escrevi quando estava jogando jogos da web do Facebook:

import cookielib
import urllib
import urllib2

# set these to whatever your fb account is
fb_username = "your@facebook.login"
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())

Você não precisará necessariamente dos manipuladores HTTPS ou Redirect, mas eles não prejudicam e tornam o abridor muito mais robusto. Você também pode não precisar de cookies, mas é difícil dizer apenas pelo formulário que você postou. Suspeito que sim, puramente a partir da entrada 'Lembre-se de mim' que foi comentada.


19
import cookielib
import urllib
import urllib2

url = 'http://www.someserver.com/auth/login'
values = {'email-email' : 'john@example.com',
          '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 obter mais informações, visite: https://docs.python.org/2/library/urllib2.html


O link não está funcionando: um 2foi adicionado aos docs.python.orgurls: docs.python.org/2/library/urllib2.html
Michael Kopp

18

Automação de página da Web? Definitivamente "webbot"

webbot funciona até mesmo páginas da web que mudam dinamicamente id e nomes de classe e tem mais métodos e recursos do que selênio ou mecanizar.

Aqui está um trecho :)

from webbot import Browser 
web = Browser()
web.go_to('google.com') 
web.click('Sign in')
web.type('mymail@gmail.com' , into='Email')
web.click('NEXT' , tag='span')
web.type('mypassword' , into='Password' , id='passwordFieldId') # specific selection
web.click('NEXT' , tag='span') # you are logged in ^_^

Os documentos também são bastante diretos e simples de usar: https://webbot.readthedocs.io


Este exemplo funciona muito bem. Isso também funcionará onde autocomplete=off.?
S Andrew

não instale no win de 64 bits. Erro:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa

Tente usar python3
Natesh bhat

Como lidar com iframe no webbot.? .. quero dizer, tenho que fechar um iframe que aparece depois que a página é carregada ..
arihanth jain

7

Os sites em geral podem verificar a autorização de muitas maneiras diferentes, mas aquele que você está direcionando parece torná-lo razoavelmente fácil para você.

Tudo que você precisa é inserir POSTno auth/loginURL um blob codificado por formulário com os vários campos que você vê lá (esqueça os rótulos for, eles são uma decoração para visitantes humanos). handle=whatever&password-clear=pwde assim por diante, contanto que você saiba os valores para o identificador (também conhecido como e-mail) e senha, você deve estar bem.

Presumivelmente, o POST irá redirecioná-lo para alguma página "você fez login com sucesso" com um Set-Cookiecabeçalho validando sua sessão (certifique-se de salvar esse cookie e enviá-lo de volta em uma interação posterior durante a sessão!)


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.