がいよう
卒研の一つとしてfacebookで何かやるかーといった考えからAPIを使って何が出来るのか調べてた。
とりあえずアプリケーション登録(携帯アドレスが必要!)を済ませて、キー取得をしたけどここで後々面倒くさい事になったのでとりあえずまとめる。
リダイレクトURL = キャンバスURL*1
これに取り掛かる前にtwitterでも同様にAPIを使ってタイムライン取得する簡単なやつを作っていたけど、いわゆる「リダイレクト」処理(トークンをもらったらそれをリリースする先)の設定がどこなんだと悩んでしまった。
結果的に、アプリケーション内の「Facebook上のアプリ」の「キャンバスURL」がそれに該当しているんだなと。
ただこいつ、ディレクトリしか指定できないのでとりあえず「/fb_connect/」なり作って、API処理用のphpは素直にindex.phpとしてとしてやったほうが動く。
あと、実際に処理をする時に大抵のサンプルページで出てくる
- $app_id
- $app_secret
- $my_url
の3つ。
このうち上2つはアプリのidとシークレット番号だけど、一番下のmy_urlは上記に書いたfacebook上のアプリ内にある「キャンバスページ」のURL+最後に「/」だった。
これで直接ここにアクセスして処理を行うように出来るみたい。これを設定しないとアクセス許可のページで"API Error Code: 191"の「アプリケーションの設定で許可されていません。」と出てしまう。
PHP用のSDKを微妙に調節*2
ダウンロードしたSDKの「src/base_facebook.php」のだいたい512行目あたりの「getLoginUrl」をいじる。
array_merge(array( 'client_id' => $this->getAppId(), 'redirect_uri' => $currentUrl, // possibly overwritten 'state' => $this->state), $params));
を
array_merge(array( 'client_id' => $this->getAppId(), 'redirect_uri' => '(リダイレクト用のURL)', 'state' => $this->state), $params)); }
にする。僕はここに直接PHPのURLを絶対URLで書いたけどとりあえず動いてます。とりあえず。
get_file_contents関数は使いものにならない*3
だってそもそも「HTTPS」通信だし。
ここで一番引っかかった。接続先の「graph.facebook.com/~」にはちゃんとアクセストークンの記載がされてる。けど取得できない。
結局いろいろ試行錯誤しているうちにふと「http"s"だからできないんじゃないのか?」と思いsをぬかしてみるとあっさり取得。
じゃあこうなったらどうするのかと調べてみると、phpでもcurlって普通に使えるのね。こいつを使います。
やり方はいたって簡単。
//アクセストークンの取得 $access_token = file_get_contents($token_url); //生のgraphデータを取得 $graph_url = "https://graph.facebook.com/me?".$access_token; //生のgraphデータからjsonデータを構築(変換?)して整理 $user = json_decode(file_get_contents($graph_url));
こいつを
//アクセストークンの取得 $curl = curl_init(); curl_setopt($curl,CURLOPT_URL,$token_url); curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); $token_out = curl_exec($curl); curl_close($curl); $access_token = $token_out; //生のgraphデータを取得 $graph_url = "https://graph.facebook.com/me?".$access_token; $curl = curl_init(); curl_setopt($curl,CURLOPT_URL,$graph_url); curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); $graph_out = curl_exec($curl); curl_close($curl); //生のgraphデータからjsonデータを構築(変換?)して整理 $user = json_decode($graph_out);
とする。いちいちcurlを叩いては閉じてるって流れは個人的にわかりやすくしてるだけなので許してね。
つまり結局curlを使えばhttps通信ができるみたいなので、面倒くさい感じでもこっちでやらないとデータが取得出来なかったという流れでした。
これでひとまずよくあるサンプルの1つにある「名前を表示」が出てきたので、あとはそこから色々とひっぱってこれればいいかなー。
参考
は以下の注訳通り。