Python 以编程方式获取用于使用Facebook Graph API的访问令牌
我正在尝试编写一个bash或python脚本来使用facebook图形API。使用API看起来很简单,但在bash脚本中设置curl以调用authorize和access_令牌时遇到了问题。有人有一个有效的例子吗?以下是例子。试着在命令行上运行一些,它们对我来说很好。另请参见-您首先需要。然后,根据您的应用程序ID和密码,以下内容将吐出一个访问令牌:Python 以编程方式获取用于使用Facebook Graph API的访问令牌,python,bash,facebook,Python,Bash,Facebook,我正在尝试编写一个bash或python脚本来使用facebook图形API。使用API看起来很简单,但在bash脚本中设置curl以调用authorize和access_令牌时遇到了问题。有人有一个有效的例子吗?以下是例子。试着在命令行上运行一些,它们对我来说很好。另请参见-您首先需要。然后,根据您的应用程序ID和密码,以下内容将吐出一个访问令牌: > curl -F type=client_cred -F client_id=[...] -F client_secret=[...] h
> curl -F type=client_cred -F client_id=[...] -F client_secret=[...] https://graph.facebook.com/oauth/access_token
由于实际授权需要涉及web浏览器,因此不存在“独立脚本”这样的东西来完成这一切。如果您只是在玩API,或者自己编写脚本来自动化某个东西,并且想要一个不会过期的
access\u token
,您可以在这里获取一个:有一种方法可以做到,我已经找到了,但是这需要大量的工作,需要您100%地欺骗浏览器(你可能会违反他们的服务条款)
对不起,我不能提供所有细节,但要点是:
主要的问题是cookie管理和重定向。基本上,你必须100%模仿浏览器。我认为这是黑客行为,但有一种方法,这真的很难!更新2018-08-23 由于这仍然会获得一些视图和投票,我只想指出,到目前为止,似乎存在一个维护的第三方SDK:
迟做总比不做强,也许其他搜索者会找到它。我在MacBook上用Python2.6获得了它 这需要你有
- 已安装Python facebook模块:
- 一个真实的Facebook应用程序
- 你想发布到的个人资料必须授予适当的权限,允许阅读和写作等所有不同的内容
#!/usr/bin/python
# coding: utf-8
import facebook
import urllib
import urlparse
import subprocess
import warnings
# Hide deprecation warnings. The facebook module isn't that up-to-date (facebook.GraphAPIError).
warnings.filterwarnings('ignore', category=DeprecationWarning)
# Parameters of your app and the id of the profile you want to mess with.
FACEBOOK_APP_ID = 'XXXXXXXXXXXXXXX'
FACEBOOK_APP_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
FACEBOOK_PROFILE_ID = 'XXXXXX'
# Trying to get an access token. Very awkward.
oauth_args = dict(client_id = FACEBOOK_APP_ID,
client_secret = FACEBOOK_APP_SECRET,
grant_type = 'client_credentials')
oauth_curl_cmd = ['curl',
'https://graph.facebook.com/oauth/access_token?' + urllib.urlencode(oauth_args)]
oauth_response = subprocess.Popen(oauth_curl_cmd,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE).communicate()[0]
try:
oauth_access_token = urlparse.parse_qs(str(oauth_response))['access_token'][0]
except KeyError:
print('Unable to grab an access token!')
exit()
facebook_graph = facebook.GraphAPI(oauth_access_token)
# Try to post something on the wall.
try:
fb_response = facebook_graph.put_wall_post('Hello from Python', \
profile_id = FACEBOOK_PROFILE_ID)
print fb_response
except facebook.GraphAPIError as e:
print 'Something went wrong:', e.type, e.message
获取令牌时进行错误检查可能更好,但您知道该怎么做。简单!只需使用即可
给你,尽可能简单。不需要任何第三方SDK等 确保安装了Python“请求”模块
s29的答案正确,但仍有一些步骤需要解决。以下脚本演示了使用Facebook SDK获取访问令牌的工作脚本:
__requires__ = ['facebook-sdk']
import os
import facebook
def get_app_access_token():
client = facebook.GraphAPI()
return client.get_app_access_token(
os.environ['FACEBOOK_APP_ID'],
os.environ['FACEBOOK_APP_SECRET'],
)
__name__ == '__main__' and print(get_app_access_token())
此脚本要求将FACEBOOK_APP_ID和FACEBOOK_APP_SECRET环境变量设置为应用程序的值。请随意调整该技术以从其他源加载这些值
您必须首先(
pip安装facebook sdk;python get token.py
)或使用其他工具调用脚本(rwt--get token.py
).谢谢,我看到了,但我正在寻找一个独立的脚本。这是Django应用程序的一部分,不是吗?github repo已被删除链接对这个问题没有帮助。@daaku因此,为了为用户重新生成过期的访问令牌,我需要将他们的web浏览器重定向到Facebook(我猜Facebook可以读取自己的cookies来识别用户)?不推荐,我猜他们不想允许使用自动化工具。作为需要开发自动化工具的人,只有领先的网站才能开发oauth,这是一个令人不安的举动……官方的举动!你可以从GitHub获得:我更新了答案以包含链接。不过,谢谢“此SDK已弃用。”举个例子,它认为此SDK也几乎毫无用处-我建议使用“请求”“用于http通信的Python库:FacebookSDK的死链接无论如何都不起作用,因为现在给出的响应是一个JSON文档,而不是一个查询字符串。嘿,用这样的代码存储app_secret安全吗?facebook文档明确指出“同样,出于安全考虑,应用程序访问令牌永远不应硬编码到客户端代码中,这样做将使加载您的网页或反编译您的应用程序的所有人都能够完全访问您的应用程序机密,从而能够修改您的应用程序。"不,你不应该在客户端代码中包含应用程序机密。但这里的问题意味着交互/服务器使用,而不是客户端代码。这个答案是最好的答案,但可以通过提供实际工作代码来显著改进。特别是,指向facebook SDK的“安装”文档,然后演示如何导入facebook,构造一个客户端对象,然后对该对象调用get\u app\u access\u token
。哇,理论上这听起来很好,你在python中做过类似的事情吗?result=file.text.split(=”[1]索引器:列表索引超出范围
在撰写本文时,该端点返回JSON,所以更改result=file.text.split(=”)[1]
toresult=file.json()['access\u token']
这并没有获得完整的token!只是其中的一部分!这不是真的-它获得了完整的访问token,与官方的facebook sdk相同(见下面的答案)。为什么它比您通过web fb dev页面获得的访问令牌短:这些是长期访问令牌,您通过web获得的访问令牌是短期访问令牌
import requests
def get_fb_token(app_id, app_secret):
url = 'https://graph.facebook.com/oauth/access_token'
payload = {
'grant_type': 'client_credentials',
'client_id': app_id,
'client_secret': app_secret
}
response = requests.post(url, params=payload)
return response.json()['access_token']
__requires__ = ['facebook-sdk']
import os
import facebook
def get_app_access_token():
client = facebook.GraphAPI()
return client.get_app_access_token(
os.environ['FACEBOOK_APP_ID'],
os.environ['FACEBOOK_APP_SECRET'],
)
__name__ == '__main__' and print(get_app_access_token())