使用python请求login到Facebook
我试图find一种方法来自动login到Facebook没有浏览器使用Python。 我尝试了“请求”库。 试过几种方法:
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')
最后一种方法填充页面上的“电子邮件”框,但“通过”框仍然是空的…
有人可以帮我吗? 有没有可能使用请求来模拟FBlogin?
谢谢!
你需要发送一个完整的表格。 了解Facebook所期望的最简单的方法就是使用Google Chrome的开发者工具来监控您的networking请求。
为了让你的生活更轻松,我监视了自己在Facebook上的login信息,并在下面重新显示(显然,私人信息被编辑了),剥去了不重要的信息:
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
正如你所看到的,表单包含了很多字段。 所有这些都需要提供,以便您login。电子邮件和密码将由您的代码提供。 其余的字段实际上是由Facebook为您提供的HTML设置的。 这意味着,要模拟浏览器login,您需要执行以下步骤:
- 做一个GETlogin页面(
https://m.facebook.com/
) - 使用HTMLparsing库(例如BeautifulSoup)来parsingHTML并find表单字段的默认值。
- 默认值全部位于
#login_form
元素下方的<input>
HTML元素中。 你会想find他们的名字(例如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
发送您的login信息:s = requests.Session() r = s.post(url, data=data) r.raise_for_status()
-
通过该
Session
发送所有未来的HTTPstream量。
正如你所看到的,这是一个不平凡的做事方式。 这是因为预计程序不会使用该网站login:相反,您需要使用他们的SDK或他们的Web API 。
我也在寻找答案。 这样做与requests
是痛苦的。 所以,我使用机械化。
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
是模拟浏览器,所以你不需要发送所有的表单值。 它会将它们作为普通浏览器发送,您只应提供login名和密码。
祝你好运!
像RoboBrowser这样的库使得login到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)
首先,你需要所有的表格数据。 你不能只发送用户+通过,服务器将不会允许它。
其次,您需要注意并使用从Facebook接收的cookies以使其正常工作。
但总而言之,是的,您可以使用request
或任何其他库。
但我会推荐使用他们的API来代替。
我可以说,在不使用他们的API的情况下login到Facebook是非常烦人的。 他们也喜欢经常改变一切,维护代码是相当的工作。
我前一阵子做了这个,但是我不认为我的代码和当前的Facebook一样快。 但是,它应该是一个有用的起点:
https://gitorious.org/blogsmashonfb/blogsmashonfb/source/4f7ee94a56fdffe9392485df8999e340f97f4bbe :
它有两个部分,一个web爬行器和一个Facebook处理程序(后者是你感兴趣的)。
您在代码中遇到的一个主要问题是,您必须先访问Facebook,因为它们会向您发送一个隐藏元素的login表单,您需要将其发回。
正如其他人所说的使用请求是一个痛苦。 你可以用selenium来做。 通过访问他们的网站安装selenium或简单地使用点子来安装它。
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()
这个工程(2017年4月)
#!/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
这是我的工作代码(2017年5月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 = '-----@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
- 寻找page_stories_by_story_type&page_consumptions_by_consumption_type的types详情
- 从ASP.NET MVC 5中的Facebook v2.4 API访问OAuth ExternalLoginCallback中的电子邮件地址
- 我是新的如何让我的应用程序生活在FB上
- Facebook页面访问令牌 – 这些过期吗?
- 什么是获得持久令牌从服务器发布到Facebook粉丝页的步骤
- Facebook SDK 4.10上的NPE:尝试调用空对象引用上的接口方法java.lang.Object com.facebook.inject.Lazy.get()
- 我在哪里可以find我的Facebook应用程序ID和密钥?
- 如何在Mac中为facebook SDK生成Key Hash
- iOS 9 Facebooklogin模拟器-canOpenURL:URL失败:“fbauth2:///” – 错误:“(null)”