Andrew
Andrew

Reputation: 123

Facebook API offline access

I have a script I'd like to run via a cron job:

<?

require_once 'fb_access.php';

$user = $facebook->getUser();

    if ($user) {
      try {
        $page_id = '********';
        $page_info = $facebook->api("/$page_id?fields=access_token");
        if( !empty($page_info['access_token']) ) {
            $args = array(
                'access_token'  =>  $page_info['access_token'],
                'message'       =>  'This is the message',
                'link'          =>  'http://thisisthelink',
                'caption'       =>  'This is the caption',
                'description'   =>  'This is the description',
            );
            $post_id = $facebook->api("/$page_id/feed","post",$args);
        }
      } catch (FacebookApiException $e) {
        error_log($e);
        $user = null;
      }
    }
   ?>

However when I try to run it via the cron job, it doesn't work. I've figured out this has something to do with the offline_access token. But from what I've read, a user must manually login to get the token. As I'd like to run this via a cron job, that's not feasible. Any ideas?

UPDATE:

I tried this; is it completely wrong?

require_once 'fb_access.php';

$user = $facebook->getUser();
$token = $facebook->getAccessToken();

if ($user) {
    try {
        $page_id = '**********';
        $args = array(
            'access_token'  =>  $token,
            'message'       =>  'This is the message',
            'link'          =>  'http://thisisthelink',
            'caption'       =>  'This is the caption',
            'description'   =>  'This is the description',
        );
    $post_id = $facebook->api("/$page_id/feed","post",$args);
    }
    catch (FacebookApiException $e) {
        error_log($e);
        $user = null;
    }
}

UPDATE #2:

<?php

require_once 'fb_access.php';

$user = $facebook->getUser();
$token = '*******LONG_ACCESS_TOKEN*******';

$page_id = '**********';
$args = array(
    'access_token'  =>  $token,
    'message'       =>  'This is the message',
    'link'          =>  'http://www.thisisthelink.com',
    'caption'       =>  'This is the caption',
    'description'   =>  'This is the description',
);

$post_id = $facebook->api("/$page_id/feed","post",$args);

?>

Using this I get: Fatal error: Uncaught OAuthException: (#200) The user hasn't authorized the application to perform this action thrown in /base_facebook.php on line 1106

Upvotes: 0

Views: 4997

Answers (2)

Martin.
Martin.

Reputation: 10539

  • First of all, you do not need offline_access, if you're requiring publish_stream permission.
  • You need manage_pages permission if you want to login/manage/share as your page.
  • You need user access token in order to get page access token. You need to authenticate once manually

header("Location: $facebook->getLoginUrl(array("scope" => "publish_stream,manage_pages")));
    • After you get an access token, save it to the persistent place (file, for example)
    • When in need, get the access token from your file and use it (just add access_token to your arguments)

Following code worked to me:

<?php
include(dirname(__FILE__)."/fb/facebook.php");
define('PAGE_ID', '123456498798');
$facebook = new Facebook(array(
  'appId'  => '178645249555182',
  'secret' => 'csdf64sd65f4sd6f54f1c',
));

$a = array(
    'access_token'  => 'werf564s6d1cr98f965d6gf49w8sd49f87w9ed5c16d5f49s8f74w9e8rf74',
    'message'       =>  'This is the message',
    'caption'       =>  'This is the caption',
    'description'   =>  'This is the description'
);
print_r($facebook->api('/'.PAGE_ID.'/feed', 'post', $a));

Upvotes: 3

DMCS
DMCS

Reputation: 31870

If it's a cron job, there's no-one there to do authorization with. You cannot do what you want. You'll need to look for an alternative.

An alternative like taking a valid auth token from one of the page admins that you've requested the extended token for (offline_access is being quickly deprecated see https://developers.facebook.com/docs/offline-access-deprecation/).

This 60 day token will need to be put into some config that the cron job can access.

You will need to manually update the 60 day token every couple of months.

You can get valid access tokens from the https://developers.facebook.com/tools/explorer.

Upvotes: 2

Related Questions