Se connecter à Facebook en utilisant les requêtes python

j'essaie de trouver un moyen de me connecter automatiquement à Facebook sans navigateur en utilisant Python. J'ai expérimenté avec" requests " lib. Essayé plusieurs façons:

URL = 'http://m.facebook.com'
requests.get(URL, auth = ('email@domain.com', 'mypassword'))

...

form_data = {'email': 'email@domain.com',
             'pass' : 'mypassword'
            }
requests.post(URL, data = form_data)

...

requests.post(URL + '?email=email@domain.com&pass=mypassword')

la dernière méthode remplit la boîte " email "sur une page mais la boîte" pass " reste vide...

est-ce que quelqu'un pourrait m'aider avec ça s'il vous plaît? Est-il possible d'émuler la connexion FB en utilisant des requêtes?

Merci!

27
demandé sur alexryabkov 2014-02-21 11:48:19

9 réponses

Vous devez envoyer un formulaire complet. La façon la plus simple de savoir ce que Facebook attend est d'utiliser quelque chose comme les outils de développement de Google Chrome pour surveiller vos requêtes web.

pour vous faciliter la vie, J'ai suivi mon propre login sur Facebook, et je l'ai reproduit ci-dessous (avec des informations privées censurées, évidemment) avec des informations sans importance:

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

comme vous pouvez le voir, le formulaire contient beaucoup de champs. Tous doivent être fournies pour vous permettre de vous connecter. Le courriel et le mot de passe seront fournis par votre code. Les autres champs ont en fait leurs valeurs définies par le HTML que Facebook vous sert. Cela signifie, pour émuler un navigateur de connexion, vous devez effectuer les étapes suivantes:

  1. Faire un GET sur la page de connexion (https://m.facebook.com/)
  2. utilisez une bibliothèque D'analyse HTML (par exemple BeautifulSoup) pour analyser le HTML et trouver les valeurs par défaut des champs de formulaire.
    • Les valeurs par défaut sont le tout dans <input> éléments HTML ci-dessous le #login_form élément. Vous voudrez les trouver par leur nom (par exemple charset_test) et ensuite tirer leur value l'attribut.
    • trouver comment faire cela dépasse la portée de cette réponse, donc je ne vais pas y entrer.
  3. combinez les valeurs par défaut des champs de formulaire avec votre email et votre mot de passe, comme suit:

    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. envoyer votre login en utilisant une requête Session:

    s = requests.Session()
    r = s.post(url, data=data)
    r.raise_for_status()
    
  5. envoyez tout votre futur trafic HTTP à travers ce Session.

comme vous pouvez le voir, c'est une façon non triviale de faire les choses. C'est parce qu'on ne s'attend pas à ce que les programmes utilisent le site web pour se connecter: au lieu de cela, on s'attend à ce que vous utilisiez leur SDK ou leurs API web à la place.

21
répondu Lukasa 2014-02-21 09:43:52

je suis également à la recherche de la réponse. De le faire avec requests c'est de la douleur. Donc, j'ai utilisé mécaniser.

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

Cela fonctionne. mechanize.browser est un navigateur émulé, donc vous n'avez pas besoin d'envoyer toutes les valeurs du formulaire. Il les enverra comme navigateur normal, vous devez fournir seulement login et mot de passe.



Bonne chance!

14
répondu rzaaeeff 2015-11-11 09:52:01

Une bibliothèque comme RoboBrowser rend les choses comme se connecter à Facebook très facile:

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
répondu Jon McClung 2016-06-22 02:02:11

tout d'Abord, vous avez besoin d' les données du formulaire. Vous ne pouvez pas simplement envoyer user+pass, le serveur ne le permettra pas.

Deuxièmement, vous aurez besoin de prendre soin et d'utiliser les cookies reçus de Facebook afin que cela fonctionne.

Mais dans l'ensemble, oui, vous pouvez utiliser request ou toute autre bibliothèque.

Mais je vous recommande d'utiliser leur API à la place.

2
répondu Torxed 2014-02-21 07:58:41

je peux dire que c'est assez ennuyeux de se connecter à Facebook sans utiliser leur API. Ils aiment aussi tout changer si souvent que c'est tout à fait le travail de maintenir le code.

j'ai fait ça il y a longtemps, mais je ne pense pas que mon code est jusqu'à la vitesse actuelle Facebook. Toutefois, il devrait s'agir d'un point de départ utile:

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

Il dispose de deux pièces, une webcrawler et un Facebook-gestionnaire (le dernier est ce qui vous intéresse).

un problème majeur que vous avez dans votre code est que vous devez d'abord visiter Facebook, parce qu'ils vous envoient un formulaire de connexion avec des éléments cachés que vous devez renvoyer.

1
répondu deinonychusaur 2014-02-21 09:44:17

comme dit par d'autres qui utilisent des requêtes est une douleur. Vous pouvez le faire en utilisant le sélénium. Installez selenium en allant sur leur site web ou simplement en utilisant pip.

pip install -U selenium

j'ai écrit le code ci-dessous. Je l'ai essayé moi-même et ça fonctionne.

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
répondu user2631276 2016-11-10 13:00:34

Cela fonctionne (avril 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
répondu Pablo 2017-04-18 13:24:40

Voici mon code de travail (mai 2017 Python 3.6). Pour que cela fonctionne pour vous, il suffit de coder votre propre nom D'utilisateur, mot de passe et mot de passe protégé

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

USERNAME = '-----@yahoo.com'
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 __name__ == "__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
1
répondu Sam Arthur Gillam 2017-05-15 15:55:19

vous devez d'Abord connaître les données à publier. Suivez ce lien.

après avoir obtenu toutes les données requises le code est simple comme suit:

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

Cela a fonctionné pour moi.

0
répondu durga prasad paidi 2018-06-11 09:22:58