在多個 Facebook 專頁多重發佈內容

本文件說明如何使用直播視像 API 將影片同時發佈到多個專頁。

多重發佈不適用於個人專用檔案,只適用於專頁和專業模式個人檔案。除了直播視像,多重發佈同時亦適用於隨選影片

運作方式

如要將直播視像和隨選影片多重發佈到多個專頁和專業模式個人檔案,您需要準備以下事項:

  1. 應用程式用戶必須能夠在專頁上執行 CREATE_CONTENT 任務。
  2. 應用程式用戶必須使用 Facebook 登入向您的應用程式授予以下權限:
    • pages_manage_posts
    • pages_read_user_content
    • pages_manage_engagement
    • pages_show_list
    • publish_video
  3. 應用程式用戶必須與其他專頁或專業模式個人檔案建立多重發佈關係
  4. 尋找符合資格的多重發佈專頁。

建立多重發佈關係

為了在另一個專頁或專業模式個人檔案多重發佈內容,您的專頁必須向專頁或專業模式個人檔案傳送多重發佈要求,並且必須由獲邀請的專頁或個人檔案接受您的要求。

第 1 步:傳送多重發佈要求

若要傳送多重發佈請求,請使用下列參數向 /<YOUR_PAGE_ID> 端點傳送 POST 要求:

  • begin_crossposting_handshake 設定為包含逗號分隔專頁清單的陣列,其中 partner_page_id 設定為要求傳送對象的專頁編號,allow_live 設定為 true

測試 API 呼叫時,您可以在呼叫中加入 access_token 參數,並將其設為您的存取憑證。但是,從您的應用程式發出安全呼叫時,應使用存取憑證類別

我們已設定特定格式以便閱讀。
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}]"

成功的話,應用程式就會收到以下 JSON 回應,其中包含設為 truesuccess

回應範例

{
  "success": true
}

allow_live 設定為 false,以傳送建立多重發佈關係的要求,其中專頁只可在您的管理員或編輯者核准視像後,才多重發佈直播視像。

接受多重發佈要求

若要接受其他專頁的要求,允許其將影片多重發佈到您的專頁,請向 /<ID> 端點傳送 POST 要求,並將 accept_crossposting_handshake 參數設定為傳送要求的專頁編號,將 allow_live 設為 true

我們已設定特定格式以便閱讀。
curl -X POST "https://graph.facebook.com/v21.0/<PAGE_2_ID>
    ?accept_crossposting_handshake=[{partner_page_id:<PAGE_1_ID>, allow_live:true}]"

成功的話,應用程式就會收到以下 JSON 回應,其中包含設為 truesuccess。該影片現在將在多個專頁上發佈。

如要拒絕要求,請將 allow_live 設定為 false

尋找符合條件的專頁進行多重發佈

若要尋找您的應用程式用戶在哪些專頁有多重發佈權限,請向 /<PAGE_ID>/crosspost_whitelisted_pages 端點傳送包含下列欄位的 GET 要求:

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

成功後,您的應用程式將收到一個清單,當中列有編號、名稱以及標明是否允許專頁多重發佈的 truefalse 值,其中 true 表示來源專頁可以直接在目標專頁發佈多重發佈的直播影片,無需進一步授權,false 則表示目標專頁必須手動發佈多重發佈的影片

回應範例

{
  "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>"
    }
  }
}

在直播視像中加入多重發佈動作

準備工作

用戶必須能夠代表專頁執行操作,以及編輯和更新影片。換言之,您的應用程式將需要代表用戶擁有 pages_manage_posts 權限

我們知道可為哪些專頁使用多重發佈後,就能夠將 crossposting_actions 加入任何 LiveVideo 物件中。每個多重發佈動作都會定義是否可為直播視像使用多重發佈,以及是否應向目標專頁自動發佈直播視像。

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();

這些動作會顯示可用選項。第一個選項允許首個專頁(107738621396466)透過創作者工作坊或 API 多重發佈影片,但不會自動將影片多重發佈到任何地方。第二個選項會阻止第二個專頁(106589754846067)多重發佈影片,而第三個選項會將影片自動發佈到目標專頁(106343288214714)。

成功範例

傳回 LiveVideo 物件,而且我們已透過 crosspost_shared_pages 關係連線來查看可為哪些專頁應用多重發佈,以及透過 crossposted_broadcasts 關係連線來查看我們已經在哪些專頁上發佈帖子。

重要事項

如果任何多重發佈關係已變更或無效,則多重發佈顯然會失敗,但系統不會顯示錯誤。換言之,檢查成功直播的回應是知道操作是否成功的唯一方法。

{
  "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"
}

錯誤範例

如果任何 crossposting_options 失效,則整個要求都會失敗。所有多重發佈都不會成功。

{
  "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"
  }
}