こんにちわ。webデザイナーの池田です。
弊社ではオリジナルレーベル「peakvox」にてfacebookを運用しているのですが、
突然facebookの更新情報が取得できなくなり、すこしハマってしまったので共有させて頂きます。
同じ現象にお悩みの方の参考になればと思います。
今までの取得方法
まずは、今までどのように取得していたかというところですが、
弊社ではgoogleFeedApiを使ってfacebookが発信しているfeed情報を取得してタイムラインの更新をお知らせしておりました。
しかしある日突然エラーが・・・。
「400:Feed could not be loaded.」
要するにフィードが読み込めないよーと言っているようです。

それもそのはず、実はfacebookのfeed配信の機能が2015年6月23日をもって終了となっていました。
https://developers.facebook.com/docs/apps/changelog#v2_3_90_day_deprecations
Page RSS Feed endpoint – at https://www.facebook.com/feeds/page.php is now deprecated and will stop returning data from June 23, 2015. Developers should call the Graph API’s /v2.3/{page_id}/feed endpoint instead. This returns JSON rather than RSS/XML.
と、いうことで別の方法でタイムラインを取得してみます。
GraphAPIを使ってタイムライン情報を取得しよう
アプリの登録をされている前提で進めていきますので、
1から始める方はまずはアプリの登録をしてAppID等取得してくださいね。
それでは必要な情報を見ていきましょう。
まずはAppID、APP_SECRETの確認
https://developers.facebook.com/apps/

アクセストークンの確認(取得)
https://developers.facebook.com/tools/accesstoken/

もしくは先ほど入手した、IDとSECRETを使って取得しましょう。
以下のURLで【~】は削除し、代わりにIDとSECRETを入れてアクセスするとAPPアクセストークンが取得できます。
https://graph.facebook.com/oauth/access_token?client_id=【APP_ID】&client_secret=【APP_SECRET】&grant_type=client_credentials
graphAPIでjsonを取得してみよう
さて、準備は整いましたね!
それではjsonデータを取得してみましょう。
まずはfacebookのapiを簡単に実行できるツールが用意されているのでそれを使ってjsonを見てみましょう。
facebook graph api explore
リクエストの種類は「GET」、その横のテキストボックスには、取得したいページのappIDを入力します。
取得したいページURLのhttps://www.facebook.com/peakvoxの末尾部分ですね。
今回はfeed情報がほしいので、以下のように入力します。
https://graph.facebook.com/v2.3/peakvox/feed

いかがでしょうか。
取得ができない!という方はアクセスの許可がされていない可能性があるので、
トークンの更新をしましょう。
Get Tokenボタンの中にある「Get Access Token」をクリックし、許可(取得)したい情報を選択します。
今回は、user_postのみで大丈夫ですね。

GetAccessTokenを押すことで更新、submitを押して情報を取得します。
上記画像のようにJSONが取得できましたでしょうか?
phpを使ってサイトに表示してみよう
それではjsonデータを取得し、サイトに表示してみましょう。
jsonデータを取得するには先ほどgraphAPIで確認したgetのフィールドに入っているURLにアクセストークンを足したものを入れます。
アドレスが一部隠れている場合はフィールド内の「→」をクリックするとすべて表示されます。
https://graph.facebook.com/v2.3/【APP_ID】/feed?access_token=【APP_TOKEN】;
今回の場合、自社サイトに情報を表示したいだけなのでUserTokenではなくAppTokenを使いましょう。
UserTokenというのはOAuth認証した際に発行されるユーザー固有のトークンになります。
AppTokenというのはfacebookアプリ固有のトークンになります。
例えば、認証をしたうえでユーザーの代わりに投稿したりする際はuserTokenが必要になりますが、
今回は自分のアプリから情報をもらうだけなのでAppTokenを使うというわけですね。
UserTokenはすぐに有効期限が切れてしまいますが(最長60日)、AppTokenは有効期限がありません。
phpで取得しよう
ということで今回の取得、表示の内容は以下とします。
- それでは、今回は更新された内容の本文と投稿時間を取得します。
- 記事へのリンクは今回はIDを分割してurlを生成することとします。
- 本文の内容は110文字までで、それ以上は”…”を表示し省略します。


<?php
//接続情報
define('APP_ID', "【peakvox】");
define('APP_TOKEN', "【appTokenが入ります】");
$url = "https://graph.facebook.com/v2.3/".APP_ID."/feed?access_token=".APP_TOKEN;
//json取得
$ch = curl_init();
curl_setopt_array($ch,
array(
CURLOPT_URL => $url,
CURLOPT_SSL_VERIFYPEER =>false,
CURLOPT_RETURNTRANSFER =>true,
)
);
$res = curl_exec($ch);
curl_close($ch);
//json整形
$array = json_decode($res, TRUE);
$comment = array(); //投稿内容を入れる配列です
$times = array(); //投稿時間を入れる配列です
for($i=0;$i<3;$i++){
//記事へのリンク生成のためidを取得して"_"の前後で分割します。
$urls = $array['data'][$i]['id'];
$url_array = explode("_", $urls);
$times[$i] = substr($array['data'][$i]['created_time'], 0, strcspn($array['data'][$i]['created_time'],'T'));
$comment[$i] = '<a href="https://www.facebook.com/'.$url_array[0].'/posts/'.$url_array[1].'" target="_blank">'.mb_strimwidth($array['data'][$i]["message"], 0, 110, "...")."</a>";
}
?>
<html>
-----省略-----
<?php
//3件表示するまでループで回します
for($i=0;$i<3;$i++){
?>
<div class="inner">
<p class="time"><?php echo $times[$i]; ?></p>
<p class="text"><?php echo $comment[$i] ?></p>
</div>
<?php
}
?>
</body>
</html>
実行結果

jsonの取得の際はfile_get_contents関数を使っても大丈夫です。
弊社の場合サーバーのallow_url_fopenの設定上httpsでの取得ができませんので
今回はcURL関数を使っています。
追記
後日談ですが、ヘッダー画像の変更などで画像のみ投稿された場合に空のデータが表示されてしまったので、その対応策を記載しておきます。
//json整形
$array = json_decode($res, TRUE);
$comment = array(); //投稿内容を入れる配列です
$times = array(); //投稿時間を入れる配列です
$display_cnt = 3; //画面に表示したい件数です
$i = 0; //配列のデータ件数を入れる変数です
foreach($array['data'] as $ary){
//配列に"message"のキーがあるかを確認
if(array_key_exists('message',$ary) == false){
continue;
}
//表示件数に達した場合はループから抜ける
if($i >= $display_cnt){
break;
}
//記事へのリンク生成のためidを取得して"_"の前後で分割します。
$urls = $ary['id'];
$url_array = explode("_", $urls);
array_push($times,substr($ary['created_time'], 0, strcspn($ary['created_time'],'T')));
array_push($comment,''.mb_strimwidth($ary["message"], 0, 110, "...")."");
}
Facebookへ投稿した際のコメントは”message”と言うキーで返ってきていましたが、コメントをしていない場合は空データではなく、キー自体がありませんでした。
ちなみに、$ary[‘message’]==””の書き方だと、環境によってはコメントがない場合に警告(“Notice”)が表示されていまう可能性があるため、キーのチェックで対応しています。
さいごに
いかがでしたか。
facebookは仕様変更が多いので突然動かなくなった!エラーが出ている!なんてことがたまにありますが、
便利なツールではあると思いますので、ぜひぜひ活用していきたいですね!
それではまた!























ピックアップ
