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!
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:
- Faire un GET sur la page de connexion (
https://m.facebook.com/
) - 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 exemplecharset_test
) et ensuite tirer leurvalue
l'attribut. - trouver comment faire cela dépasse la portée de cette réponse, donc je ne vais pas y entrer.
- Les valeurs par défaut sont le tout dans
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'
envoyer votre login en utilisant une requête
Session
:s = requests.Session() r = s.post(url, data=data) r.raise_for_status()
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.
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!
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)
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.
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.
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()
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
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
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.