Python 以编程方式获取用于使用Facebook Graph API的访问令牌

Python 以编程方式获取用于使用Facebook Graph API的访问令牌,python,bash,facebook,Python,Bash,Facebook,我正在尝试编写一个bash或python脚本来使用facebook图形API。使用API看起来很简单,但在bash脚本中设置curl以调用authorize和access_令牌时遇到了问题。有人有一个有效的例子吗?以下是例子。试着在命令行上运行一些,它们对我来说很好。另请参见-您首先需要。然后,根据您的应用程序ID和密码,以下内容将吐出一个访问令牌: > curl -F type=client_cred -F client_id=[...] -F client_secret=[...] h

我正在尝试编写一个bash或python脚本来使用facebook图形API。使用API看起来很简单,但在bash脚本中设置curl以调用authorize和access_令牌时遇到了问题。有人有一个有效的例子吗?

以下是例子。试着在命令行上运行一些,它们对我来说很好。另请参见-

您首先需要。然后,根据您的应用程序ID和密码,以下内容将吐出一个访问令牌:

> curl -F type=client_cred -F client_id=[...] -F client_secret=[...] https://graph.facebook.com/oauth/access_token

由于实际授权需要涉及web浏览器,因此不存在“独立脚本”这样的东西来完成这一切。如果您只是在玩API,或者自己编写脚本来自动化某个东西,并且想要一个不会过期的
access\u token
,您可以在这里获取一个:

有一种方法可以做到,我已经找到了,但是这需要大量的工作,需要您100%地欺骗浏览器(你可能会违反他们的服务条款)

