7

我需要在自己的Facebook 页面上发布消息;我需要以编程方式进行(在我的情况下使用 Python)。我设法使用此代码(在 Python 中)完成了这一部分:

import urllib, urllib2

access_token='XXXX'
fb_page_id='YYYY' # my page ID

post_data = {'access_token':access_token, 'message':'hey this is a test!'}
request_path = str(fb_page_id)+'/feed'
post_data = urllib.urlencode(post_data)
response = urllib2.urlopen(
    'https://graph.facebook.com/%s' % request_path, post_data
)

FB页面上生成的帖子的ID正确返回:

In [11]: response.readlines()
Out[11]: ['{"id":"135386143198208_461964357207050"}']

问题:

为了生成access_token并发出上面的 API 请求,我必须手动执行此处详述的三个步骤。

但在实践中,这个手动过程是不可接受的,因为我需要从 cron 作业运行这个任务。因此我需要自动化它,因为access_token在 Facebook 中是暂时的。即,每次运行此脚本时,我都需要获取访问令牌。怎么做?

只要您传达所涉及的步骤,请随意在您的答案中使用任何脚本工具(curl、JavaScript、Java、PHP)。请注意,我需要使用任何服务器端语言(Python/Ruby/PHP)来执行此操作。

4

4 回答 4

4

无法以编程方式检索短期令牌。它违背了用户交互的目的。

Facebook 有意采用这种方式来确保用户可以完全手动控制他们安装的应用程序。

一旦用户授予初始访问权限,您就可以将该过程自动化最多两个月(如果用户使令牌无效,例如通过更改密码,则更早)

通过执行 HTTP 请求

https://graph.facebook.com/oauth/access_token?  
    grant_type=fb_exchange_token&           
    client_id=APP_ID&
    client_secret=APP_SECRET&
    fb_exchange_token=SHORT_LIVED_ACCESS_TOKEN 

在这两个月结束后,用户必须重新授予对应用程序的访问权限,并提供一个新的短期令牌,然后您可以使用上面的代码重新扩展该令牌。

于 2013-03-26T17:41:23.737 回答
4

如果您扩展您的(用户)访问令牌,那么您可以请求一个实际上根本不会过期的(页面)访问令牌。

请参阅以下文档的“扩展页面访问令牌”部分:https ://developers.facebook.com/docs/howtos/login/extending-tokens/

于 2013-03-26T22:43:18.673 回答
2

祝福编写此代码的灵魂。不是我,而是在某个地方找到的。工作顺利。使用您的电子邮件和密码调用此函数。

MOBILE_USER_AGENT = "Mozilla/5.0 (Linux; U; en-gb; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.16 Safari/535.19"
FB_AUTH = "https://www.facebook.com/v2.6/dialog/oauth?redirect_uri=fb464891386855067%3A%2F%2Fauthorize%2F&display=touch&state=%7B%22challenge%22%3A%22IUUkEUqIGud332lfu%252BMJhxL4Wlc%253D%22%2C%220_auth_logger_id%22%3A%2230F06532-A1B9-4B10-BB28-B29956C71AB1%22%2C%22com.facebook.sdk_client_state%22%3Atrue%2C%223_method%22%3A%22sfvc_auth%22%7D&scope=user_birthday%2Cuser_photos%2Cuser_education_history%2Cemail%2Cuser_relationship_details%2Cuser_friends%2Cuser_work_history%2Cuser_likes&response_type=token%2Csigned_request&default_audience=friends&return_scopes=true&auth_type=rerequest&client_id=464891386855067&ret=login&sdk=ios&logger_id=30F06532-A1B9-4B10-BB28-B29956C71AB1&ext=1470840777&hash=AeZqkIcf-NEW6vBd"

def get_access_token(email, password):
    s = robobrowser.RoboBrowser(user_agent=MOBILE_USER_AGENT, parser="lxml")
    s.open(FB_AUTH)
    ##submit login form##
    f = s.get_form()
    f["pass"] = password
    f["email"] = email
    s.submit_form(f)
    ##click the 'ok' button on the dialog informing you that you have already authenticated with the Tinder app##
    f = s.get_form()
    s.submit_form(f, submit=f.submit_fields['__CONFIRM__'])
    ##get access token from the html response##
    access_token = re.search(r"access_token=([\w\d]+)", s.response.content.decode()).groups()[0]
    #print  s.response.content.decode()
    return access_token
于 2017-08-01T13:24:10.240 回答
0

要以编程方式为普通用户获取 facebook 令牌,您可能对此感兴趣:https ://github.com/fbessez/Tinder/blob/master/fb_auth_token.py ,这是一个 python 脚本,可在提供电子邮件时自动检索令牌/密码。

确保您已安装并安装lxml,因为这些是先决条件。两者都可以通过跑步轻松获得requestsrobobrowserrequestsrobobrowser

pip install robobrowser

pip install requests

lxml 有点“棘手”,因为它必须被编译(以获得最新版本)。遵循这个 SO:如何在 Ubuntu 上安装 lxml

于 2017-03-08T21:32:21.030 回答