FacebookのAPIは色々仕様が変わることもあって「手を付けたいけど、ちょっとやってみて挫折」を繰り返していました。しかし、どうしても作りたいアプリがあり、ちょっと時間もあったので挑戦してみてなんとかアプリの入り口に立てたと思えましたのでそれについて書きます。
Facebook APIで何が作りたいのか
最終的には「自分のFacebookでの発言を取得したい」のです。以前、アプリで過去の自分の発言を見ることができるものがあったのですがいつの間にか動かなくなって、Facebookの仕様が変わったからなのかなーと思っていました。それにしても、Facebookはだいぶ使ってるので過去の自分の発言を見ると色々さかのぼれて、便利だと思うのでこれは…作るしか無いのかなと思った次第です。
期間を指定してその間に自分が何を発言したか、分かればいいだけなんですがなかなかむずかしいです。
Facebook APIを試すために、いくつものステップがあります
半日ほどかけてやっとテストプログラムが動くようになったのですが、結果的に手順はこんな感じでした。
1.FBアプリ登録
2.Windowsローカル開発環境にcomposerを入れる
3.Facebook API の SDK for PHP ver.4.0.0 をインストールする
4.テストプログラムをデバッグして動くようにする
それぞれ細かく書くと1つずつのblog記事になるぐらいの分量です。せっかく一通りやったので、近いうちに1~2と3の一部はblog記事にしようかなとも思っています。今回は3.の一部と4.のテストプログラムについて書きます。
Facebook API の SDK for PHP ver.4.0.0
FacebookではAPIが用意されていて、それを使うための SDK もダウンロード出来るようになっています。
https://developers.facebook.com/docs/php/gettingstarted/4.0.0
こちらに書いてある composer もしくは ダウンロード の方法でインストールできます。私は参考にした記事と同じ方法にしたかったのでcomposerを使った方法でインストールしました。
この SDK for PHP ver.4.0.0 なのですが、Facebook API で検索して、記事はわりと見つかるのですがこの一つ前のSDKを使ったバージョン3.2.3のものが多いらしく、何度か色々試しましたがエラーになって進まないなどでなかなか進みませんでした。そもそも、バージョンがどうのこうのとも書いて無く(たぶんそれは第一次世界大戦が当時は第一次を付けてなかった<次が出るまではそんな名前で呼ばないと似たような事?)、なぜ動かないのかもよく分かってませんでした。
その中でこのバージョン4.0.0での記事を見つけ、これで動かすことが出来るようになりました(^^)/
Facebook SDK for PHP v4.0で「いいね!」をしたFacebookページを取得
これを元に、進めました。
composerのインストールは私が不慣れだったり、通常使っているPHPのバージョンが5.3だったり(このSDKはphp5.4以上で無いと動かない)で色々ありました。これについては後日書きたいと思います。試してみた環境はPHP Version 5.4.7です。
Facebookで自分が「いいね!」をしたFacebookページを取得する
参考にさせていただいたページの「PHPファイルの作成」にあるソースをコピーしてvendorの場所などが私とちょっと違ったので直して動かしました。記事に書いてあるように
Facebookはよく仕様が変わるので今回のもいつまでもつか分からないのですが、、、
のせいか、一カ所エラーが出ましたが分かりやすい所だったのでそこを修正して動くようになりました。
<?php session_start(); require("../../vendor/autoload.php"); // 自分の環境に合わせる use Facebook\FacebookSession; use Facebook\FacebookRequest; use Facebook\GraphUser; use Facebook\FacebookRequestException; use Facebook\FacebookRedirectLoginHelper; define("APP_ID", '<facebookアプリID>'); // 取得したFacebookアプリIDを入れる define("APP_SECRET", '<facebookアプリのシークレットID>'); // 取得したFacebookアプリのシークレットIDを入れる FacebookSession::setDefaultApplication(APP_ID, APP_SECRET); $helper = new FacebookRedirectLoginHelper('http://www.mikalocal.com/facebook/fb.php'); $session = $helper->getSessionFromRedirect(); $scope=null; if($session) { $accessToken = $session->getToken(); $request = new FacebookRequest($session, 'GET', '/me/likes'); $response = $request->execute(); }else{ //「いいね」をしたページリストにアクセスできる権限を付与 $scope = array('user_likes'); } ?> <html> <?php // エラーが出たのでif文を追加しました if(!$session) { ?> <div><a href="<?php echo $helper->getLoginUrl($scope); ?>">facebook認証</a></div> <?php } ?> <?php if(isset($response)) { $graphObjList = $response->getGraphObjectList(); foreach($graphObjList as $r) { //Facebookページの名前 $name = $r->getProperty('name'); //FacebookページID $fbPageId = $r->getProperty('id'); ?> <p><a href="http://www.facebook.com/<?= $fbPageId ?>"><?= $name ?></a></p> <?php } } ?> </html>
ソースはほぼ、参考にさせていただいたサイトのそのまんまです。以前も挑戦して何度も挫折したことがあったので動いたときには やった~! と叫んでしまいました。
このソースを fb.php という名前で保存して、ブラウザで
http://www.mikalocal.com/facebook/fb.php*http://www.mikalocal.com/facebook/ はローカルのxamppを.hostsで指定したもの+フォルダ名です
と入力してリターンすると、
このような画面になるので、 facebook認証 をクリックします。すると最初の1回だけ、
こういう「このアプリを許可するかどうか」の画面が出ます。ちょっと上の方にエラーが表示されていますが、そこについてはおいおい考えるとして(^_^;、自分のアプリなので怪しいけど OK をクリックします。
すると、
このように、自分が「いいね!」をした一覧が表示されました(^^)/。リンクをクリックすれば、
https://www.facebook.com/theamazing7
このように「いいね!」をしたページに飛ぶこともできます。やった…
自分のfeedを表示してみる
これでようやく1歩、自分の作りたいプログラムに近づけた気がしました。ソースをじっくり見ると、
$request = new FacebookRequest($session, 'GET', '/me/likes');
このへん、や
//「いいね」をしたページリストにアクセスできる権限を付与 $scope = array('user_likes');
このへん、を変えれば自分のfeedが表示されるんじゃ無いかな?と思いました。しかし、どう書いたらできるのかなぁとFacebook開発者ページをうろうろ探し回りました。
https://developers.facebook.com/docs/reference/php/facebook-getLoginUrl
ここに書いてあったサンプルに、
$params = array( 'scope' => 'read_stream, friends_likes', 'redirect_uri' => 'https://www.myapp.com/post_login_page' ); $loginUrl = $facebook->getLoginUrl($params);
というのがあって、 read_stream が使えるんじゃ無いかなーと思ったり、それまでに色々試したFacebook APIのページからこんな感じにすれば見えるのではという値を入れて、なんとか自分のfeedを表示することができました。思ったような自分の発言ではなく、リンクをシェアしたものだけになっちゃったのですが(^_^;、さらに一歩近づけたかなと思います。ソースは、
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style type="text/css"> * { font-family: Helvetica, Arial, 'Hiragino Kaku Gothic ProN', 'ヒラギノ角ゴ ProN W3', Meiryo, メイリオ, sans-serif; } </style> </head> <body> <?php session_start(); require("../../vendor/autoload.php"); // 自分の環境に合わせる use Facebook\FacebookSession; use Facebook\FacebookRequest; use Facebook\GraphUser; use Facebook\FacebookRequestException; use Facebook\FacebookRedirectLoginHelper; define("APP_ID", '<facebookアプリID>'); // 取得したFacebookアプリIDを入れる define("APP_SECRET", '<facebookアプリのシークレットID>'); // 取得したFacebookアプリのシークレットIDを入れる FacebookSession::setDefaultApplication(APP_ID, APP_SECRET); $helper = new FacebookRedirectLoginHelper('http://www.mikalocal.com/facebook/feed.php'); $session = $helper->getSessionFromRedirect(); $scope=null; if($session) { $accessToken = $session->getToken(); $request = new FacebookRequest($session, 'GET', '/me/feed'); $response = $request->execute(); }else{ // read_stream権限を付与 $scope = array('read_stream'); } ?> <html> <?php if($session) { } else { ?> <div><a href="<?php echo $helper->getLoginUrl($scope); ?>">facebook認証</a></div> <?php } ?> <?php if(isset($response)) { $graphObjList = $response->getGraphObjectList(); foreach($graphObjList as $r) { //Facebookページの名前 $name = $r->getProperty('name'); //FacebookページID $fbPageId = $r->getProperty('id'); //Facebookページ画像 $fbPicture = $r->getProperty('picture'); //Facebookページmessage $fbMessage = $r->getProperty('message'); // この下のコメントを外すとどのような名前でどのような値が返ってきているのかわかります。 //echo "<pre>";var_dump($r);echo "</pre>"; ?> <div style="margin:10px;padding:10px;border:1px solid #333;width:700px;"> <div style="float:left;"><img src="<?php echo $fbPicture;?>"></div> <div style="float:left;margin-left:10px;max-width:550px;"> <div><a href="http://www.facebook.com/<?= $fbPageId ?>" target="_blank"><?= $name ?></a></div> <div style="margin-top:5px;font-size:0.8em"><?= $fbMessage ?></div> </div> <div style="clear:both;"></div> </div> <?php } } ?> </body> </html>
こんな感じです。いい感じに表示したかったのでCSSとかも入れてみました。feed.phpという名前で保存して、実行すると
同じような画面になります。facebook認証 をクリックします。すると、
こんな感じで、自分がシェアしたfeedが一覧で表示されました!画像を表示したりCSSでちょっと見栄えを良くして、だいぶ自分の理想型に近づきました(^^)/
まとめ:これから理想のアプリに近づけるまで
Facebook APIは仕様がよく変わるようなので、情報を見つけるのがなかなか難しそうです。仕様が良く変わるのならやっと作ったアプリも動かなくなる可能性もかなり高そうなんですが…
それでもやはり、自分のFacebookでの発言を過去にさかのぼって検索できるようなアプリを作ってみたいのです。うん、ももしかすると気づかないだけですでにそういうアプリがあるのかもしれないんですが。
できるはず、と思えるのは今使っている Timehop というアプリが「過去の同じ日にFacebookや色々なSNSに写真を投稿していたらそれが見えるようにしてくれる」というサービスなのです。ときどきメールが来て「あー○年前の今日はこんなだったんだなー」と思ったりできる楽しいアプリです。
少なくともこれができるってことは写真だけでも過去のモノが見えるはず…。timehopで自由に日時が指定できればいいんですが、それができないので、やっぱり自分で作るしかないかー、と思っています。
FacebookのAPIについては開発者ページに色々掲載されているとは思うのですが全て英語であることと、先ほど調べたパラメータなどについてもどんな種類があってどんなことができるのかの情報があるのかということについて書いてあるページをまだ見つけられていません。もし、情報はここにあるよ!とか分かる方いたら是非教えてくださいm(_ _)m。
いつになったらできるのかは不明なのですが、いつかできたらまたblogに書きたいと思います♪
コメント