Python:Facebook API显示无效令牌

2024-03-28 22:48:15 发布

您现在位置:Python中文网/ 问答频道 /正文

{I/am使用以下两种方法访问我的邮箱:

第一种方法:

我使用了access token我从Graph Explorerfacebook页面获得的access token,并使用以下代码:

from facepy import GraphAPI
graph = GraphAPI(token)
print graph.get('/me')
#Rest of the code

上面的代码运行得很好,我可以使用FQL Query检索我的所有消息。当我的认证令牌expired过了一段时间后,问题就出现了。在

所以,在谷歌上搜索了一下之后,我转到了第二种方法:

现在,我所做的就是创建一个facebook应用程序给它read_mailbox权限并获得id and key,然后使用facepy的get_application_access_token方法来获取令牌。在

取回我使用的令牌后:

^{pr2}$

现在,您可以看到在使用应用程序令牌时生成的错误(commented #)。在

我相信我得到的错误是因为facebook需要user_token,而我提供给它的是app_token。在

那么,是否可以使用app_令牌访问用户数据?如果没有,那么如何发出一个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),得到了与上面相同的异常/错误。在

所以,这是一个错误还是我做错了什么。在

附言:我从git安装了最新版本。在


Tags: 方法fromimporttokenappextendedgetfacebook
2条回答

您的假设是正确的,您不能使用应用程序访问令牌来读取用户的邮箱,但是您得到的错误源于您根本没有用访问令牌初始化graph。在

尽管如此,您在询问如何扩展用户的访问令牌时是正确的。正如您已经发现的,Facepy-HEAD(即将成为0.9版)有一个函数get_extended_access_token,它接受现有的短期用户访问令牌并扩展它。扩展用户访问令牌的有效期为2个月,您可以在Facebook的文档removal of offline_access permission上阅读更多关于它们的信息。在

如果要立即使用get_extended_access_token,则必须从git安装facepy:

$ pip install git+git://github.com/jgorset/facepy.git@b5153f460f2f52cef9a5e49a3b48b3fb8742356c

一旦安装了正确版本的Facepy,就可以扩展现有的短期用户访问令牌,并用它初始化GraphAPI的新实例:

^{pr2}$

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访问令牌,必须在下面的端点发出请求

^{pr2}$

答案是token=mytoken&expire=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')

相关问题 更多 >