Wie kann ich mich mit Python auf einer Website anmelden?

87

Wie kann ich es tun? Ich habe versucht, einen bestimmten Link (mit urllib) einzugeben, aber dazu muss ich mich anmelden.

Ich habe diese Quelle von der Website:

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

Ist das möglich?

Bruno 'Shady'
quelle

Antworten:

70

Vielleicht möchten Sie Twill verwenden . Es ist recht einfach zu bedienen und sollte in der Lage sein, das zu tun, was Sie wollen.

Es wird wie folgt aussehen:

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

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

submit('0')

Sie können showforms()alle Formulare go…auflisten, sobald Sie zu der Site navigiert haben, für die Sie sich anmelden möchten. Probieren Sie es einfach mit dem Python-Interpreter aus.

Faultier
quelle
Beachten Sie, dass Sie in einigen Fällen submit () verwenden müssen. Siehe: lists.idyll.org/pipermail/twill/2006-August/000526.html Ich bestätige dieses Problem, indem ich mich mit submit () works bei www.pge.com anmelde.
user391339
2
Gibt es eine Lösung für Python 3.6? Es scheint, dass Twill weder Python 3.5 noch 3.6 unterstützt. Ich habe versucht, es herunterzuladen und mit zu konvertieren, 2to3aber jetzt bekomme ich eine, ModuleNotFoundErrorwenn ich versuche, es zu importieren.
CGFoX
Eigentlich könnte ich das ModuleNotFoundErrordurch Verwenden / Konvertieren von Twill 1.8.0 und Installieren lxmlund requestsmit lösen pip install. Aber jetzt bekomme ich eine, SyntaxErrorwenn ich versuche zu importieren, weil irgendwo False = 0....
CGFoX
2
Es ist eine Art Schmerz, es zu beheben, aber es funktioniert: stackoverflow.com/a/45459994/2745116
CGFoX
Funktioniert es mit HTTPs Standorten arbeiten oder ich habe so etwas wie zu tun dies ?
Mahesha999
51

Lassen Sie mich versuchen, es einfach zu machen. Angenommen, die URL der Website lautet www.example.com, und Sie müssen sich anmelden, indem Sie Benutzername und Passwort eingeben. Wir gehen also zur Anmeldeseite und sagen http://www.example.com/login .php jetzt und sehen Sie sich den Quellcode an und suchen Sie nach der Aktions-URL, die in Form eines Tags vorliegen soll

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

Nehmen Sie jetzt userinfo.php, um eine absolute URL zu erstellen, die " http://example.com/userinfo.php " lautet. Führen Sie nun ein einfaches Python-Skript aus

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

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

Ich hoffe, dass dies irgendwann jemandem irgendwo hilft.

Tarun Venugopal Nair
quelle
Dies funktioniert nicht für die meisten Websites, die ich ausprobiert habe
Anurag Pandey
Von den zwei Dutzend Hilfe- / Stapelüberlaufseiten, die ich mir angesehen habe, war dies die einzige Lösung, die auf der einen Site funktionierte, die ich brauchte.
Boje
Die beste Wahl für die Webautomatisierung ist der Webbot. stackoverflow.com/a/51170181/6665568
Natesh bhat
Sind alle Werte immer Benutzername und Passwort? Ich glaube nicht, dass dies für meine ausgewählte Site funktioniert.
Dylan Logan
@DylanLogan Sie müssen immer überprüfen, was die eigentliche Webseite an den Server sendet, und Ihr Skript daran anpassen. Der Server sollte nicht in der Lage sein, zwischen Ihrem Skript und dem Webbrowser zu unterscheiden.
Jeyekomon
28

Normalerweise benötigen Sie Cookies, um sich auf einer Website anzumelden. Dies bedeutet cookielib, urllib und urllib2. Hier ist eine Klasse, die ich zurückgeschrieben habe, als ich Facebook-Web-Spiele gespielt habe:

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

Sie werden nicht unbedingt die HTTPS- oder Redirect-Handler benötigen, aber sie tun nicht weh und machen den Opener viel robuster. Möglicherweise benötigen Sie auch keine Cookies, aber es ist schwer, dies anhand des von Ihnen geposteten Formulars zu erkennen. Ich vermute, dass Sie dies möglicherweise nur aufgrund der auskommentierten Eingabe "Erinnere dich an mich" tun.

Anthony Briggs
quelle
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

Weitere Informationen finden Sie unter: https://docs.python.org/2/library/urllib2.html

Blokeley
quelle
Der Link funktioniert nicht: a 2wurde in den docs.python.orgURLs hinzugefügt : docs.python.org/2/library/urllib2.html
Michael Kopp
18

Webseitenautomatisierung? Auf jeden Fall "Webbot"

webbot funktioniert sogar auf Webseiten, deren ID und Klassennamen sich dynamisch ändern und die mehr Methoden und Funktionen als Selen oder Mechanisierung aufweisen.

Hier ist ein Ausschnitt :)

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 ^_^

Die Dokumente sind auch ziemlich einfach und einfach zu bedienen: https://webbot.readthedocs.io

Natesh bhat
quelle
Dieses Beispiel funktioniert hervorragend. Funktioniert das auch wo autocomplete=off?
S Andrew
nicht auf Win 64 Bit installieren. Fehler:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa
Versuchen Sie es mit Python3
Natesh Bhat
Wie gehe ich mit Iframe in Webbot um? Ich meine, ich muss einen Iframe schließen, der nach dem Laden der Seite erscheint.
Arihanth Jain
7

Websites im Allgemeinen können die Autorisierung auf viele verschiedene Arten überprüfen, aber die, auf die Sie abzielen, scheint es Ihnen einigermaßen einfach zu machen.

Sie müssen lediglich einen formularcodierten Blob mit den verschiedenen Feldern POSTan die auth/loginURL senden (vergessen Sie die Beschriftungen for, sie sind Dekoration für menschliche Besucher). handle=whatever&password-clear=pwdund so weiter, solange Sie die Werte für das Handle (AKA-E-Mail) und das Passwort kennen, sollte es Ihnen gut gehen.

Vermutlich leitet POST Sie auf eine Seite "Sie haben sich erfolgreich angemeldet" mit einem Set-CookieHeader weiter, der Ihre Sitzung bestätigt (speichern Sie dieses Cookie und senden Sie es bei weiterer Interaktion während der Sitzung zurück!).

Alex Martelli
quelle