对不起,我不能提供所有细节,但要点是:

  • 假设您有facebook帐户的用户名/密码,请转到oauth/authenticate…页面。提取“Set Cookie”标题中返回的任何Cookie,然后按照任何“Location”标题(在此过程中编译Cookie)
  • 刮取登录表单,保留所有字段,然后提交(设置referer和content-type标题,并插入电子邮件/通行证)来自(1)的相同cookie集合
  • 与(2)相同,但现在您需要发布(2)提交后获得的批准表单,请使用获取表单的URL设置Referer标题
  • 遵循重定向,直到它将您发送回您的站点,并从该URL中获取“code”参数
  • 在oauth端点处将代码交换为访问令牌

  • 主要的问题是cookie管理和重定向。基本上,你必须100%模仿浏览器。我认为这是黑客行为,但有一种方法,这真的很难!

    更新2018-08-23

    由于这仍然会获得一些视图和投票,我只想指出,到目前为止,似乎存在一个维护的第三方SDK:


    迟做总比不做强,也许其他搜索者会找到它。我在MacBook上用Python2.6获得了它

    这需要你有

    • 已安装Python facebook模块:
    • 一个真实的Facebook应用程序
    • 你想发布到的个人资料必须授予适当的权限,允许阅读和写作等所有不同的内容
    您可以在Facebook开发者文档中阅读有关身份验证的内容。有关详细信息,请参阅

    这篇博文也可能有助于:

    下面是:

    #!/usr/bin/python
    # coding: utf-8
    
    import facebook
    import urllib
    import urlparse
    import subprocess
    import warnings
    
    # Hide deprecation warnings. The facebook module isn't that up-to-date (facebook.GraphAPIError).
    warnings.filterwarnings('ignore', category=DeprecationWarning)
    
    
    # Parameters of your app and the id of the profile you want to mess with.
    FACEBOOK_APP_ID     = 'XXXXXXXXXXXXXXX'
    FACEBOOK_APP_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    FACEBOOK_PROFILE_ID = 'XXXXXX'
    
    
    # Trying to get an access token. Very awkward.
    oauth_args = dict(client_id     = FACEBOOK_APP_ID,
                      client_secret = FACEBOOK_APP_SECRET,
                      grant_type    = 'client_credentials')
    oauth_curl_cmd = ['curl',
                      'https://graph.facebook.com/oauth/access_token?' + urllib.urlencode(oauth_args)]
    oauth_response = subprocess.Popen(oauth_curl_cmd,
                                      stdout = subprocess.PIPE,
                                      stderr = subprocess.PIPE).communicate()[0]
    
    try:
        oauth_access_token = urlparse.parse_qs(str(oauth_response))['access_token'][0]
    except KeyError:
        print('Unable to grab an access token!')
        exit()
    
    facebook_graph = facebook.GraphAPI(oauth_access_token)
    
    
    # Try to post something on the wall.
    try:
        fb_response = facebook_graph.put_wall_post('Hello from Python', \
                                                   profile_id = FACEBOOK_PROFILE_ID)
        print fb_response
    except facebook.GraphAPIError as e:
        print 'Something went wrong:', e.type, e.message
    
    获取令牌时进行错误检查可能更好,但您知道该怎么做。

    简单!只需使用即可


    给你,尽可能简单。不需要任何第三方SDK等

    确保安装了Python“请求”模块


    s29的答案正确,但仍有一些步骤需要解决。以下脚本演示了使用Facebook SDK获取访问令牌的工作脚本:

    __requires__ = ['facebook-sdk']
    
    import os
    
    import facebook
    
    
    def get_app_access_token():
        client = facebook.GraphAPI()
        return client.get_app_access_token(
            os.environ['FACEBOOK_APP_ID'],
            os.environ['FACEBOOK_APP_SECRET'],
        )
    
    
    __name__ == '__main__' and print(get_app_access_token())
    
    此脚本要求将FACEBOOK_APP_ID和FACEBOOK_APP_SECRET环境变量设置为应用程序的值。请随意调整该技术以从其他源加载这些值



    您必须首先(
    pip安装facebook sdk;python get token.py
    )或使用其他工具调用脚本(
    rwt--get token.py
    ).

    谢谢,我看到了,但我正在寻找一个独立的脚本。这是Django应用程序的一部分,不是吗?github repo已被删除链接对这个问题没有帮助。@daaku因此,为了为用户重新生成过期的访问令牌,我需要将他们的web浏览器重定向到Facebook(我猜Facebook可以读取自己的cookies来识别用户)?不推荐,我猜他们不想允许使用自动化工具。作为需要开发自动化工具的人,只有领先的网站才能开发oauth,这是一个令人不安的举动……官方的举动!你可以从GitHub获得:我更新了答案以包含链接。不过,谢谢“此SDK已弃用。”举个例子,它认为此SDK也几乎毫无用处-我建议使用“请求”“用于http通信的Python库:FacebookSDK的死链接无论如何都不起作用,因为现在给出的响应是一个JSON文档,而不是一个查询字符串。嘿,用这样的代码存储app_secret安全吗?facebook文档明确指出“同样,出于安全考虑,应用程序访问令牌永远不应硬编码到客户端代码中,这样做将使加载您的网页或反编译您的应用程序的所有人都能够完全访问您的应用程序机密,从而能够修改您的应用程序。"不,你不应该在客户端代码中包含应用程序机密。但这里的问题意味着交互/服务器使用,而不是客户端代码。这个答案是最好的答案,但可以通过提供实际工作代码来显著改进。特别是,指向facebook SDK的“安装”文档,然后演示如何导入facebook,构造一个客户端对象,然后对该对象调用
    get\u app\u access\u token
    。哇,理论上这听起来很好,你在python中做过类似的事情吗?
    result=file.text.split(=”[1]索引器:列表索引超出范围
    在撰写本文时,该端点返回JSON,所以更改
    result=file.text.split(=”)[1] 
    to
    result=file.json()['access\u token']
    这并没有获得完整的token!只是其中的一部分!这不是真的-它获得了完整的访问token,与官方的facebook sdk相同(见下面的答案)。为什么它比您通过web fb dev页面获得的访问令牌短:这些是长期访问令牌,您通过web获得的访问令牌是短期访问令牌
    import requests
    
    def get_fb_token(app_id, app_secret):
        url = 'https://graph.facebook.com/oauth/access_token'       
        payload = {
            'grant_type': 'client_credentials',
            'client_id': app_id,
            'client_secret': app_secret
        }
        response = requests.post(url, params=payload)
        return response.json()['access_token']
    
    __requires__ = ['facebook-sdk']
    
    import os
    
    import facebook
    
    
    def get_app_access_token():
        client = facebook.GraphAPI()
        return client.get_app_access_token(
            os.environ['FACEBOOK_APP_ID'],
            os.environ['FACEBOOK_APP_SECRET'],
        )
    
    
    __name__ == '__main__' and print(get_app_access_token())