Crossposter sur plusieurs Pages Facebook

Ce document explique comment publier des vidéos simultanément sur plusieurs Pages à l’aide de l’API Live Video.

Le crosspostage n’est pas disponible pour les profils personnels. Il est réservé aux Pages et aux profils professionnels. Le crosspostage est également disponible pour les vidéos à la demande (VOD), en plus des vidéos en direct.

Fonctionnement

Pour crossposter des vidéos en direct ou à la demande sur plusieurs Pages et profils professionnels, les conditions suivantes doivent être réunies :

  1. Les utilisateur·ices de l’application doivent être autorisé·es à effectuer la tâche CREATE_CONTENT sur la Page.
  2. Les utilisateur·ices de l’application doivent accorder à votre application les autorisations suivantes via Facebook Login :
    • pages_manage_posts
    • pages_read_user_content
    • pages_manage_engagement
    • pages_show_list
    • publish_video
  3. Les utilisateur·ices de l’application doivent établir une relation de crosspostage avec les autres Pages ou profils professionnels.
  4. Trouver des pages éligibles au crosspostage

Établir une relation de crosspostage

Pour crossposter sur une autre Page ou un autre profil professionnel, votre Page doit envoyer une requête de crosspostage à la Page ou au profil professionnel en question, que celle-ci ou celui-ci doit accepter.

Étape 1 : Envoyer une requête de crosspostage

Pour demander le crosspostage, envoyez une requête POST au point de terminaison /<YOUR_PAGE_ID> avec les paramètres suivants :

  • begin_crossposting_handshake défini sur un tableau contenant une liste de Pages séparées par une virgule dans lequel partner_page_id est défini sur l’ID de la Page à laquelle vous envoyez la requête et allow_live est défini sur true.

Lorsque vous testez un appel d’API, vous pouvez inclure le paramètre access_token, défini sur votre token d’accès. En revanche, lorsque vous effectuez des appels sécurisés depuis votre application, utilisez la classe de token d’accès.

L’extrait de code suivant a été formaté pour plus de lisibilité.
curl -i -X POST "https://graph.facebook.com/v21.0<PAGE_1_ID> \
      ?begin_crossposting_handshake=[{partner_page_id:<PAGE_2_ID>,allow_live:true}]"

Si la requête aboutit, votre application reçoit une réponse JSON dans laquelle success est défini sur true.

Exemple de réponse

{
  "success": true
}

Définissez allow_live sur false pour envoyer une requête permettant de créer une relation de crosspostage où une Page peut crossposter des vidéos en direct sur votre Page uniquement lorsque vos admins ou éditeurs ont approuvé la vidéo.

Accepter une requête de crosspostage

Pour accepter la demande d’une autre Page souhaitant crossposter sa vidéo sur votre Page, envoyez une requête POST au point de terminaison /<ID> avec le paramètre accept_crossposting_handshake défini sur l’ID de la Page ayant envoyé la requête et allow_live défini sur true.

L’extrait de code suivant a été formaté pour plus de lisibilité.
curl -X POST "https://graph.facebook.com/v21.0/<PAGE_2_ID>
    ?accept_crossposting_handshake=[{partner_page_id:<PAGE_1_ID>, allow_live:true}]"

Si la requête aboutit, votre application reçoit une réponse JSON dans laquelle success est défini sur true. La vidéo est alors diffusée en direct sur plusieurs Pages.

Pour refuser une demande, définissez allow_live sur false.

Trouver des pages éligibles au crosspostage

Pour identifier les Pages sur lesquelles les utilisateur·ices de votre application sont autorisé·es à crossposter, envoyez une requête GET au point de terminaison /<PAGE_ID>/crosspost_whitelisted_pages avec les champs suivants :

  • allows_live_crossposts
  • id
  • name (facultatif)
curl "https://graph.facebook.com/v21.0/<PAGE_ID>/crosspost_whitelisted_pages" \
  -d "fields=id,name,allows_live_crossposts" 

Si la requête aboutit, votre application reçoit une liste d’ID associés chacun à un nom de Page et une valeur true ou false indiquant si le crosspostage est autorisé ou non. true signifie que la Page source peut publier directement sur la Page cible une vidéo en direct crosspostée, sans autre autorisation. false signifie que la Page cible doit publier manuellement la vidéo crosspostée.

Exemple de réponse

{
  "data": [
    {
      "id": "107738621396466",
      "name": "Crossposting Page C",
      "allows_live_crossposts": false
    },
    {
      "id": "106589754846067",
      "name": "Crossposting Page B",
      "allows_live_crossposts": true
    },
    {
      "id": "106343288214714",
      "name": "Crossposting Target X",
      "allows_live_crossposts": true,
    }
  ],
  "paging": {
    "cursors": {
      "before": "&lt;PAGE_CURSOR>",
      "after": "&lt;PAGE_CURSOR>"
    }
  }
}

Ajouter des actions de crosspostage à une vidéo en direct

Avant de commencer

L’utilisateur·ice doit être autorisé·e à agir au nom de la Page et à modifier et mettre à jour des vidéos. Cela signifie que votre application devra disposer de l’autorisation pages_manage_posts au nom de votre utilisateur·ice.

Une fois que les Pages disponibles pour le crosspostage sont connues, vous pouvez ajouter des crossposting_actions à tout objet LiveVideo. Chaque action de crosspostage indique si la vidéo en direct est disponible pour le crosspostage et si elle doit être publiée automatiquement sur la Page cible.

