1

我正在使用facepy facebook graph API来访问我的邮箱/消息,我遵循以下两种方法:

第一种方法:

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

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,然后使用facepy的 get_application_access_token 方法来获取令牌。

检索我使用的令牌后:

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 #使用应用程序令牌时生成的 error()。

我相信我得到的错误是因为 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 安装了最新版本。

4

2 回答 2

6

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

尽管如此,您在询问如何扩展用户的访问令牌方面是正确的。正如您已经发现的那样,Facepy HEAD(即将发布 0.9 版)具有get_extended_access_token接受现有短期用户访问令牌并对其进行扩展的功能。扩展的用户访问令牌持续 2 个月,您可以在 Facebook 的关于删除 offline_access 权限的文档中阅读更多关于它们的信息。

如果你想立即使用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')
于 2012-10-01T16:13:18.053 回答
5

API没有任何问题,您只是没有以正确的方式解释结果。如果您尝试打印它的结果,long_lived_access_token = get_extended_access_token(token)它不会直接给您 along_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=5184000where5184000意味着 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')
于 2012-10-02T08:27:01.490 回答