Войдите в Facebook, используя запросы python
Я пытаюсь найти способ автоматического входа в Facebook без браузера с помощью Python. Я экспериментировал с "запросами" lib. Пробовал несколько способов:
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')
Последний метод заполняет поле "электронная почта" на странице, но поле "передать" остается пустым...
Может ли кто-нибудь помочь мне с этим, пожалуйста? Можно ли эмулировать логирование FB с помощью запросов?
Спасибо!
Ответы
Ответ 1
Вам нужно отправить полную форму. Самый простой способ узнать, что ожидает Facebook, - использовать инструменты разработчика Google Chrome для отслеживания ваших веб-запросов.
Чтобы упростить вашу жизнь, я отслеживал свой собственный логин на Facebook и воспроизводил его ниже (с личной информацией, отредактированной, очевидно), с несущественной информацией:
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
Как вы можете видеть, форма содержит много полей. Все они должны быть предоставлены, чтобы вы могли войти. Электронная почта и пароль будут предоставлены вашим кодом. Остальные поля на самом деле имеют свои значения, установленные HTML, которые Facebook вам обслуживает. Это означает, что для эмуляции входа в браузер вам необходимо выполнить следующие шаги:
- Сделайте GET на странице входа (
https://m.facebook.com/
)
- Используйте библиотеку разбора HTML (например, BeautifulSoup) для анализа HTML и поиска значений по умолчанию полей формы.
- Значения по умолчанию находятся в
<input>
HTML-элементах под элементом #login_form
. Вы захотите найти их по имени (например, charset_test
), а затем вытащите их атрибут value
.
- Разработка того, как это сделать, выходит за рамки этого ответа, поэтому я не собираюсь в нее входить.
-
Объедините значения по умолчанию полей формы с вашей электронной почтой и паролем, например:
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'
-
Отправьте свой логин, используя запрос Session
:
s = requests.Session()
r = s.post(url, data=data)
r.raise_for_status()
-
Отправляйте весь ваш будущий HTTP-трафик через Session
.
Как вы можете видеть, это нетривиальный способ делать вещи. Это потому, что не ожидалось, что программы будут использовать веб-сайт для входа: вместо этого вы должны использовать SDK или их веб-API.
Ответ 2
Я также искал ответ. Выполнение этого с помощью requests
- боль. Итак, я использовал mechanize.
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()
Это работает. mechanize.browser
- это эмулированный браузер, поэтому вам не нужно отправлять все значения форм. Он отправит их как обычный браузер, вы должны указать только логин и пароль.
Удачи!
Ответ 3
Библиотека, подобная RoboBrowser, позволяет легко входить в 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)
Ответ 4
Вот мой рабочий код (май 2017 г. Python 3.6). Чтобы это сработало для вас, просто скопируйте свой собственный USERNAME, PASSWORD и 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 __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
Ответ 5
Прежде всего вам нужны ВСЕ данные формы. Вы не можете просто отправить пароль пользователя +, сервер не разрешит его.
Во-вторых, вам нужно будет позаботиться и использовать куки, полученные от Facebook, чтобы это работало.
Но в целом, да, вы можете использовать request
или любую другую библиотеку.
Но я бы рекомендовал вместо этого использовать их API.
Ответ 6
Я могу сказать, что это очень раздражает, чтобы войти в Facebook, не используя свой API. Они также любят менять все так часто, что это хорошая работа по поддержанию кода.
Я сделал это некоторое время назад, но я не думаю, что мой код ускоряется с текущим Facebook. Однако это должно быть полезной отправной точкой:
https://gitorious.org/blogsmashonfb/blogsmashonfb/source/4f7ee94a56fdffe9392485df8999e340f97f4bbe:
Он состоит из двух частей: веб-браузера и Facebook-обработчика (последнее вас интересует).
Одна из основных проблем, которые у вас есть в вашем коде, заключается в том, что вы должны сначала посетить Facebook, потому что они отправляют вам форму входа со скрытыми элементами, которые вам нужно отправить назад.
Ответ 7
Как говорят другие, использование запросов - боль. Вы можете сделать это, используя селен. Установите селен, перейдя на их сайт или просто не используя его.
pip install -U selenium
Я написал код ниже. Я попробовал это сам, и он работает.
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()
Ответ 8
Это работает (апрель 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
Ответ 9
Сначала вы должны знать данные для публикации. Перейдите по этой ссылке.
После того, как вы получите все необходимые данные, код выглядит следующим образом:
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
Это сработало для меня.
Ответ 10
Прочитай это. Вот правильное объяснение входа в Facebook с использованием Python