Pour mettre à jour une vidéo, la requête est POST /{video-id}.

curl -i -X POST \
 "https://graph.facebook.com/v10.0/112103234301221?fields=crosspost_shared_pages,crossposted_broadcasts%7Bstatus,from%7Bname%7D%7D&access_token=${access_token}" \
 -H "Content-Type: application/json" \
 -d @- << HEREDOC
{"crossposting_actions": [
  {
    "page_id": "107738621396466",
    "action": "enable_crossposting"
  },
  {
    "page_id": "106589754846067",
    "action": "enable_crossposting_and_create_post"
  },
  {
    "page_id": "106343288214714",
    "action": "disable_crossposting"
  }
]}
HEREDOC
GraphRequest request = GraphRequest.newPostRequest(
  accessToken,
  "/112103234301221",
  new JSONObject("{\"crossposting_actions\":\"[\\n  {\\n    \\\"page_id\\\": \\\"107738621396466\\\",\\n    \\\"action\\\": \\\"enable_crossposting\\\"\\n  },\\n  {\\n    \\\"page_id\\\": \\\"106589754846067\\\",\\n    \\\"action\\\": \\\"enable_crossposting_and_create_post\\\"\\n  },\\n  {\\n    \\\"page_id\\\": \\\"106343288214714\\\",\\n    \\\"action\\\": \\\"disable_crossposting\\\"\\n  }\\n]\"}"),
  new GraphRequest.Callback() {
    @Override
    public void onCompleted(GraphResponse response) {
      // Insert your code here
    }
});
request.executeAsync();
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
    initWithGraphPath:@"/112103234301221"
           parameters:@{ @"fields": @"crosspost_shared_pages,crossposted_broadcasts{status,from{name}}",@"crossposting_actions": @"[
  {
    "page_id": "107738621396466",
    "action": "enable_crossposting"
  },
  {
    "page_id": "106589754846067",
    "action": "enable_crossposting_and_create_post"
  },
  {
    "page_id": "106343288214714",
    "action": "disable_crossposting"
  }
]",}
           HTTPMethod:@"POST"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
    // Insert your code here
}];
FB.api(
  '/112103234301221',
  'POST',
  {"fields":"crosspost_shared_pages,crossposted_broadcasts{status,from{name}}","crossposting_actions":"[\n  {\n    \"page_id\": \"107738621396466\",\n    \"action\": \"enable_crossposting\"\n  },\n  {\n    \"page_id\": \"106589754846067\",\n    \"action\": \"enable_crossposting_and_create_post\"\n  },\n  {\n    \"page_id\": \"106343288214714\",\n    \"action\": \"disable_crossposting\"\n  }\n]"},
  function(response) {
      // Insert your code here
  }
);
try {
  // Returns a `FacebookFacebookResponse` object
  $response = $fb->post(
    '/112103234301221',
    array (
      'fields' => 'crosspost_shared_pages,crossposted_broadcasts{status,from{name}}',
      'crossposting_actions' => '[
        {
          "page_id": "107738621396466",
          "action": "enable_crossposting"
        },
        {
          "page_id": "106589754846067",
          "action": "enable_crossposting_and_create_post"
        },
        {
          "page_id": "106343288214714",
          "action": "disable_crossposting"
        }
      ]'
    ),
    '{access-token}'
  );
} catch(FacebookExceptionsFacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
$graphNode = $response->getGraphNode();

Ces actions montrent les options disponibles. La première autorise la première Page (107738621396466) à crossposter la vidéo à partir de Creator Studio ou de l’API, mais ne la crossposte pas automatiquement où que ce soit. La deuxième empêche la seconde Page (106589754846067) de crossposter la vidéo. La troisième publie automatiquement la vidéo sur la Page ciblée (106343288214714).

Exemple de réussite

Renvoie l’objet LiveVideo, et nous avons utilisé l’arête crosspost_shared_pages pour voir sur quelles Pages il est disponible et l’arête crossposted_broadcasts pour voir sur quelles Pages nos publications ont déjà été publiées.

Remarque importante

Si les relations de crosspostage ont été modifiées ou ne sont pas valides, les crosspostages ne fonctionnent pas, mais ils ne déclenchent pas non plus d’erreur. Ainsi, le seul moyen de savoir si une action a réussi ou non est de rechercher les diffusions réussies dans la réponse.

{
  "crosspost_shared_pages": {
    "data": [
      {
        "name": "Crossposting Page C",
        "id": "107738621396466"
      },
      {
        "name": "[FB Test Page] Crossposting Page B",
        "id": "106589754846067"
      }
    ]
  },
  "crossposted_broadcasts": {
    "data": [
      {
        "status": "UNPUBLISHED",
        "from": {
          "name": "[FB Test Page] Crossposting Page B",
          "id": "106589754846067"
        },
        "id": "114820814022961"
      }
    ]
  },
  "id": "112103234301221"
}

Exemple d’erreur

Si une des crossposting_options n’est pas valide, l’intégralité de la requête échoue. Aucun crosspostage ne réussit.

{
  "error": {
    "message": "Fatal",
    "type": "OAuthException",
    "code": -1,
    "error_subcode": 1363103,
    "is_transient": false,
    "error_user_title": "Invalid Parameters",
    "error_user_msg": "The request does not specify valid parameters, no action has been taken.",
    "fbtrace_id": "AnI03n5n0Px-ihrZjkWMeTP"
  }
}