Search code examples
facebook-fqlfacebook-php-sdkaccess-tokenfacebook-access-token

Access token for a simple FQL retrieving the number of status for a page


I'm doing a really simple PHP app using the latest Facebook PHP SDK which aims to display the number of status a page of mine has.

To do so I created an app to have the app id and the app secret but after I'm kinda lost.

I thought I needed an app secret token so I first tried like this:

<?php
public function getFacebookPosts() {
    require __DIR__ . '/libs/facebook-sdk/facebook.php';

    $appId = 'myID';
    $appSecret = 'mySecret';

    $facebook = new Facebook(array(
        'appId'  => $appId,
        'secret' => $appSecret,
    ));

    $token = $this->getFacebookAppToken($appId, $appSecret);

    try {
        $jinnove = $facebook->api('/my.page');
        $fql = '/fql?q=SELECT+status_id+FROM+status+WHERE+uid=' . $jinnove['id'] . '&' . $token;
        var_dump($facebook->api($fql));
    } catch(FacebookApiException $e) {
        var_dump($fql, $e);
    }
}

/**
 * Function to Get Access Token from Facebook
 * @param $appId
 * @param $appSecret
 * @return string
 */
protected function getFacebookAppToken($appId, $appSecret)
{
    $args = array(
        'grant_type' => 'client_credentials',
        'client_id' => $appId,
        'client_secret' => $appSecret
    );

    $ch = curl_init();
    $url = 'https://graph.facebook.com/oauth/access_token';
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    $data = curl_exec($ch);

    return $data;
}

But it returns me an error 102 with the following message: "A user access token is required to request this resource.".

So then I asked on IRC and someone told me I need a user access token to do that.

Of what I've understood a user access token can only be generated when a user explicitly log into facebook to authorize this app and renew the token sometimes.

Is that true? Is there no way to use a token which doesn't imply the user to be logged? Basically anyone can view this number of status, even people who don't have a Facebook account and I want no UI dialog at all.


Solution

  • For some reason, Facebook has decided that querying a status can only be done by a user.

    You can get around this by querying the stream table, and only returning posts with type = 46, which are status updates:

    SELECT post_id FROM stream WHERE source_id= YOUR_PAGE_ID AND type = 46 LIMIT 100
    

    The stream table has a lot of restrictions on it. Even with a high LIMIT, you may not get all the status updates if the page has been around for a while.

    You can also speed up your program by cutting the number of API calls from 3 to 1 with the following changes:

    • If you want to get a page's ID from its username replace = YOUR_PAGE_ID in the above query with IN (SELECT id FROM profile WHERE username = 'YOUR_PAGE_USERNAME')
    • You don't need the 'getFacebookAppToken()` function. The PHP SDK will automatically get you an app access token if you don't have an authenticated user.