Comment puis-je me connecter à un site Web avec Python?

87

Comment puis-je le faire? J'essayais d'entrer un lien spécifié (avec urllib), mais pour le faire, je dois me connecter.

J'ai cette source sur le 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" />

Est-ce possible?

Bruno 'Shady'
la source

Réponses:

70

Vous souhaitez peut-être utiliser du sergé . Il est assez facile à utiliser et devrait pouvoir faire ce que vous voulez.

Cela ressemblera à ceci:

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

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

submit('0')

Vous pouvez utiliser showforms()pour répertorier tous les formulaires une fois que vous avez utilisé go…pour parcourir le site auquel vous souhaitez vous connecter. Essayez-le simplement depuis l'interpréteur python.

la paresse
la source
notez que dans certains cas, vous devez utiliser submit (). voir: lists.idyll.org/pipermail/twill/2006-August/000526.html Je confirme ce problème, pour moi, en me connectant à www.pge.com, en utilisant submit () fonctionne.
user391339
2
Existe-t-il une solution pour Python 3.6? Il semble que twill ne prend pas en charge Python 3.5 ni 3.6. J'ai essayé de le télécharger et de le convertir en utilisant 2to3mais maintenant j'obtiens un ModuleNotFoundErroren essayant de l'importer.
CGFoX
En fait, je pourrais résoudre le problème ModuleNotFoundErroren utilisant / convertissant Twill 1.8.0 et en installant lxmlet requestsavec pip install. Mais maintenant j'obtiens un SyntaxErrorquand j'essaye d'importer parce que quelque part False = 0....
CGFoX
2
C'est un peu
pénible
Cela fonctionne-t-il avec les sites HTTP ou je dois faire quelque chose comme ça ?
Mahesha999
51

Laissez-moi essayer de faire simple, supposons que l'URL du site est www.example.com et que vous devez vous inscrire en remplissant le nom d'utilisateur et le mot de passe, nous allons donc à la page de connexion, dites http://www.example.com/login .php maintenant et affichez son code source et recherchez l'URL d'action, il sera sous forme de balise quelque chose comme

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

maintenant, prenez userinfo.php pour créer une URL absolue qui sera ' http://example.com/userinfo.php ', exécutez maintenant un simple script python

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

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

J'espère que cela aidera quelqu'un quelque part un jour.

Tarun Venugopal Nair
la source
cela ne fonctionne pas pour la plupart des sites Web que j'ai essayés
Anurag Pandey
Sur les deux douzaines de pages d'aide / stackoverflow que j'ai consultées, c'était la seule solution qui fonctionnait sur le site dont j'avais besoin.
Bouée du
le meilleur choix pour l'automatisation Web est le webbot. stackoverflow.com/a/51170181/6665568
Natesh bhat
Toutes les valeurs sont-elles toujours un nom d'utilisateur et un mot de passe? Je ne pense pas que cela semble fonctionner pour mon site choisi.
Dylan Logan
@DylanLogan Vous devez toujours inspecter ce que la page Web envoie au serveur et y adapter votre script. Le serveur ne doit pas être en mesure de faire la distinction entre votre script et le navigateur Web.
Jeyekomon
28

En règle générale, vous aurez besoin de cookies pour vous connecter à un site, ce qui signifie cookielib, urllib et urllib2. Voici un cours que j'ai écrit lorsque je jouais à des jeux Web Facebook:

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())

Vous n'aurez pas nécessairement besoin des gestionnaires HTTPS ou Redirect, mais ils ne font pas de mal, et cela rend l'ouvreur beaucoup plus robuste. Vous n'avez peut-être pas besoin de cookies, mais il est difficile de le dire uniquement à partir du formulaire que vous avez publié. Je soupçonne que vous pourriez, uniquement à partir de l'entrée «Souvenez-vous de moi» qui a été commentée.

Anthony Briggs
la source
19
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

Pour plus d'informations, visitez: https://docs.python.org/2/library/urllib2.html

Blokeley
la source
Le lien ne fonctionne pas: un a 2été ajouté dans les docs.python.orgurls: docs.python.org/2/library/urllib2.html
Michael Kopp
18

Automatisation de page Web? Certainement "webbot"

webbot fonctionne même des pages Web qui ont des identifiants et des noms de classe qui changent dynamiquement et qui ont plus de méthodes et de fonctionnalités que le sélénium ou la mécanisation.

Voici un extrait :)

from webbot import Browser 
web = Browser()
web.go_to('google.com') 
web.click('Sign in')
web.type('[email protected]' , 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 ^_^

Les documents sont également assez simples et simples à utiliser: https://webbot.readthedocs.io

Natesh bhat
la source
Cet examen fonctionne très bien. Cela fonctionnera-t-il également où autocomplete=off.?
S Andrew
ne pas installer sur win 64 bits. Erreur:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa
Essayez d'utiliser python3
Natesh bhat
Comment gérer l'iframe dans le webbot? Je veux dire que je dois fermer un iframe qui apparaît après le chargement de la page ..
Arihanth Jain
7

Les sites Web en général peuvent vérifier l'autorisation de différentes manières, mais celle que vous ciblez semble vous faciliter la tâche.

Tout ce dont vous avez besoin est d' attribuer POSTà l' auth/loginURL un blob codé par formulaire avec les différents champs que vous y voyez (oubliez les étiquettes for, ce sont des décorations pour les visiteurs humains). handle=whatever&password-clear=pwdet ainsi de suite, tant que vous connaissez les valeurs du handle (AKA email) et du mot de passe, tout devrait bien se passer.

Vraisemblablement, POST vous redirigera vers une page "vous vous êtes connecté avec succès" avec un en- Set-Cookietête validant votre session (assurez-vous de sauvegarder ce cookie et de le renvoyer lors d'une nouvelle interaction au cours de la session!).

Alex Martelli
la source