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!
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:
https://m.facebook.com/
)<input>
sous l'élément #login_form
. Vous voudrez les trouver par leur nom (par exemple, charset_test
), puis extrayez leur attribut value
.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'
Envoyez votre identifiant en utilisant une requête Session
:
s = requests.Session()
r = s.post(url, data=data)
r.raise_for_status()
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 .
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!
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)
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
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.
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.
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
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()
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.