PyFacebook 无限会话

Posted

技术标签:

【中文标题】PyFacebook 无限会话【英文标题】:PyFacebook Infinite Session 【发布时间】:2010-01-26 14:53:29 【问题描述】:

我正在尝试设置一个 cron 任务来读取 Facebook 应用程序的更新。我已提示用户授予离线访问权限,并且我已将 session_key 存储在数据库中。

我正在创建一个新的 Facebook 对象,除了 api 和密钥之外,我还使用 session_key(以前存储在 db 中)和 fb uid。当我尝试创建身份验证令牌或进行 API 调用时,我收到错误 104:签名不正确

有什么想法、经验、提示吗?

【问题讨论】:

【参考方案1】:

我刚刚写了一个blog entry,关于我寻找类似的东西 - 需要编写一个 Python cron 脚本。这是我想出的:

#!/usr/bin/python
import os, sys, optparse, time, json
import facebook

##

USER_SESSION_FILE = os.path.expanduser('fb-user.session')
APP_KEY_FILE = os.path.expanduser('fb-app.keys')

##

def main():
    app_keys = open(APP_KEY_FILE).readlines()
    fb_api = facebook.Facebook(api_key=app_keys[0].strip(), secret_key=app_keys[1].strip())
    opts, args = parse_options()
    if args == ['init']:
        init(fb_api)
        return
    session = json.load(open(USER_SESSION_FILE))
    fb_api.uid = session['uid']
    fb_api.secret = session['secret']
    fb_api.session_key = session['session_key']

    fb_api.stream.publish(message="test from PyFacebook")


def init(fb_api):
    fb_api.auth.createToken()

    sys.stdout.write('Opening web page to add application (press ENTER when done)...')
    sys.stdout.flush()
    fb_api.login()
    raw_input()

    sys.stdout.write('Asking for offline access now...')
    sys.stdout.flush()
    fb_api.request_extended_permission('offline_access')
    raw_input()

    sys.stdout.write('And, finally, asking for permission to publish')
    sys.stdout.flush()
    fb_api.request_extended_permission('publish_stream')
    raw_input()

    fb_api.auth.getSession()

    if fb_api.session_key_expires != 0:
        print """We were granted a temporary key; please wait a minute and run `%s init` again.""" % (sys.argv[0],)
    else:
        if not os.path.exists(USER_SESSION_FILE):
            # Only set restrictive permissions when creating the file
            # ourselves.
            open(USER_SESSION_FILE, 'w').close()
            os.chmod(USER_SESSION_FILE, 0600)
        json.dump(
                   'uid': fb_api.uid,
                   'secret': fb_api.secret,
                   'session_key': fb_api.session_key,
                   ,
                   open(USER_SESSION_FILE, 'w'),
                   sort_keys=True,
                   indent=4)


def parse_options():
    p = optparse.OptionParser()
    return p.parse_args()


if __name__ == '__main__':
    sys.exit(main())

【讨论】:

【参考方案2】:

我遇到了同样的问题,显示的错误是:

“facebook.FacebookError:错误 104:签名不正确”

只需重置您的 APP Secret_key 并在代码中进行相应更改即可解决问题。

干杯!

【讨论】:

【参考方案3】:

我从未使用过 PyFacebook。或者尝试以这种方式恢复会话。但我想仅仅存储session_keyuid 是不够的。还有其他参数,以及基于所有fb_* 参数计算的签名参数。因此,您可能需要存储所有这些。

但即便如此,如果你运气不好,它们可能只能工作 20-30 分钟。

【讨论】:

这是一个无限会话,用户已授予offline_access,因此它永远有效

以上是关于PyFacebook 无限会话的主要内容,如果未能解决你的问题,请参考以下文章

来自构建的 Pyfacebook

XMPP 与 Facebook Chat 集成,使用 Python

Facebook Feed 上的网页无限滚动

Parse / Facebook -> 会话与当前存储的会话不匹配

在 Facebook-Ios-Sdk 中关闭 Facebook 会话

如果我们从设置中有 Facebook 会话,FBLoginView 不会发出警报