Python: API de Facebook que muestra un token no válido

Estoy utilizando facepy facebook graph API para acceder a mi buzón / mensajes y seguí los siguientes dos enfoques:

1er Enfoque:

Usé el access token que obtuve de la página de Facebook de Graph Explorer y uso el siguiente código:

 from facepy import GraphAPI graph = GraphAPI(token) print graph.get('/me') #Rest of the code 

El código anterior funcionó bien y pude recuperar todos mis mensajes usando una FQL Query . El problema surgió cuando mi auth_token expired después de algún tiempo.

Así que, después de un poco de google me cambié para acercarme a dos :

Ahora, lo que hice fue crear una aplicación de facebook que le dio el permiso read_mailbox y obtuve su id and key y luego usé el método get_application_access_token de facepy para obtener el token.

Después de recuperar el token utilicé:

 token = facepy.utils.get_application_access_token(app_id, key) graph.get('/me') ## OUT: OAuthError: [2500] An active access token must be used to query information about the current user. facepy.utils.get_extended_access_token(token, app_id, key) # OUT: OAuthError: [1] No user access token specified 

Ahora, puede ver el error ( commented # ) generado al usar el token de la aplicación.

Creo que el error que recibo es porque Facebook necesita el user_token y lo estoy suministrando con app_token .

Entonces, ¿es posible acceder a los datos del usuario utilizando el app_token y, de no ser así, cómo se puede emitir un extended token que puede acceder a los datos del usuario?

Actualizar:

Entonces, seguí la sugerencia de @Johannes e intenté esto, pero me encontré con un error:

 from facepy.utils import get_extended_access_token from facepy import GraphAPI token = "My user access token got from https://developers.facebook.com/tools/explorer" long_lived_access_token = get_extended_access_token(token) graph = GraphAPI(long_lived_access_token) graph.get('/me') 

Ahora, cuando ejecuté el código anterior obtuve

 TypeError: get_extended_access_token() takes exactly 3 arguments (1 given) 

Así que lo cambié a long_lived_access_token = get_extended_access_token(token, None, None) y obtuve

 facepy.exceptions.OAuthError 

Entonces, otra vez lo cambié a long_lived_access_token = get_extended_access_token(token, app_id, key) y obtuve la misma excepción / error anterior.

Entonces, ¿es esto un error o estoy haciendo algo mal?

PD: instalé la última versión de git.

Tiene la certeza de que no puede usar tokens de acceso a la aplicación para leer el buzón de un usuario, pero el error que está obteniendo se debe al hecho de que no ha inicializado el graph con un token de acceso.

Sea como sea, está en el camino correcto para preguntar cómo puede extender el token de acceso del usuario. Como ya ha descubierto, Facepy HEAD (que pronto será la versión 0.9) tiene una función get_extended_access_token que acepta un token de acceso de usuario de corta duración existente y lo amplía. Los tokens de acceso extendido al usuario duran 2 meses, y puede leer más sobre ellos en la documentación de Facebook sobre la eliminación del permiso offline_access .

Si quiere usar get_extended_access_token ahora mismo, tendrá que instalar facepy desde git:

 $ pip install git+git://github.com/jgorset/facepy.git@b5153f460f2f52cef9a5e49a3b48b3fb8742356c 

Una vez que haya instalado la versión correcta de Facepy, puede extender un token de acceso de usuario de corta duración e inicializar una nueva instancia de GraphAPI con ella:

 from facepy.utils import get_extended_access_token from facepy import GraphAPI long_lived_access_token, expires_at = get_extended_access_token(short_lived_access_token, application_id, application_secret_key) graph = GraphAPI(long_lived_access_token) graph.get('/me') 

No hay nada de malo con la API, simplemente no estás interpretando el resultado de una manera correcta. Si intentas imprimir el resultado de long_lived_access_token = get_extended_access_token(token) , no te dará directamente un long_lived_access_token sino que te proporcionará una tupla con contenido:

 long_lived_access_token = ('your token', datetime_object). 

Puede verificar esto mirando el código fuente de utils.py . Si get_extended_access_token método get_extended_access_token , devuelve el token, expires_at .

De acuerdo con los documentos de Facebook para obtener el token de acceso extended uno tiene que realizar la solicitud en el punto final a continuación.

 https://graph.facebook.com/oauth/access_token? client_id=APP_ID& client_secret=APP_SECRET& grant_type=fb_exchange_token& fb_exchange_token=EXISTING_ACCESS_TOKEN 

y la respuesta es algo como token=mytoken&expire=5184000 donde 5184000 significa 60 días.

Por lo tanto, su código final se verá algo como:

 from facepy.utils import get_extended_access_token from facepy import GraphAPI app_id = 'id' key = 'key' short_lived_access_token = 'short_token' long_token = get_extended_access_token(short_token, id, key) graph = GraphAPI(long_token[0]) print graph.get('/me')