我正在使用 facepy facebook graph API访问我的邮箱/消息,我遵循以下两种方法:
第一种方法:
我使用了从Graph Explorer facebook 页面获得的access token 并使用以下代码:
from facepy import GraphAPI
graph = GraphAPI(token)
print graph.get('/me')
#Rest of the code
上面的代码运行良好,我能够使用 FQL 查询 检索我的所有消息。当我的 auth_token expired 一段时间后出现问题。
因此,在谷歌搜索之后,我转向了方法二:
现在,我所做的是创建一个 facebook 应用程序,赋予它 read_mailbox 权限并获得它的 id 和 key 然后使用 get_application_access_token facepy获取token的方法。
取回我使用的 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
现在,您可以看到使用应用程序 token 时生成的错误(注释#)。
我认为我得到的错误是因为 facebook 需要 user_token 而我正在为它提供 app_token。
那么,是否可以使用 app_token 访问用户数据,如果不能,如何发布可以访问用户数据的扩展 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安装了最新版本。
请您参考如下方法:
您的假设是正确的,即您不能使用应用程序访问 token 来读取用户的邮箱,但您收到的错误源于您尚未初始化 graph访问 token 。
尽管如此,您在询问如何扩展用户的访问 token 方面走在了正确的轨道上。正如您已经发现的那样,Facepy HEAD(即将成为 0.9 版)有一个函数 get_extended_access_token,它接受现有的短期用户访问 token 并扩展它。延长的用户访问 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 后,您可以扩展现有的短期用户访问 token 并使用它初始化 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')
