我正在使用facepy facebook graph API来访问我的邮箱/邮件,我遵循以下两种方法:
第一种方法:
我使用了从access token
脸谱页面获得的Graph Explorer
并使用以下代码:
from facepy import GraphAPI
graph = GraphAPI(token)
print graph.get('/me')
#Rest of the code
以上代码运行正常,我可以使用FQL Query
检索所有邮件。我的auth_token expired
过了一段时间后出现了问题。
所以,经过一些谷歌搜索后,我转向接近两个:
现在,我所做的是创建了一个Facebook应用程序,并获得了read_mailbox
权限,并获得了id and key
,然后使用了get_application_access_token facepy方法来获取令牌。
检索我使用的令牌后:
token = facepy.utils.get_application_access_token(app_id, key)
graph.get('/me')
## OUT: OAuthError: [2500] An active access token must be used to query information about the current user.
facepy.utils.get_extended_access_token(token, app_id, key)
# OUT: OAuthError: [1] No user access token specified
现在,您可以看到使用应用程序令牌时生成的错误(commented #
)。
我相信我得到的错误是因为facebook需要user_token
而我正在提供app_token
。
那么,是否可以使用app_token访问用户数据,如果不是,可以如何发出可以访问用户数据的extended token
。
更新
所以,我遵循@Johannes的建议并尝试了这个,但遇到了错误:
from facepy.utils import get_extended_access_token
from facepy import GraphAPI
token = "My user access token got from https://developers.facebook.com/tools/explorer"
long_lived_access_token = get_extended_access_token(token)
graph = GraphAPI(long_lived_access_token)
graph.get('/me')
现在,当我运行上面的代码时,我得到了
TypeError: get_extended_access_token() takes exactly 3 arguments (1 given)
所以,我将其更改为long_lived_access_token = get_extended_access_token(token, None, None)
并获得了
facepy.exceptions.OAuthError
所以,我再次将其更改为long_lived_access_token = get_extended_access_token(token, app_id, key)
,我得到了与上述相同的异常/错误。
所以,这是一个错误还是我做错了什么。
PS:我从git安装了最新版本。
答案 0 :(得分:6)
您认为不能使用应用程序访问权限来读取用户的邮箱是正确的,但是您所获得的错误源于您尚未使用访问令牌初始化graph
这一事实。所有
尽管如此,你在询问如何扩展用户的访问令牌方面走在正确的轨道上。正如您已经发现的那样,Facepy HEAD(很快将是0.9版本)具有一个函数get_extended_access_token
,它接受现有的短期用户访问令牌并对其进行扩展。扩展用户访问令牌持续2个月,您可以在removal of offline_access permission上的Facebook文档中阅读更多相关信息。
如果您现在要使用get_extended_access_token
,则必须从git安装facepy:
$ pip install git+git://github.com/jgorset/facepy.git@b5153f460f2f52cef9a5e49a3b48b3fb8742356c
一旦安装了正确版本的Facepy,您就可以扩展现有的短期用户访问令牌并使用它初始化GraphAPI
的新实例:
from facepy.utils import get_extended_access_token
from facepy import GraphAPI
long_lived_access_token, expires_at = get_extended_access_token(short_lived_access_token, application_id, application_secret_key)
graph = GraphAPI(long_lived_access_token)
graph.get('/me')
答案 1 :(得分:5)
API没有任何问题,你只是没有以正确的方式解释结果。
如果您尝试打印long_lived_access_token = get_extended_access_token(token)
的结果,则不会直接为您提供long_lived_access_token
,而是会为您提供内容元组:
long_lived_access_token = ('your token', datetime_object).
您可以通过查看utils.py的源代码来验证这一点。如果您查看get_extended_access_token
方法,则会返回token, expires_at
。
根据facebook docs获取extended
访问令牌,必须在以下端点发出请求
https://graph.facebook.com/oauth/access_token?
client_id=APP_ID&
client_secret=APP_SECRET&
grant_type=fb_exchange_token&
fb_exchange_token=EXISTING_ACCESS_TOKEN
,回复类似token=mytoken&expire=5184000
,其中5184000
表示60天。
因此,您的最终代码将类似于:
from facepy.utils import get_extended_access_token
from facepy import GraphAPI
app_id = 'id'
key = 'key'
short_lived_access_token = 'short_token'
long_token = get_extended_access_token(short_token, id, key)
graph = GraphAPI(long_token[0])
print graph.get('/me')