it-swarm.com.de

Melden Sie sich bei Facebook mit Python-Anfragen an

Ich versuche einen Weg zu finden, um mich automatisch bei Facebook ohne Browser mit Python anzumelden. Ich habe mit "Requests" lib experimentiert. Mehrere Wege ausprobiert:

URL = 'http://m.facebook.com'
requests.get(URL, auth = ('[email protected]', 'mypassword'))

...

form_data = {'email': '[email protected]',
             'pass' : 'mypassword'
            }
requests.post(URL, data = form_data)

...

requests.post(URL + '[email protected]com&pass=mypassword')

Die letzte Methode füllt das "email" -Feld auf einer Seite aus, das "pass" -Feld bleibt jedoch leer ...

Könnte mir bitte jemand dabei helfen? Ist es möglich, das FB-Login mit Anfragen zu emulieren?

Vielen Dank!

29
alexryabkov

Sie müssen ein vollständiges Formular senden. Der einfachste Weg, um herauszufinden, was Facebook erwartet, ist die Verwendung von Google Chrome-Entwicklertools , um Ihre Webanfragen zu überwachen.

Um Ihnen das Leben zu erleichtern, habe ich mein eigenes Login auf Facebook überwacht und es unten (mit offensichtlich unleserlichen Privatinformationen) mit den unwichtigen Informationen wiedergegeben:

Request URL:https://m.facebook.com/login.php?refsrc=https%3A%2F%2Fm.facebook.com%2F&refid=8
Request Method:POST

Form Data:
    lsd:AVqAE5Wf
    charset_test:€,´,€,´,水,Д,Є
    version:1
    ajax:0
    width:0
    pxr:0
    gps:0
    m_ts:1392974963
    li:cxwHUxatQiaLv1nZEYPp0aTB
    email:...
    pass:...
    login:Log In

