web-dev-qa-db-fra.com

Obtenir par programme un jeton d'accès pour utiliser l'API Facebook Graph

J'essaie de créer un script bash ou python pour jouer avec l'API facebook graph. L'utilisation de l'API semble simple, mais j'ai du mal à configurer curl dans mon script bash pour appeler authorize et access_token. Quelqu'un at-il un exemple de travail?

39
justinhj

Mise à jour 2018-08-23

Étant donné que cela obtient toujours des vues et des votes positifs, je veux juste mentionner qu'il semble maintenant exister un SDK tiers maintenu: https://github.com/mobolic/facebook-sdk


Mieux vaut tard que jamais, peut-être que d'autres qui le recherchent le trouveront. Je l'ai fait fonctionner avec Python 2.6 sur un MacBook.

Cela vous oblige à avoir

  • le Python facebook installé: https://github.com/pythonforfacebook/facebook-sdk ,
  • une véritable application Facebook configurée
  • et le profil que vous souhaitez publier doit avoir accordé les autorisations appropriées pour autoriser toutes les différentes choses comme la lecture et l'écriture.

Vous pouvez lire des informations sur l'authentification dans la documentation des développeurs Facebook. Voir https://developers.facebook.com/docs/authentication/ pour plus de détails.

Cet article de blog peut également aider à cela: http://blog.theunical.com/facebook-integration/5-steps-to-publish-on-a-facebook-wall-using-php/

Voici:

#!/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

La vérification des erreurs lors de l'obtention du jeton pourrait être meilleure, mais vous avez une idée de ce qu'il faut faire.

37
maryisdead

Voilà, aussi simple que possible. Ne nécessite aucun SDK tiers, etc.

Assurez-vous que le module Python 'demandes' est installé

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']
27
Waqas

Facile! Utilisez simplement facebook-sdk .

import facebook

app_id = 'YOUR_APP_ID'
app_secret = 'YOUR_APP_SECRET'

graph = facebook.GraphAPI()

# exactly what you're after ;-)
access_token = graph.get_app_access_token(app_id, app_secret) 
16
s29

Vous devez d'abord configurer une application . Les éléments suivants cracheront ensuite un jeton d'accès en fonction de votre ID d'application et de votre secret:

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

Il y a IS un moyen de le faire, je l'ai trouvé, mais c'est beaucoup de travail et vous obligera à usurper un navigateur à 100% (et vous briserez probablement leurs conditions de un service)

Désolé, je ne peux pas fournir tous les détails, mais l'essentiel:

  1. en supposant que vous avez un nom d'utilisateur/mot de passe pour un compte facebook, allez curl pour la page oauth/authenticate .... Extrayez tous les cookies renvoyés dans l'en-tête "Set-Cookie", puis suivez les en-têtes "Location" (compilation des cookies en cours de route).
  2. grattez le formulaire de connexion, en préservant tous les champs et soumettez-le (en définissant le référent et les en-têtes de type de contenu, et en insérant votre e-mail/pass) même collection de cookies de (1) requis
  3. identique à (2) mais maintenant vous allez avoir besoin de POST le formulaire d'approbation acquis après que (2) a été soumis, définissez l'en-tête Referer avec l'URL où le formulaire a été acquis.
  4. suivez les redirections jusqu'à ce qu'il vous renvoie vers votre site et récupérez le paramètre "code" de cette URL
  5. Échangez le code pour un access_token au point de terminaison oauth

Les principaux problèmes sont la gestion des cookies et les redirections. Fondamentalement, vous DEVEZ imiter un navigateur à 100%. Je pense que c'est du piratage mais il y a un moyen, c'est vraiment très dur!

6
Hidden

Puisqu'un navigateur Web doit être impliqué pour l'autorisation réelle, il n'existe pas de "script autonome" qui fait tout. Si vous jouez simplement avec l'API, ou si vous écrivez un script pour automatiser quelque chose vous-même, et que vous voulez un access_token pour vous qui n'expire pas, vous pouvez en récupérer un ici: http://fbrell.com/auth/offline-access-token

6
daaku

s29 a la bonne réponse mais laisse quelques étapes à résoudre. Le script suivant illustre un script de travail pour l'acquisition d'un jeton d'accès à l'aide du SDK Facebook:

__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'],
    )


__== '__main__' and print(get_app_access_token())

Ce script s'attend à ce que les variables d'environnement FACEBOOK_APP_ID et FACEBOOK_APP_SECRET soient définies sur les valeurs de votre application. N'hésitez pas à adapter cette technique pour charger ces valeurs à partir d'une source différente.

Vous devez d'abord installer le SDK Facebook (pip install facebook-sdk; python get-token.py) ou utilisez un autre outil comme rwt pour appeler le script (rwt -- get-token.py).

1
Jason R. Coombs

Voici le Code Python . Essayez d'exécuter certains de ces exemples en ligne de commande, ils fonctionnent très bien pour moi. Voir aussi - http://www.pythonforfacebook.com/

0
gsharma