Search code examples
facebook-graph-apifacebook-php-sdkfacebook-apps

Facebook Graph API SDK v5 - Publishing a picture to a page's Album


I'm trying to publish a picture to an album belonging to a Facebook page, using the Facebook PHP SDK v5.

I've already checked the (many) similar questions, however they are all related to prior versions of the SDK, when publish_actions was still allowed.

My Setup:

  1. My app is properly configured and I was able to retrieve my access token
  2. I was able to run a few test API queries with no issues
  3. I'm the admin of this page and my access token has the following permissions ['manage_pages','publish_pages','user_photos']
  4. The SDK was properly initialized with 'fileUpload' => true as a parameter

Code publishing the picture to the album

It is based on the example provided in the SDK documentation.

<?php

require_once __DIR__.'/vendor/autoload.php';

$fb = new Facebook\Facebook(['app_id' => '123456', 'app_secret' => '123456', 'default_graph_version' => 'v3.3', 'fileUpload' => true]);
$picture = 'https://www.example.com/pic.jpg';
$album_id = '123456';
$access_token = 'mytoken';

try {
    $response = $fb->post('/'.$album_id.'/photos', array ('url' => $picture), $access_token);
} 
catch(Facebook\Exceptions\FacebookResponseException $e) {
    die('Graph returned an error: ' . $e->getMessage());
}
catch(Facebook\Exceptions\FacebookSDKException $e) {
    die('Facebook SDK returned an error: ' . $e->getMessage());
}

$graphNode = $response->getGraphNode();

Here's the error I'm getting

Graph returned an error: (#200) This endpoint is deprecated since the required permission publish_actions is deprecated

Indeed, changes introduced in April 2018 removed the ability to use publish_actions however it seems the documentation has not been updated accordingly.

What is the new way to publish a picture to a page's album?

Your help is much appreciated!


Solution

  • After several hours of researching alternate solutions, I was able to find a workaround.

    Apparently I was using an User Access Token instead of the Page Access Token.

    Solution

    1 - First, verify if your token is a User/Page Access token

    2 - If it is an User Token, you need to request the Page Access Token instead:

    $user_access_token = 123456;
    $page_id = 123456; // Can be retrieved via right click on your page logo + Copy link address
    $response = $fb->get('/'.$page_id.'?fields=access_token',  $user_access_token);
    $page_access_token = json_decode($response->getBody())->access_token;
    echo $page_access_token;
    

    3 - Finally, post the picture on the Page using the Page Access Token

    Full code

    <?php
    
    require_once __DIR__.'/vendor/autoload.php';
    
    $fb = new Facebook\Facebook(['app_id' => '123456', 'app_secret' => '123456', 'default_graph_version' => 'v3.3', 'fileUpload' => true]);
    $picture = 'https://www.example.com/pic.jpg';
    $album_id = '123456';
    $user_access_token = 'mytoken';
    $page_id = 123456;
    
    try {
        $response = $fb->get('/'.$page_id.'?fields=access_token', $user_access_token);
    } catch(Facebook\Exceptions\FacebookResponseException $e) {
        die('Graph returned an error: ' . $e->getMessage());
    } catch(Facebook\Exceptions\FacebookSDKException $e) {
        die('Facebook SDK returned an error: ' . $e->getMessage());
    }
    
    $page_access_token = json_decode($response->getBody())->access_token;
    
    try {
        $response = $fb->post('/'.$album_id.'/photos', array ('url' => $picture), $page_access_token);
    } 
    catch(Facebook\Exceptions\FacebookResponseException $e) {
        die('Graph returned an error: ' . $e->getMessage());
    }
    catch(Facebook\Exceptions\FacebookSDKException $e) {
        die('Facebook SDK returned an error: ' . $e->getMessage());
    }
    
    $graphNode = $response->getGraphNode();
    

    I hope this helps!