Facebookのシェア数が取れなくなったので見直してみた

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
To be or not to be, that is the question.

この記事を三行にまとめると

「og_object」の中のcountに変えればシェア数が復活できる
まだシェアされていないURLのシェア数は取ってきてくれない
シェイクスピアも言ってましたしね
もう何度目になるか分からないんですが、最近このブログでFacebookのシェア数が取れなくなってしまいまして……とりあえずそれを何とかしたって話です。

いずれまた仕様が変わってこの方法でも取れなくなる可能性は十分にありえるので、少なくともこの記事の公開時点(2021年6月)ではこの方法で取れるようになったということでお願いします。



参照すべきパラメータが変わった

シェア数取得用のAPIをコールするとこんな感じの結果が返ってきます。

{
 "og_object": {
    "engagement": {
      "count": 10,
      "social_sentence": "10 people like this."
    },
    "id": "1234567890111111"
  },
  "engagement": {
    "reaction_count": 0,
    "comment_count": 0,
    "share_count": 0,
    "comment_plugin_count": 0
  },
  "id":"https:\/\/norm-nois.com\/
}

今まではこの下の方にある「comment_count」やら「share_count」やらがいいねの数やコメントの数を個別に持ってて、それを合算すればシェア数を取得できていたんですけど、現在はなぜかこっちのカウントが全部0になってしまうという現象が起きているみたいで、バグなのか仕様変更なのかは分かりませんがとにかくこっちからはシェア数を取れなくなってしまいました。

なので「reaction_count」やら「share_count」の合算で取得していたシェア数を「og_object」の中のcountに変えればシェア数が復活できるということですね。

むしろ昔はog_objectのcountでシェア数を取っていたような気もするんですけど……気のせいかな。



SNS Count Cacheを使っている場合

Wordpressを使ってサイトを構築している場合はおそらく「SNS Count Cache」というプラグインを使ってシェア数を取得している人も多いと思います。

現時点での最新バージョンは1.1.3ですが、このバージョンでは上記にある通りシェア数を「reaction_count」やら「share_count」の合算で取得するようになっているので、この部分を自分で書き換えればOKです。

プラグインの中の「class-scc-share-facebook-crawl-strategy.php」というファイルを開くと100行目辺りに「extract_response_body」というシェア数取得用の関数がありますが、1.1.3だとこの中身はこんな感じになってます。

SCC_Logger::log( '[' . __METHOD__ . '] (line=' . __LINE__ . ')' );
$count = 0;

if ( isset( $content['body'] ) && empty( $content['error'] ) ) {
  $json = json_decode( $content['body'], true );

  if ( isset( $json['engagement'] ) ) {
    if ( isset( $json['engagement']['reaction_count'] ) ) {
      $reaction_count =(int) $json['engagement']['reaction_count'];
    } else {
      $reaction_count = 0;
    }
    if ( isset( $json['engagement']['comment_count'] ) ) {
      $comment_count =(int) $json['engagement']['comment_count'];
    } else {
      $comment_count = 0;
    }
    if ( isset( $json['engagement']['share_count'] ) ) {
      $share_count =(int) $json['engagement']['share_count'];
    } else {
      $share_count = 0;
    }
    if ( isset( $json['engagement']['comment_plugin_count'] ) ) {
      $comment_plugin_count =(int) $json['engagement']['comment_plugin_count'];
    } else {
      $comment_plugin_count = 0;
    }

    $count = $reaction_count + $comment_count + $share_count + $comment_plugin_count;
  } else {
    $count = 0;
  }
} else {
  $count = 0;
  if ( isset( $content['error'] ) ) {
    SCC_Logger::log( $content['error'] );
  }
}

return $count;

この「reaction_count」やら「share_count」を合算しているところをごっそりコメントアウト(削除でも可)して、新たに「ob_object」のcountを取得するように書き換えます。

SCC_Logger::log( '[' . __METHOD__ . '] (line=' . __LINE__ . ')' );
$count = 0;

if ( isset( $content['body'] ) && empty( $content['error'] ) ) {
  $json = json_decode( $content['body'], true );

  //ここを追加
  if(isset($json['og_object']['engagement']['count'])) {
    $count = $json['og_object']['engagement']['count'];
  } else {
    $count = 0;
  }
} else {
  $count = 0;
  if ( isset( $content['error'] ) ) {
    SCC_Logger::log( $content['error'] );
  }
}

return $count;

これでOKです。



それでも取れない場合

FacebookはまだシェアされていないURLのシェア数は取ってきてくれない仕様になっているので、新規に公開したページのシェア数は上記の修正を施しても上手く取得できないことがあります。

URLがシェアされていないかどうかはFaebookの「シェアデバッガー」というページで確認できます。

しかたないとはいえ地味にめんどくさい仕様

シェア数を取得したいURLを入れて上のように「まだシェアされていません」と出た場合は「新しい情報を取得」のボタンを押してFacebookにシェアしてあげれば取得できるようになります。

ただしこの方法だとブログを更新するたびに毎回このページを開いて手動でシェアしていかなきゃいけないので、更新頻度が高い人にとっては大変かもしれません。

そういう時は一応スクレイピング用のAPIが用意されているので、そこにPOSTリクエストを投げればシェアできます。

$params = array(
  'id' => 'シェアしたいURL',
  'scrape' => true,
  'access_token' => 'アクセストークン',
);
$url = 'https://graph.facebook.com/v11.0?'.http_build_query($params);
  
$ch = curl_init();  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_exec($ch);
curl_close($ch);

これはPHPとcurlを使ってリクエストを投げる一例です。シェアしたいURLとアクセストークンをリクエストに含めてPOSTすれば、先ほどのシェアデバッガーのページで新しい情報を取得した時と同じ処理が行われてURLがシェアされます。

これは新規にページを公開した後に一度だけやれば良い作業なのでSNS Count Cacheのシェア数を取得するところに組み込む必要はないです。むしろそこに組み込んじゃうとシェア数を取得するたびに不要なリクエストを投げることになるので、Facebook側に余計な負荷を与えてしまうからやめた方が良いです。



ちなみにシェアできていても下記のように修正が必要な問題が発生しているとシェア数を取得してくれないことがあります。

問題なくても問題ありって言われることがあるのよね

こういう時はここに書かれている内容に従って修正を行い「もう一度スクレイピング」のボタンを押して問題がなくなればシェア数が取得されるようになります。たまに問題ないはずなのにこのメッセージが出ることもあるんですが、そういう時はとりあえずもう一度スクレイピングすれば消えます。先ほどと同じように自分でスクレイピングAPIをコールしてPOSTリクエストを投げても良いです。






ざっくりとした説明ですがこれでFacebookのシェア数は復活すると思います。

それにしても僕の勝手な印象ではSNS Count Cacheを使っている人結構多いと思ってたんですけど、ここ最近の情報で「シェア数取れなくなったぞゴルァ!!」って言ってる人をあまり見かけなかったんですよね。みんなは問題なく取得できていて僕のサイトだけがこの仕様変更に巻き込まれたのかな……そんな負の特別待遇はいらんですよ^^;

まあ何にせよこの手の仕様変更は今後も発生しますから、めんどくさいけど対応してくしかないですね。特にFacebookは他のSNSよりもAPIの仕様がよく変わるイメージがあるし……。

それかもうシェア数を表示するのを思いきってやめちゃうか、ですね。シェイクスピアも言ってましたしね。「To be, or not to be, that is the question(いたちごっこを続けるか死ぬか、それが問題だ)」って。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください