facebookfacebook-graph-apiauthenticationfacebook-feed

Using the Facebook Graph API, how can I get the contents of a page?


For example, here's a 'page':

http://www.facebook.com/facebook

That page has an RSS feed (which I'd like to use, ideally), but a) it browser-sniffs meaning I need to fake the user-agent from a script to fetch it - and that feels really brittle b) the quality of the data returned is really poor.

Can I use the graph api to fetch the same data? This URL:

https://graph.facebook.com/facebook/feed

implies that I can, and json is fine for me, although I'm fetching this from a PHP script rather than client-side. However, when I try that URL for my actual page, I get the following:

{
    "error": {
        "type": "OAuthAccessTokenException",
        "message": "An access token is required to request this resource."
    }
}

I don't understand why an access token is required for my page, whilst other pages are 'more public' - is that a configuration on the page somewhere? If not, what's the best way of obtaining the access key - note that this is not an interactive script asking the page owner to authenticate.


Solution

  • If I try to access the URL via CURL, it works OK for me in PHP.

    $curlResponse = http('https://graph.facebook.com/facebook/feed');
    $facebookFeed = json_decode($curlResponse['data'], true);
    
    var_dump($facebookFeed);
    

    Using this php function:

    function http($url) {
      $timeout = 30;
      $connectTimeout = 30;
      $sslVerifyPeer = false;
    
      $response = array();
      $ci       = curl_init();
    
      /* Curl settings */
      curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $connectTimeout);
      curl_setopt($ci, CURLOPT_TIMEOUT, $timeout);
      curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
      curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $sslVerifyPeer);    
      curl_setopt($ci, CURLOPT_URL, $url);
    
      $response['http_code'] = curl_getinfo($ci, CURLINFO_HTTP_CODE);
      $response['api_call']  = $url;
      $response['data']      = curl_exec($ci);
    
      curl_close ($ci);
    
      return $response;
    }