Python:Facebook API显示无效令牌

Python:Facebook API显示无效令牌,python,facebook,facebook-graph-api,Python,Facebook,Facebook Graph Api,我正在使用访问邮箱/邮件,并遵循以下两种方法: 第一次进近: 我使用了从Graph Explorerfacebook页面获得的access令牌,并使用以下代码: from facepy import GraphAPI graph = GraphAPI(token) print graph.get('/me') #Rest of the code 上述代码运行良好,我能够使用FQL查询检索所有消息。当我的身份验证令牌在一段时间后过期时出现问题 因此,在谷歌搜索之后,我转向了方法二: 现在,我所做

我正在使用访问邮箱/邮件,并遵循以下两种方法:

第一次进近:

我使用了从
Graph Explorer
facebook页面获得的
access令牌
,并使用以下代码:

from facepy import GraphAPI
graph = GraphAPI(token)
print graph.get('/me')
#Rest of the code
上述代码运行良好,我能够使用
FQL查询
检索所有消息。当我的身份验证令牌
在一段时间后过期时出现问题

因此,在谷歌搜索之后,我转向了方法二:

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

检索我使用的令牌后:

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
现在,您可以看到在使用应用程序令牌时生成的错误(
注释#

我相信我得到的错误是因为facebook需要
user\u token
,而我正在为它提供
app\u token

那么,是否可以使用app_令牌访问用户数据,如果不可以,如何发布可以访问用户数据的
扩展令牌

更新:

因此,我遵循@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\u live\u access\u token=get\u extended\u access\u token(token,None,None)
,并获得了

facepy.exceptions.OAuthError
因此,我再次将其更改为
long\u live\u access\u token=get\u extended\u access\u token(token,app\u id,key)
,得到了与上述相同的异常/错误

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


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

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

尽管如此,您询问如何扩展用户的访问令牌是正确的。正如您已经发现的,Facepy HEAD(即将成为版本0.9)有一个函数
get_extended_access_token
,它接受现有的短期用户访问令牌并对其进行扩展。扩展用户访问令牌的使用期限为2个月,您可以在Facebook的网站文档中阅读更多关于它们的信息

如果您想立即使用
get\u extended\u access\u 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')

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

尽管如此,您询问如何扩展用户的访问令牌是正确的。正如您已经发现的,Facepy HEAD(即将成为版本0.9)有一个函数
get_extended_access_token
,它接受现有的短期用户访问令牌并对其进行扩展。扩展用户访问令牌的使用期限为2个月,您可以在Facebook的网站文档中阅读更多关于它们的信息

如果您想立即使用
get\u extended\u access\u 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')

API没有什么问题,只是没有以正确的方式解释结果。 如果您尝试打印
long\u live\u access\u token=get\u extended\u access\u token(token)
的结果,它将不会直接为您提供
long\u live\u access\u token
而是为您提供一个包含以下内容的元组:

long_lived_access_token = ('your token', datetime_object).
您可以通过查看的源代码来验证这一点。如果查看
get\u extended\u access\u token
方法,它将返回
token,expires\u at

根据协议,要获得
扩展的
访问令牌,必须在以下端点发出请求

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=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')

API没有什么问题,只是没有以正确的方式解释结果。 如果您尝试打印
long\u live\u access\u token=get\u extended\u access\u token(token)
的结果,它将不会直接为您提供
long\u live\u access\u token
而是为您提供一个包含以下内容的元组:

long_lived_access_token = ('your token', datetime_object).
您可以通过查看的源代码来验证这一点。如果查看
get\u extended\u access\u token
方法,它将返回
token,expires\u at

根据协议,要获得
扩展的
访问令牌,必须在以下端点发出请求

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=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')

谢谢你的建议/回答。请看一看我的
更新的
问题。在您的API中
获取扩展访问令牌
返回一个元组,因此传递令牌的正确方法是
graph=GraphAPI(长寿命访问令牌[0])
@RanRag:你说得对。我已经相应地更新了我的答案。谢谢@JohannesGorset,它还在工作吗?我不断从中获取错误或无效的访问令牌。感谢您的建议/回答。请看一看我的
更新的
问题。在您的API中
获取扩展访问令牌
返回一个元组,因此传递令牌的正确方法是
graph=GraphAPI(长寿命访问令牌[0])
@RanRag:你说得对。我已经相应地更新了我的答案。谢谢@JohannesGorset,它还在工作吗?我一直在努力