Python:Facebook API显示无效令牌

Ran*_*Rag 1 python facebook facebook-graph-api

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

第一种方法:

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

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

上面的代码工作正常,我能够使用一个来检索我的所有消息FQL Query.一段时间expired后我的auth_token 出现了问题.

所以,经过一些谷歌搜索,我转向接近两个:

现在,我所做的是创建了一个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
Run Code Online (Sandbox Code Playgroud)

现在,您可以看到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')
Run Code Online (Sandbox Code Playgroud)

现在,当我运行上面的代码时,我得到了

TypeError: get_extended_access_token() takes exactly 3 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)

所以,我把它改成long_lived_access_token = get_extended_access_token(token, None, None)

facepy.exceptions.OAuthError
Run Code Online (Sandbox Code Playgroud)

所以,我再次改变它long_lived_access_token = get_extended_access_token(token, app_id, key),我得到了与上面相同的异常/错误.

那么,这是一个错误还是我做错了什么.

PS:我从git安装了最新版本.

Joh*_*set 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
Run Code Online (Sandbox Code Playgroud)

一旦安装了正确版本的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')
Run Code Online (Sandbox Code Playgroud)


Ran*_*Rag 5

API没有任何问题,你只是没有以正确的方式解释结果.如果你试图打印long_lived_access_token = get_extended_access_token(token)它的结果不会直接给你一个long_lived_access_token相反它会为你提供一个内容元组:

long_lived_access_token = ('your token', datetime_object).
Run Code Online (Sandbox Code Playgroud)

您可以通过查看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 
Run Code Online (Sandbox Code Playgroud)

和响应是一样的东西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')
Run Code Online (Sandbox Code Playgroud)

  • @Noob:很高兴听到这个消息.我相信你应该接受`Johannes`的答案,因为他是API的原作者,我所做的就是查看他的'API docs`.所以,功劳必须归功于作者而不是我. (5认同)