web-dev-qa-db-ja.com

pythonリクエストを使用してFacebookにログイン

Pythonを使用してブラウザなしでFacebookに自動的にログインする方法を見つけようとしています。 「リクエスト」ライブラリを試しました。いくつかの方法を試しました:

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ログインをエミュレートすることは可能ですか?

ありがとう!

31
alexryabkov

完全なフォームを送信する必要があります。 Facebookが期待するものを見つける最も簡単な方法は、 Google Chromeの開発者ツール のようなものを使用してWebリクエストを監視することです。

あなたの人生を楽にするために、私は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

ご覧のとおり、フォームには多くのフィールドが含まれています。ログインするには、これらすべてを提供する必要があります。電子メールとパスワードはコードで提供されます。残りのフィールドには、実際にFacebookが提供するHTMLによって設定された値があります。つまり、ブラウザログインをエミュレートするには、次の手順を実行する必要があります。

  1. ログインページにGETします(https://m.facebook.com/
  2. HTML解析ライブラリ(BeautifulSoupなど)を使用して、HTMLを解析し、フォームフィールドのデフォルト値を見つけます。
    • デフォルト値はすべて、<input>要素の下の#login_form HTML要素にあります。名前(たとえば、charset_test)でそれらを見つけてから、value属性を引き出します。
    • これを行う方法を見つけることはこの回答の範囲外であるため、ここでは説明しません。
  3. 次のように、フォームフィールドのデフォルト値を電子メールとパスワードと組み合わせます。

    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. リクエストSessionを使用してログインを送信します。

    s = requests.Session()
    r = s.post(url, data=data)
    r.raise_for_status()
    
  5. Sessionを介して将来のすべてのHTTPトラフィックを送信します。

ご覧のとおり、これは物事を行うための重要な方法です。これは、プログラムがログインするためにWebサイトを使用することは想定されていないためです。代わりに、 [〜#〜] sdk [〜#〜] または web API 代わりに。

24
Lukasa

私も答えを探していました。 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はエミュレートされたブラウザなので、すべてのフォーム値を送信する必要はありません。通常のブラウザとして送信されます。ログインとパスワードのみを提供する必要があります。

幸運を祈ります!

14
rzaaeeff

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)
6
Jon McClung

ここに私の作業コードがあります(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 = '[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
4

まず、[〜#〜] all [〜#〜]フォームデータが必要です。 user + passを送信することはできません。サーバーは許可しません。
次に、Facebookから受信したCookieを注意して使用して、これが機能するようにする必要があります。

しかし、全体として、はい、requestまたは他のライブラリを使用できます。
しかし、代わりに their API を使用することをお勧めします。

2
Torxed

リクエストを使用する他の人が言ったように苦痛です。 Seleniumを使用して実行できます。 WebサイトにアクセスしてSeleniumをインストールするか、単にpipを使用してインストールします。

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()
2
user2631276

APIを使用せずにFacebookにログインするのは非常に面倒です。彼らはまた、すべてを頻繁に変更したいので、コードを維持するのは非常に仕事です。

私は少し前にこれをやったが、私のコードが現在のFacebookに追いついているとは思わない。しかし、それは有用な出発点であるべきです:

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

WebクローラーとFacebookハンドラーの2つの部分があります(後者はあなたが興味を持っているものです)。

コードにある大きな問題の1つは、最初にFacebookにアクセスする必要があることです。Facebookは、送信する必要がある非表示の要素を含むログインフォームを送信するためです。

1
deinonychusaur

まず、投稿するデータを知る必要があります。 このリンク に従ってください。

必要なデータをすべて取得すると、コードは次のように簡単になります。

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

これは私のために働いた。

0

これは機能します(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
0
Pablo