zodiac2k's Blog

Facebook Login via Python Script

Programmierung > Python

Durch die sehr ausgereiften Bibliotheken eignet sich Python sehr gut, um divese Spielereien auszuprobieren. Unter anderem auch das automatisierte Einloggen in Facebook via Script. Es ist aber davon auszugehen, dass Facebook exzessive Scriptnutzung registriert und dies durch Sperrungen unterbinden wird.

Nichtsdestotrotz möchte ich hier ein kleines Experiment vorstellen, dass sich in Facebook einloggt, die Profilseite eines Nutzers öffnet und dessen Heimatstadt ausliest.

Zur Vorbereitung benötigen wir einige Bibliotheken. urllib ist für das Ausführen von HTTP-Requests zuständig und lxml zum parsen und auslesen von Daten aus der HTTP-Response.

import urllib.request
import urllib.parse
import http.cookiejar
import lxml.html

#HTTP Request-Header für POST
header_post = {
    "User-Agent" : "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3",
    "Accept" : "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
    "Accept-Language" : "en-us,en;q=0.7,bn-bd;q=0.3",
    "Accept-Charset" : "utf-8",
    "Content-type": "application/x-www-form-urlencoded",
    "Host": "m.facebook.com"}

#HTTP Request-Header für GET
header_get = {
    "User-Agent" : "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3",
    "Accept" : "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
    "Accept-Language" : "en-us,en;q=0.7,bn-bd;q=0.3",
    "Accept-Charset" : "utf-8",
    "Host": "m.facebook.com"}

#Cookie Handler
cj = http.cookiejar.CookieJar()

Die Loginanfrage wird über eine HTTP-POST Anfrage durchgeführt. Hier werden verschiedene Variablen zur Verifizierung des Logins benötigt und natürlich unsere Emailadresse und Passwort, mit der wir uns anmelden wollen.

#Variablen für Login (POST)
values = {
    'charset_test': '€,´,€,´,水,Д,Є',
    'email': "myemail",
    'pass': "mypassword",
    'login': 'Login'
}

#Kodierung der Variablen
data = urllib.parse.urlencode(values).encode("UTF-8")

req = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
req.addheaders = list(header_post.items())

#Login Request abschicken und Response auswerten
with req.open('https://m.facebook.com/login.php', data) as response:
    pagesrc = response.read()

    #Parser um diverse Seitenelemente auszulesen
    tree = lxml.html.fromstring(pagesrc)
    form = tree.find('.//form')
    refid = form.find('.//input[@name="refid"]').value

Die Profilseite benötigt lediglich ein paar Referenz-Variablen und eine Facebook-ID, dessen Profil geöffnet werden soll. Im Unterschied zum Login ist dies eine GET-Anfrage.

#Facebook-ID
fbid = "myfacebookid"

#Variablen für die Profilseiten Anfrage
values = {
    'ref_component': 'mbasic_home_header',
    'ref_page': 'MFriendsCenterMBasicController'
}

req = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(self.cj))
req.addheaders = list(self.header_get.items())

with req.open('https://m.facebook.com/' + fbid + '?' + urllib.parse.urlencode(values)) as response:
    pagesrc = response.read()

    #Parser
    tree = lxml.html.fromstring(pagesrc)

    #Auslesen der Heimatstadt
    try:
        hometown = tree.find('.//div[@title="Heimatstadt"]')[0][0][1].text_content().strip()
    except:
        print("Fehler beim Auslesen der Heimatstadt!")
        pass

So far...
zodiac2k

Verfasst am 24.02.2016