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?

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.


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


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.


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

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”.


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

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


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

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


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!).


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.