PyFacebook 无限会话
我正在尝试设置一个定时任务,用来读取一个Facebook应用的更新。我已经请求用户授予离线访问权限,并且把session_key存储在数据库里。
我正在创建一个新的Facebook对象,除了api和密钥之外,我还使用了之前存储在数据库里的session_key和Facebook用户ID。当我尝试创建认证令牌或进行API调用时,出现了错误104:签名不正确。
有没有什么想法、经验或者提示呢?
3 个回答
0
我从来没有用过PyFacebook,也没尝试过这样恢复会话。不过我想,仅仅保存session_key
和uid
可能不够。还有其他一些参数,以及一个根据所有fb_*
参数计算出来的签名参数。所以你可能需要保存所有这些参数。
不过即便如此,如果运气不好,它们可能也只能用20到30分钟。
1
我遇到了同样的问题,错误信息是:
"facebook.FacebookError: 错误 104: 签名不正确"
只需要重置你的应用程序的密钥,然后在代码中做相应的修改,这样就能解决这个问题了。
祝好运!
2
我刚写了一篇博客文章,讲述了我寻找类似东西的过程——需要写一个Python的定时任务脚本。以下是我找到的解决方案:
#!/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())