Python:Facebook API显示无效令牌

时间:2012-10-01 15:48:27

标签: python facebook facebook-graph-api

我正在使用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安装了最新版本。

2 个答案:

答案 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')