web-dev-qa-db-fra.com

Connectez-vous à Facebook en utilisant des requêtes python

J'essaie de trouver un moyen de se connecter automatiquement à Facebook sans navigateur à l'aide de Python. J'ai expérimenté des "demandes" lib. Essayé de plusieurs manières:

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]&pass=mypassword')

La dernière méthode remplit la case "email" sur une page mais la case "passer" reste vide ...

Quelqu'un pourrait-il m'aider avec ceci s'il vous plaît? Est-il possible d'émuler une connexion FB à l'aide de demandes?

Merci!

29
alexryabkov

Vous devez envoyer un formulaire complet. Le moyen le plus simple de connaître les attentes de Facebook consiste à utiliser des outils tels que les outils de développement de Google Chrome pour contrôler vos requêtes Web.

Pour vous simplifier la vie, j'ai surveillé ma propre connexion sur Facebook et je l'ai reproduite ci-dessous (avec des informations privées expurgées, évidemment) avec les informations sans importance dépouillées:

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 constater, le formulaire contient de nombreux champs. Tous ces éléments doivent être fournis pour vous permettre de vous connecter. Votre adresse électronique et votre mot de passe vous seront fournis. Les valeurs restantes des champs restants sont définies par le code HTML que Facebook vous sert. Cela signifie que pour émuler une connexion de navigateur, vous devez suivre les étapes suivantes:

  1. Faire un GET à la page de connexion (https://m.facebook.com/)
  2. Utilisez une bibliothèque d’analyse HTML (par exemple, BeautifulSoup) pour analyser le code HTML et rechercher les valeurs par défaut des champs de formulaire .
    • Les valeurs par défaut sont toutes dans les éléments HTML <input> sous l'élément #login_form. Vous voudrez les trouver par leur nom (par exemple, charset_test), puis extrayez leur attribut value.
    • Trouver comment faire est en dehors de la portée de cette réponse, donc je ne vais pas entrer dans les détails.
  3. Combinez les valeurs par défaut des champs de formulaire avec votre adresse électronique 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. Envoyez votre identifiant en utilisant une requête Session:

    s = requests.Session()
    r = s.post(url, data=data)
    r.raise_for_status()
    
  5. Envoyez tout votre trafic HTTP futur via cette Session.

Comme vous pouvez le constater, il s’agit d’une manière non triviale de faire les choses. En effet, il est peu probable que les programmes utilisent le site Web pour se connecter. Vous devez plutôt utiliser leur SDK ou leur web API .

21
Lukasa

Je cherchais aussi une réponse. Le faire avec requests est une 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()

Ça marche. mechanize.browser est un navigateur émulé, vous n’avez donc pas besoin d’envoyer toutes les valeurs de formulaire. Il les enverra en tant que navigateur normal, vous devez fournir uniquement le nom d'utilisateur et le mot de passe. 

Bonne chance!

14
rzaaeeff

Une bibliothèque comme RoboBrowser facilite grandement la connexion à Facebook:

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

Voici mon code de travail (Mai 2017 Python 3.6). Pour que cela fonctionne pour vous, il suffit de coder en dur votre propre USERNAME, PASSWORD et 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

Tout d’abord, vous avez besoin de TOUS les données du formulaire. Vous ne pouvez pas simplement envoyer utilisateur + pass, le serveur ne le permettra pas.
Deuxièmement, vous devrez faire attention et utiliser les cookies reçus de Facebook pour que cela fonctionne.

Mais dans l’ensemble, vous pouvez utiliser request ou n’importe quelle autre bibliothèque.
Mais je recommanderais d'utiliser leur API à la place.

2
Torxed

Je peux dire que c'est assez ennuyant de se connecter à Facebook sans utiliser leur API. Ils aiment aussi tout changer si souvent que la maintenance du code est tout à fait leur tâche. 

Je l'ai fait il y a quelque temps, mais je ne pense pas que mon code soit à la vitesse de l'actuel Facebook. Cependant, cela devrait être un point de départ utile:

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

Il comporte deux parties, un webcrawler et un Facebook-handler (ce dernier est ce qui vous intéresse).

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

1
deinonychusaur

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
Pablo

Comme l'ont dit d'autres utilisateurs de demandes, c'est pénible. Vous pouvez le faire en utilisant Selenium. Installez Selenium en allant sur leur site web ou ne l'utilisez simplement pas avec pip.

pip install -U Selenium

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

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

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
durga prasad paidi