Jak mogę zalogować się do witryny internetowej za pomocą Pythona?

87

Jak mogę to zrobić? Próbowałem wprowadzić jakiś określony link (z urllib), ale aby to zrobić, muszę się zalogować.

Mam to źródło ze strony:

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

czy to możliwe?

Bruno „Shady”
źródło

Odpowiedzi:

70

Może chcesz użyć diagonalu . Jest dość łatwy w użyciu i powinien być w stanie robić, co chcesz.

Będzie wyglądać następująco:

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

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

submit('0')

Możesz użyć, showforms()aby wyświetlić wszystkie formularze po przejściu go…do witryny, do której chcesz się zalogować. Po prostu wypróbuj to z interpretera Pythona.

Leniwiec
źródło
zwróć uwagę, że w niektórych przypadkach musisz użyć metody przesyłania (). zobacz: lists.idyll.org/pipermail/twill/2006-August/000526.html Potwierdzam ten problem, logując się do www.pge.com, używając aplikacji submit () works.
user391339,
2
Czy istnieje rozwiązanie dla Pythona 3.6? Wygląda na to, że twill nie obsługuje Pythona 3.5 ani 3.6. Próbowałem go pobrać i przekonwertować za pomocą, 2to3ale teraz otrzymuję ModuleNotFoundError, próbując go zaimportować.
CGFoX
Właściwie mógłbym rozwiązać problem ModuleNotFoundError, używając / konwertując Twill 1.8.0 i instalując lxmli requestsz pip install. Ale teraz dostaję, SyntaxErrorkiedy próbuję importować, ponieważ gdzieś False = 0....
CGFoX
2
Naprawianie tego
To działa z HTTPS czy muszę coś zrobić jak to ?
Mahesha999
51

Spróbuję to uprościć, przypuśćmy, że adres URL witryny to www.example.com i musisz się zarejestrować, wypełniając nazwę użytkownika i hasło, więc przechodzimy do strony logowania, na przykład http://www.example.com/login .php i przejrzyj jego kod źródłowy i wyszukaj adres URL akcji, który będzie w formie tagu podobnego do

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

teraz weź userinfo.php, aby utworzyć bezwzględny adres URL, który będzie „ http://example.com/userinfo.php ”, teraz uruchom prosty skrypt Pythona

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

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

Mam nadzieję, że to kiedyś komuś pomoże.

Tarun Venugopal Nair
źródło
to nie działa w przypadku większości stron internetowych, które wypróbowałem
Anurag Pandey
Spośród dwóch tuzinów stron pomocy / stackoverflow, które obejrzałem, było to jedyne rozwiązanie, które działało w jednej witrynie, której potrzebowałem.
Boja
najlepszym wyborem do automatyzacji sieci jest webbot. stackoverflow.com/a/51170181/6665568
Natesh bhat
Czy wszystkie wartości to zawsze nazwa użytkownika i hasło? Wydaje mi się, że to nie działa w przypadku mojej wybranej witryny.
Dylan Logan
@DylanLogan Zawsze musisz sprawdzać, co rzeczywista strona wysyła na serwer i dostosowywać do niej swój skrypt. Serwer nie powinien być w stanie odróżnić skryptu od przeglądarki internetowej.
Jeyekomon,
28

Zazwyczaj do zalogowania się na stronie potrzebne są pliki cookie, co oznacza cookielib, urllib i urllib2. Oto klasa, którą odpisałem, gdy grałem w gry internetowe na Facebooku:

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

Niekoniecznie będziesz potrzebować obsługi HTTPS lub przekierowania, ale nie zaszkodzą, a to sprawia, że ​​otwieracz jest znacznie bardziej niezawodny. Możesz również nie potrzebować plików cookie, ale trudno to stwierdzić na podstawie opublikowanego formularza. Podejrzewam, że możesz, wyłącznie na podstawie komentarza „Zapamiętaj mnie”.

Anthony Briggs
źródło
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

Więcej informacji można znaleźć pod adresem : https://docs.python.org/2/library/urllib2.html

blokeley
źródło
Link nie działa: a 2został dodany w docs.python.orgadresach URL: docs.python.org/2/library/urllib2.html
Michael Kopp
18

Automatyzacja strony internetowej? Zdecydowanie „webbot”

webbot działa nawet na stronach internetowych, które mają dynamicznie zmieniające się identyfikatory i nazwy klas oraz mają więcej metod i funkcji niż selen czy mechanize.

Oto fragment :)

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

Dokumentacja jest również dość prosta i prosta w użyciu: https://webbot.readthedocs.io

Natesh bhat
źródło
Ten przykład działa świetnie. Czy to zadziała również w przypadku, gdy autocomplete=off.?
S Andrew,
nie instalować na win 64 bit. Błąd:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa
Spróbuj użyć python3
Natesh bhat
Jak obsługiwać ramkę iframe w webbocie.? To znaczy, że muszę zamknąć ramkę iframe, która wyskakuje po załadowaniu strony ...
arihanth jain
7

Generalnie strony internetowe mogą sprawdzać autoryzację na wiele różnych sposobów, ale ta, na którą kierujesz swoje reklamy, wydaje się dość łatwa.

Wszystko czego potrzebujesz to POSTdo auth/loginURL formą kodowane blob z różnych dziedzin widać tam (zapomnieć etykiety for, są ozdoby dla ludzi odwiedzających). handle=whatever&password-clear=pwdi tak dalej, o ile znasz wartości uchwytu (e-mail AKA) i hasło, wszystko powinno być w porządku.

Przypuszczalnie POST przekieruje Cię na stronę "pomyślnie zalogowałeś się" z Set-Cookienagłówkiem potwierdzającym Twoją sesję (pamiętaj, aby zapisać ten plik cookie i wysłać go z powrotem podczas dalszej interakcji podczas sesji!).

Alex Martelli
źródło