PHPでFacebookのウォールに投稿する

Facebookの自分のウォールに外部のスクリプトから自動的に投稿する方法です。なんか最近はいろんなことができすぎて困りますが、ここでは外部サイトの何らかの内容(結果)を普通にウォールに投稿する方法です。例によってFBのAPPSを1つ作成しておきます。大まかな手順は以下のようになります。
また、このブログさんがすごくまとまっていてわかりやすいです。

  1. facebookアプリの登録 FBの開発者サイトで投稿用のアプリを1つ作成します。
  2. OAuth認証でcode取得 指定のURLの引数に先のアプリのIDと認証後のページ遷移先を指定してcodeを取得します。要するにアプリにアクセスしてウォールに投稿する許可(ログイン)を行う作業です。

OAuth認証でcode取得

ウォールへの投稿の認証(許可)は、Facebook特有のAPIへのアクセスによって行います。
https://graph.facebook.com/oauth/authorize?client_id=[APPS_ID]&redirect_uri=[CALL_BACK_URL]&scope=offline_access,publish_stream,user_status,read_stream,status_update,manage_pages
・[APPS_ID]には、先程作成したアプリのIDを入力します。
・[CALL_BACK_URL]は、このAPIへのアクセス後(認証終了後)のリダイレクト先のURLを書きます。この際アプリで作成した時のApp Domains:に含まれるURLじゃないとエラーになります。(あっちゃこっちゃに勝手に飛ばせないということです。)このCALL BACK URLはキャンセルした時のリダイレクト先にもなります。
実際のURLはこんな感じになるかと。
https://graph.facebook.com/oauth/authorize?client_id=19808603358xxxx&redirect_uri=http://labo.omnioo.com/develop/facebook/OAuth_post_towall/callbk.php&scope=offline_access,publish_stream,user_status,read_stream,status_update,manage_pages
このURLをブラウザーで直接叩いちゃうとかPHPでリダイレクトするとかで、アクセスします。そうすると、
PostWall_AOuth
みたいな感じで、Facebookアクセスのダイアログが現れます。ここでは、公開範囲(ウォールに投稿した際の公開範囲)を選んで次に進む感じです。
次にこんなのが現れます。
fb_permission
許可すると押したらFacebookの認証が通ってコールバックで指定したURLにジャンプします。

時々しか作らないのですぐ忘れてしまうので備忘録なんですが、開発中にこの「許可」ボタンを押してしまうとFaebook側でAPPSの許可を登録してしまいます。それ以降自動的に認証されちゃうので、開発中・デバック中はこのアプリ認証の登録をいちいち削除しないと駄目です。自分のFBアカウントでログインして「アカウント設定」から「アプリ」を選択してアプリの設定画面で利用しているアプリの中から該当のものを削除します。(なんか他で使っているアプリを削除しないようにしてください。アプリ名で並んでますので。)

CALL BACKで指定したURLにリダイレクトするとURLの後ろにクエリとして長ったらしい文字列[?code=xxxxxx]がひっついてきますが、これがcodeになります。このコードはアクセスした人がぞれぞれ別のものになっています。codeはコピーしてどっかにコピーしておきます。

codeからアクセストークンを取得

先程のcodeをメモったら、今度は以下のコードでアクセストークンを取得します。アクセストークンはログインするためのパスワードみたいなもんです。
https://graph.facebook.com/oauth/access_token?client_id=[APPS_ID]&redirect_uri=[CALL_BACK_URL]&client_secret=[APPS_SECRET]&code=[code]
[APPS_ID]と[CALL_BACK_URL]はさっきと同じです。
[APPS_SECRET]は最初に作成したFBアプリの秘訣とかいうやつです。APP Secretっていうやつです。この文字列はアプリIDとセットにすると悪用することができるので外部にさらさないこと!
[code]は先程取得したcodeです。
やたらに長い文字列になりますが、これらをブラウザーとかでダイレクトにアクセスしちゃってください。そうするとブラウザー上に
access_token=CAACXDesIwfEBAFNuGYd0BpM9fUCmKzDZALpSLbxxihp9uUFqgXZAzdvZAg0tGuS0rZA9dqgv14xxuhZAYOOwONhnaTPZC1g17MpfZBPrFmvxx7t0LnGyZBVEx0tRZAL830UOJxgQgJZA8EntYQmVXhglZA0Wxxm9ZBBTC3FRUHdMTIZC2R58FZCfmgNRMqLv&expires=5181000
という感じで「access_token=アクセストークン」が返ってきます。これがいわゆるユーザーアクセストークンというやつでユーザー単位でアクセスできるものになります。
何かしら間違っていたら
{
"error": {
"message": "This authorization code has expired.",
"type": "OAuthException",
"code": 100
}
}

というようなエラーステータスが返ってきます。

ウォールへ投稿する

のだけど、その前にUSER_IDを取得しないと駄目です。USER_IDはこれまたFacebook的な感じで取得します。先程のアクセストークンをくっつけてAPIにアクセスしてあげます。
https://graph.facebook.com/me?access_token=[ACCESS_TOKEN]
どばーっとユーザー情報が返ってくるので、

{
"id": "177771278784xxx", ←これ
"name": "Onamae Myouji",
"first_name": "Oname",
"last_name": "Myouji",
"link": "https://www.facebook.com/onamae",
"username": "username",
以下省略…

という感じでIDを取得します。

このUSER_IDを取得したら、ウォール投稿用のAPIにアクセスします。
https://graph.facebook.com/[USER_ID]/feed
なんですが、最後の最後だけどうしてだかPOSTじゃないと投稿できません。世間ではCURLとか使ってやってる風ですが、普通にFormとかからPOSTで大丈夫です。投稿に必要なものは、最低限で、
access_token=[ACCESS_TOKEN]
message=[MESSAGE]
になりますので、以下のような感じになるでしょうか。
https://graph.facebook.com/17777127878xxxx/feed?access_token=CAACXDesI…mgNRMqLv&expires=5180000&message=Hallo world!
みたいな感じになります。
フォームにすると、こんな感じ。

<form action="https://graph.facebook.com/17777127878xxxx/feed?access_token=CAACXDesI…mgNRMqLv&amp;expires=5180000&amp;message=Hallo world!" method="post">
<input type="submit" />
</form>

送信するとHallo world!が投稿されるという仕組みです。
wall_posted
ここまではいわゆる仕組みの部分なので、全然実用的じゃないです。自動的にアクセストークンを取得して投稿するシステムはいろいろ作れると思うのでいろいろやってみてください。
ここで私のウォールにタイムスタンプだけ投稿できるので、やってみてください。(あんまりやらないでもいいです。)
http://labo.omnioo.com/develop/facebook/OAuth_post_towall/post.php

参考URL

http://memo-txt.blogspot.jp/2011/12/phpfacebookgraphapifacebook.html
http://d.hatena.ne.jp/jeimy/20110717/1310887887
http://t2aki.doncha.net/?id=1339600839