こんにちは!気づけば1年以上全く更新することなく月日が流れておりました・・・

更に気づけば、ボクも個人事業主として活動し始めております。何だか1年あれば色々な事が起こりますね!

さて、今回は超絶ハマってしまったFacebookのイイね数の取得のお話をしたいと思います。

Facebookのイイねの数を取得する

まず、イイねの数を取得するには

  • Graph APIに情報を取得しにいく
  • イイね数をゲットする
  • 取得した値を表示する

という非常にシンプルな流れになっております。

やり方ですが、

http://graph.facebook.com/?id=[URL]

と書くことで、投稿に対するイイね数が「Share」としてjsonで返ってくるわけです。

{
  "og_object": {
    "id": "xxxxxxxxxxxxxxxxx",
    "description": "ページの説明が入ってる",
    "title": "タイトルが入ってる",
    "type": "website",
    "updated_time": "投稿した時間が入ってる"
  },
  "share": {
    "comment_count": コメント数が入ってる,
    "share_count": シェア数が入ってる(イイね含む)
  },
  "id": "URLが入ってる"
}

はい。この感じで返ってくるので、このshareって値を使えば表示出来るということですね。

大体どの記事を調べてもこれは共通で書いていました。

403 Forbidden問題!アクセストークンが必要になった!?

上記の方法でイイね数を取得して、表示をしてみた所、別に変なことなく表示されました。

実装方法は以下(今回はWordpressでの表示が前提なので、Ajaxとかの方法は割愛)

  // いいね数を取得したいページのURL
  $url = get_permalink();

  // JSON形式のデータを取得
  $json_data = file_get_contents("http://graph.facebook.com/?id=". rawurlencode($url));

  // 連想配列形式に変換
  $arr = json_decode($json_data, true);

  // いいね数が存在する場合
  if (isset($arr['share']['share_count'])) {
    $facebook_cnt = $arr['share']['share_count'];
  }
  // いいね数が存在しない場合
  else {
    $facebook_cnt = 0;
  }

  echo $facebook_cnt;

これで問題なく表示された様な気がしたのですが、一瞬で状況が覆ります・・・

