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安装了最新版本.
您可以假设您不能使用应用程序访问令牌来读取用户的邮箱,但是您所获得的错误源于您根本没有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)
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)
| 归档时间: |
|
| 查看次数: |
2433 次 |
| 最近记录: |