しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Graph API を使って Facebook ページへ投稿を行う 2 つの方法

仕事で Facebook の Graph API を使う機会が多いのですが、最近まで Facebook ページに対して投稿を行う方法を良く分かっていなかったのでメモしておきます。

Facebook ページへの投稿といっても 2 種類あり、タイムラインのページ名で投稿されている分と、サイドバーにあるページへの投稿セクションに表示される分になります。

f:id:shiba-yan:20140820213417p:plain

それぞれで API は同じですが、アクセストークンが異なるので、そのあたりの仕組みを知っておかないと割と悩み続けることになります。

ユーザーとして投稿

基本的に Facebook の Graph API を使って何らかの投稿を行うためには publish_actions パーミッションを取得する必要があります。

f:id:shiba-yan:20140820212412p:plain

それ以外は自分のタイムラインに投稿する場合と変わりません。基本的にはパスを /me/feed からページ ID に変えるぐらいです。

var client = new FacebookClient("ACCESS_TOKEN");

await client.PostTaskAsync("/PAGE_ID/feed", new { message = text, link = url });

ただし、注意点として投稿先のページに管理者として登録されている場合、manage_pages パーミッションが必要というエラーになってしまいます。

{
  "error": {
    "message": "(#283) Requires extended permission: manage_pages", 
    "type": "OAuthException", 
    "code": 283
  }
}

管理者として登録されていないページに対しては問題なく投稿されるのと、数年前から同じような問題に悩まされている人がいるようなので、Graph API 側のバグっぽいです。

ページの管理者として投稿

ユーザーとして投稿する場合には publish_actions パーミッションだけで問題ありませんでしたが、ページの管理者として投稿するためには追加で manage_pages パーミッションを取得する必要があります。

f:id:shiba-yan:20140820212300p:plain

使用するアクセストークンはユーザーのものではなく、ページ専用のアクセストークンを取得する必要があるので少し手間が増えます。

var client = new FacebookClient("ACCESS_TOKEN");

dynamic accounts = await client.GetTaskAsync("/me/accounts", new { message = text, link = url });

/me/accounts というパスで現在のユーザーが管理しているページのアカウント情報が取得できるので、今回は手っ取り早く Graph API Explorer を使って API を叩いてみました。

f:id:shiba-yan:20140821220933p:plain

返ってきた JSON にアクセストークンが含まれているので、これを利用してユーザーとして投稿する場合と同じコードで API を叩くだけです。

var client = new FacebookClient("ACCESS_TOKEN");

await client.PostTaskAsync("/PAGE_ID/feed", new { message = text, link = url });

実行してみると、ユーザー名ではなくページの管理者として投稿されたことが確認できます。

f:id:shiba-yan:20140820220714p:plain

よくあるブログが更新されたタイミングや、ブログの RSS を読み込んで Facebook ページへ自動投稿する bot なども簡単に実装できると思います。