2010-01-26 4 views
2

J'essaie de définir une tâche cron pour lire les mises à jour pour une application Facebook. J'ai invité l'utilisateur à accorder des autorisations d'accès hors connexion et j'ai stocké la session_key dans la base de données.PyFacebook Infinite Session

Je suis crearing un nouvel objet Facebook et d'ailleurs la clé api et secret que j'utilise aussi le session_key (précédemment stockés dans db) et le uid fb. Quand je suis en train de créer le jeton d'authentification ou de faire un appel API je reçois une erreur 104: signature incorrecte

Toutes les idées, l'expérience, des conseils?

Répondre

2

Je viens d'écrire un blog entry au sujet de ma recherche de quelque chose de similaire - besoin d'écrire un script Python Cron. Voici ce que je suis venu avec:

#!/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()) 
0

Je ne l'ai jamais utilisé PyFacebook. Ou essayé de reprendre les sessions de cette manière. Mais j'imagine juste stocker session_key et uid ne suffit pas. Il y a aussi d'autres paramètres, et un paramètre de signature qui est calculé sur la base de tous les paramètres fb_*. Donc, vous pourriez avoir besoin de tous les stocker.

Mais, ils pourraient ne travailler pendant 20-30 minutes si vous êtes malchanceux.

+0

il est une session infinie, l'utilisateur a accordé offline_access de sorte qu'il fonctionne pour toujours – PanosJee

1

J'ai fait face au même problème où l'erreur affichée était:

"facebook.FacebookError: Error 104: Incorrect signature"

Il suffit de réinitialiser votre APP secret_key et faire des changements correspondants dans le code et que sgould résoudre le problème .

À la votre!

Questions connexes