ブラウザを何回かリロードしてみると、
(#4) Application request limit reached
403(Forbidden)
とか出てきたー!!

何回かリロードしていると、表示されたり、されなかったり・・・

こんな不安定な状態が許されるわけありません・・・

調べてみると、

「リクエスト数に制限がある」

らしいです。が、普通に考えて、この上限に引っかかるとは考えにくい・・・

引き続き調べていると、どうやらアクセストークンというものを取得して、設定する必要があるらしいという事になりました。

Facebook for Developersって所で登録するみたいです。(やり方は調べればいくらでも出てくるので割愛)

ここで「App ID」と「App Secret」というものを取得します。

今回のボクの場合は幸いクライアントさんが取得してくれていました。が、この情報が正しいかどうかの検証はできない状態でした。(これが後に不安を呼ぶ)

App IDとApp Secretを取得したら、アクセストークンは簡単。

https://graph.facebook.com/oauth/access_token?client_id=【APP_ID】&client_secret=【APP_SECRET】&grant_type=client_credentials

上記の【APP_ID】と【APP_SECRET】の所を変更してアクセスすると、アクセストークンがわかります。

ちなみに調べなくても、

App ID|App Secret

という単純に「|」で繋ぐだけみたいです。

さて、無事アクセストークンが分かれば後は簡単!以下の様に「&」でアクセストークン値を繋ぐだけで問題なく表示されるようですっ!

ここでの注意点として、今まではhttpで大丈夫だったものが、httpsでしかアクセス出来ないようになっています。

https://graph.facebook.com/?id=[URL]&access_token=[ACCESS_TOKEN]

で、返ってきた結果がこれ

{
  "og_object": {
    "id": "xxxxxxxxxxxxxxxxx",
    "description": "ページの説明が入ってる",
    "title": "タイトルが入ってる",
    "type": "website",
    "updated_time": "投稿した時間が入ってる"
  },
  "id": "URLが入ってる"
}

・・・
・・・
・・・
・・・!?
shareの部分消えてる!?

ここからが地獄の始まりです。

何故shareが消えるのか分からない問題!

上記の通り、返り値から「share」という項目が消えています。

ここでボクが立てた仮説はこんな感じでした。

  • Facebook側で何かしらのエラーが起こっている
  • そもそもアクセストークン(App IDかApp Secret)が間違っている
  • shareの取得方法が変更された

まず、一番初めのFacebook側のエラーというのは考えにくいと思います。何故なら、他の値は取れているので、shareだけ取れないエラーは考えにくい。

となれば、疑うべきはアクセストークンが間違っている、もしくは取得方法の変更となります。

ただ、前述した通り、クライアントさんがApp IDとApp Secretを取得してくれていたので、これが正しい情報なのかどうか、調べようもありません・・・

まずはshareの値の取得方法から潰していこうと考え、メチャクチャ色んな記事を調べました・・・久しぶりに英語のサイトにまで入って調べてみても、書いているのは、やっぱり上記の書き方ばっかり。

 

やっぱり取得方法はこれで合っているんだ・・・

アクセストークンが違っているから表示されないんだ・・・

クライアント側に何かミスがあったのだ・・・

そうだ・・・オレは悪くない・・・

これはクライアントに今一度問いただすべきだ・・・

 

といったのが脳裏でループし始めます。

そんな時に、アクセストークンを入れて返り値を確かめられるデバッガーツールと出会います。

アクセストークンを入れて、URLを入れて「送信」を押すと返り値を確認できる優れもの・・・

ここの上の所にアクセストークンを入れ、

下に?id=[URL]を入れて見てみると・・・

{
  "og_object": {
    "id": "xxxxxxxxxxxxxxxxx",
    "description": "ページの説明が入ってる",
    "title": "タイトルが入ってる",
    "type": "website",
    "updated_time": "投稿した時間が入ってる"
  },
  "id": "URLが入ってる"
}

一緒やないかい!!

この時点では絶対にアクセストークンが間違っていると思っていました・・・

アクセストークンデバッガーとの出会い

諦めずに調べていると、今度はアクセストークンのデバッガーとの出会いがありました。

アクセストークンデバッガー

ここにアクセストークンを入れて「デバッグ」を押してみると、クライアントさんのサイト名が出てきました。

あれ・・・?

これ出てくるってことは、アクセストークンはあってるってこと・・・??

更にリンクが合ったので押してみると、

「アプリセンターで掲載はまだ承認されていません。」

との表示。

確かアプリ登録した時って、情報を公開するかしないかを選べたような気がする・・・

もしかしてこれが公開されていないから!?

とも思いました・・・が、何度も言うように、これを確認する術がありません。

この辺まで来ると、完全にアクセストークンのせいと考え、詰んだと思っていました。。。

神との出会い、そして奇跡の大逆転へ

もう完全にアクセストークンのせいだと思っているボクは、最早解決は出来ないと思い込んでいました。

しかし、なかなか諦めきれず探すこと数時間・・・

神との出会いがありました。

http://graph.facebook.com/?id=[URL]&fields=og_object{engagement},share

んん??

この&fields=と繋ぐことで特定の値だけ取得出来るということは知っていたのですが、こんな書き方は見たことねぇ!

早速先程の返り値を確認できるデバッガーに入力してみると・・・

{
  "error": {
    "message": "(#12) share field is deprecated for versions v2.9 and higher",
    "type": "OAuthException",
    "code": 何かの数字,
    "fbtrace_id": "何かのID"
  }
}

何かエラー出た・・・

でもこの程度なら大体わかるぞ!?

 

「shareって項目はV2.9以上で非推奨になりました」

 

そういうことか!!!!

そもそもshareって項目自体が無くなっていたのですか!!!!

何てこった。

ここでFacebookが優しくないのが、代わりに何になったのかを教えてくれない所・・・

 

いや、ちょっと待てよ・・・

このデバッグツール、実はGraph APIのバージョンも変更して試せるのです。すげぇ便利・・・

早速バージョンの所のプルダウンで別のバージョンを指定してもう一度デバッグ!!

{
  "error": {
    "message": "(#12) share field is deprecated for versions v2.9 and higher",
    "type": "OAuthException",
    "code": 何かの数字,
    "fbtrace_id": "何かのID"
  }
}

一緒やないかい!!

何かデバッグメッセージってのが出ていたので、開いてみると・・・

The app tried to call version v2.8. This app can only call versions v2.9 and higher, so the request defaulted to version v2.9

「v2.8でチャレンジしてみたけど、このappはv2.9以上しか使えないよー」

って書いてます・・・

強制的にv2.9以上にさせられているようだ・・・

 

★ちなみに余談ですが、個人で取得していたアクセストークンで試すと、問題なくシェア数が返ってきました。もしかするとアクセストークンを取得した時期、もしくは種類でこういった事が発生するのかもしれません・・・が、詳細は不明

 

さて、強制的にv2.9を使わされるのであれば、shareの代わりに何になったのかを調べるしかあらへんで!!

ということで調べました。

Graph APIの更新履歴にガッツリ書いてありましたよ・・・

 

「GET {url}のshareフィールドは削除されました。代わりに、engagementフィールドが追加されました。このフィールドにはreaction_count、comment_count、share_count、comment_plugin_countのフィールドが含まれます。」

 

どうやら「share」は「engagement」ってのに変わっているよう。

ここまで来たらこっちのもんや!!いくで!!ということで

http://graph.facebook.com/?id=[URL]&fields=og_object{engagement},engagement

と打つと・・・

{
  "og_object": {
    "engagement": {
      "count": ●●●,
      "social_sentence": "●●● people like this."
    },
    "id": "何かのID"
  },
  "engagement": {
    "reaction_count": ●●●,
    "comment_count": ●●●,
    "share_count": ●●●,
    "comment_plugin_count": ●●●
  },
  "id": "対象のURL"
}

きたぁぁぁ!!!ついにきた!シェア数もイイね数も表示されとるで!!

これ新しい仕様っぽいので少し詳細も書いておきます。まず上のog_object内

  • count = イイねとシェアを合計したシェア数(多分コメントがあった時もここに合算される)
  • social_sentence = よく見る何人がイイねしてるよ!という文章

次に下のengagementの値達

  • reaction_count = イイねの数
  • comment_count = コメントの数
  • share_count = シェアされた数
  • comment_plugin_count = これよくわからん・・・

といった感じの内容かと思います!

これを使って最初の構文を変更してみます!

  // いいね数を取得したいページのURL
  $url = get_permalink();

  // JSON形式のデータを取得
  $json_data = file_get_contents("https://graph.facebook.com/?id=". rawurlencode($url) . "&fields=og_object{engagement},engagement&access_token=[ACCESS_TOKEN]");

  // 連想配列形式に変換
  $arr = json_decode($json_data, true);

  // いいね数が存在する場合
  if (isset($arr['og_object']['engagement']['count'])) {
    $facebook_cnt = $arr['og_object']['engagement']['count'];
  }
  // いいね数が存在しない場合
  else {
    $facebook_cnt = 0;
  }

  echo $facebook_cnt;

ついに取得できました・・・

アクセストークンが間違っているなどと、人のせいにしようとしていた自分を叱ってやりたい・・・

兎にも角にもこれで大逆転できました!

まとめ

  • アクセストークンは何かの条件でV2.9以降しか利用できなくなる可能性がある
  • V2.9以降にshareという項目は無い
  • 代わりにengagementを利用する

Graph APIのV2.9以降で、
イイね数を取得、もしくはシェア数を取得したい場合

https://graph.facebook.com/?id=[URL]&fields=engagement&access_token=[ACCESS_TOKEN]

イイね数やシェア数などの合計を取りたい場合

https://graph.facebook.com/?id=[URL]&fields=og_object{engagement}&access_token=[ACCESS_TOKEN]

どちらも必要な場合

https://graph.facebook.com/?id=[URL]&fields=og_object{engagement},engagement&access_token=[ACCESS_TOKEN]

という書き方で取得できます!

ふぅ、大分長くなったな・・・

二度とハマらないように細かく記しておきました・・・

長々と失礼しましたっ!ではまた!!