Wie Sie sehen können, enthält das Formular viele Felder. Alle diese müssen bereitgestellt werden, damit Sie sich anmelden können. E-Mail-Adresse und Passwort werden von Ihrem Code bereitgestellt. Für die übrigen Felder werden die Werte tatsächlich durch den HTML-Code festgelegt, den Facebook Ihnen zur Verfügung stellt. Dies bedeutet, um ein Browser-Login zu emulieren, müssen Sie die folgenden Schritte ausführen:

  1. GET zur Anmeldeseite (https://m.facebook.com/)
  2. Verwenden Sie eine HTML-Analysebibliothek (z. B. BeautifulSoup), um den HTML-Code zu analysieren und die Standardwerte der Formularfelder zu ermitteln.
    • Die Standardwerte befinden sich alle in <input>-HTML-Elementen unterhalb des #login_form-Elements. Sie möchten sie anhand des Namens (z. B. charset_test) suchen und dann ihr value-Attribut abrufen.
    • Das Ausarbeiten dieser Vorgehensweise liegt außerhalb des Rahmens dieser Antwort, daher werde ich nicht darauf eingehen.
  3. Kombinieren Sie die Standardwerte der Formularfelder mit Ihrer E-Mail-Adresse und Ihrem Kennwort wie folgt:

    data = {
        'lsd': lsd,
        'charset_test': csettest, 
        'version': version,
        'ajax': ajax,
        'width': width,
        'pxr': pxr,
        'gps': gps,
        'm_ts': mts,
        'li': li,
    }
    data['email'] = email
    data['pass'] = pass
    data['login'] = 'Log In'
    
  4. Senden Sie Ihr Login mit einer Anfrage Session:

    s = requests.Session()
    r = s.post(url, data=data)
    r.raise_for_status()
    
  5. Senden Sie Ihren zukünftigen HTTP-Datenverkehr über diese Session.

Wie Sie sehen, ist dies eine nicht triviale Vorgehensweise. Dies ist darauf zurückzuführen, dass nicht erwartet wird, dass Programme sich über die Website anmelden. Stattdessen wird stattdessen die Verwendung ihrer SDK oder ihrer Web-API erwartet.

21
Lukasa

Ich habe auch nach Antworten gesucht. Mit requests zu tun, ist Schmerz. Also habe ich mechanize benutzt.

import mechanize
browser = mechanize.Browser()
browser.set_handle_robots(False)
cookies = mechanize.CookieJar()
browser.set_cookiejar(cookies)
browser.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7')]
browser.set_handle_refresh(False)

url = 'http://www.facebook.com/login.php'
self.browser.open(url)
self.browser.select_form(nr = 0)       #This is login-password form -> nr = number = 0
self.browser.form['email'] = YourLogin
self.browser.form['pass'] = YourPassw
response = self.browser.submit()
print response.read()

Es klappt. mechanize.browser ist ein emulierter Browser, sodass Sie nicht alle Formularwerte senden müssen. Es wird als normaler Browser gesendet. Sie sollten nur Login und Passwort angeben. 

Viel Glück!

14
rzaaeeff

Eine Bibliothek wie RoboBrowser macht das Anmelden bei Facebook sehr einfach:

import robobrowser

class Facebook(robobrowser.RoboBrowser):

    url = 'https://facebook.com'

    def __init__(self, email, password):
        self.email = email
        self.password = password
        super().__init__()
        self.login()

    def login(self):
        self.open(self.url)    
        login_form = self.get_form(id='login_form')
        login_form['email'] = self.email
        login_form['pass'] = self.password
        self.submit_form(login_form)
6
Jon McClung

Hier ist mein Arbeitscode (Mai 2017 Python 3.6). Damit es für Sie funktioniert, kodieren Sie einfach Ihren eigenen USERNAME, PASSWORD und PROTECTED_URL

# https://Gist.github.com/UndergroundLabs/fad38205068ffb904685
# this github example said tokens are also necessary, but I found 
# they were not needed
import requests

USERNAME = '[email protected]'
PASSWORD = '----password'
PROTECTED_URL = 'https://m.facebook.com/groups/318395378171876?view=members'
# my original intentions were to scrape data from the group page
# PROTECTED_URL = 'https://www.facebook.com/groups/318395378171876/members/'
# but the only working login code I found needs to use m.facebook URLs
# which can be found by logging into https://m.facebook.com/login/ and 
# going to the the protected page the same way you would on a desktop

def login(session, email, password):
    '''
    Attempt to login to Facebook. Returns cookies given to a user
    after they successfully log in.
    '''

    # Attempt to login to Facebook
    response = session.post('https://m.facebook.com/login.php', data={
        'email': email,
        'pass': password
    }, allow_redirects=False)

    assert response.status_code == 302
    assert 'c_user' in response.cookies
    return response.cookies

if __== "__main__":

    session = requests.session()
    cookies = login(session, USERNAME, PASSWORD)
    response = session.get(PROTECTED_URL, cookies=cookies, 
allow_redirects=False)
    assert response.text.find('Home') != -1

    # to visually see if you got into the protected page, I recomend copying
    # the value of response.text, pasting it in the HTML input field of
    # http://codebeautify.org/htmlviewer/ and hitting the run button
2

Zunächst benötigen Sie ALL die Formulardaten. Sie können nicht nur Benutzer + Pass senden, der Server lässt dies nicht zu.
Zweitens müssen Sie die von Facebook erhaltenen Cookies beachten und verwenden, damit dies funktioniert.

Alles in allem können Sie jedoch request oder eine andere Bibliothek verwenden.
Aber ich würde stattdessen die Verwendung von ihrer API empfehlen.

2
Torxed

Ich kann sagen, dass es ziemlich ärgerlich ist, sich bei Facebook anzumelden, ohne deren API zu verwenden. Sie ändern auch gerne alles so oft, dass es durchaus die Aufgabe ist, den Code zu pflegen. 

Ich habe das vor einiger Zeit getan, aber ich glaube nicht, dass mein Code mit dem aktuellen Facebook auf dem neuesten Stand ist. Es sollte jedoch ein nützlicher Ausgangspunkt sein:

https://gitorious.org/blogsmashonfb/blogsmashonfb/source/4f7ee94a56fdffe9392485df8999e340f97f4bbe :

Es besteht aus zwei Teilen, einem Webcrawler und einem Facebook-Handler (Letzteres ist das, woran Sie interessiert sind).

Ein Hauptproblem, das Sie in Ihrem Code haben, ist, dass Sie zuerst Facebook besuchen müssen, da Sie ein Anmeldeformular mit versteckten Elementen senden, die Sie zurücksenden müssen.

1
deinonychusaur

Das funktioniert (April 2017)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import argparse
import datetime
import json
import logging
import re
import random
import requests
import shutil
from pyquery import PyQuery as pq


def main(username, password):

    logging.basicConfig(filename='imgur2fb.log', level=logging.DEBUG)

    session = requests.session()

    uid, dtsg = login(session, username, password)


def login(session, username, password):

    '''
    Login to Facebook
    '''

    # Navigate to the Facebook homepage
    response = session.get('https://facebook.com')

    # Construct the DOM
    dom = pq(response.text)

    # Get the lsd value from the HTML. This is required to make the login request
    lsd = dom('[name="lsd"]').val()

    # Perform the login request
    response = session.post('https://www.facebook.com/login.php?login_attempt=1', data={
        'lsd': lsd,
        'email': username,
        'pass': password,
        'default_persistent': '0',
        'timezone': '-60',
        'lgndim': '',
        'lgnrnd': '',
        'lgnjs': '',
        'locale':'en_GB',
        'qsstamp': ''
    })

    '''
    Get the users ID and fb_dtsg token. The fb_dtsg token is required when making requests as a logged in user. It
    never changes, so we only need to grab this token once.

    If the login was successful a cookie 'c_user' is set by Facebook. If the login failed, the 'c_user' cookie
    will not be present. This will raise an exception.
    '''
    try:
        uid = session.cookies['c_user']
        dtsg = re.search(r'(type="hidden" name="fb_dtsg" value="([0-9a-zA-Z-_:]+)")', response.text).group(1)

        dtsg = dtsg[dtsg.find("value")+6:]
        dtsg = dtsg[1:-1]

    except KeyError:
        raise Exception('Login Failed!')

    return uid, dtsg



try:
    main(username='*****', password='*****')
except Exception, e:
    logging.exception(e)
    print e
1
Pablo

Wie von anderen Leuten gesagt, Anfragen zu benutzen, ist ein Schmerz. Sie können dies mit Selen tun. Installieren Sie Selenium, indem Sie auf ihre Website gehen oder es einfach nicht mit pip aufrufen.

pip install -U Selenium

Ich habe den Code unten geschrieben. Ich habe es selbst ausprobiert und es funktioniert.

from Selenium.webdriver.firefox.firefox_binary import FirefoxBinary

binary = FirefoxBinary(r'C:\Program Files (x86)\Mozilla Firefox\firefox.exe')
driver = webdriver.Firefox(firefox_binary=binary)
driver.get('https://www.facebook.com/')


username= "your_username"
password = "your_password"

UN = driver.find_element_by_id('email')

UN.send_keys(username)

PS = driver.find_element_by_id('pass')

PS.send_keys(password)

LI = driver.find_element_by_id('loginbutton')

LI.click()
1
user2631276

Zuerst müssen Sie die zu buchenden Daten kennen. Folge diesem Link .

Nachdem Sie alle erforderlichen Daten erhalten haben, ist der Code einfach wie folgt:

import requests, bs4`    
s = requests.Session()
url = 'https://www.facebook.com/login'

res = s.get(url)
form_data = {
        # Copy paste the form data here as a valid python dict
}
s.post(url, data=form_data)

# Now try accessing your profile from sessions object

Das hat bei mir funktioniert.

0