Google+のシェア数を取得するためにSNS Count Cacheを魔改造してみた

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
歯車って男の子って感じしない?

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

今後は+1ボタンにカウントの表示はしませんよ〜
サンキューTom!!
SNS Count Cacheも何とかしてみようじゃないかと
2017/09/28 追記

すみません。この方法でもGoogle+のシェア数は取得できなくなってしまったっぽいです。エラーにはならないのですが、どのページもシェア数が0で返ってきてしまいます。他の方法があるかどうか現在調査中ですが……すまん、これはどうにもならんかもしれぬ。






ちょっと前にGoogle+1ボタンに関して仕様変更があったみたいです。

Making the G+1 button load more quickly

簡単に言うと「高速化のために今後は+1ボタンにカウントの表示はしませんよ〜」って感じの内容かな。

というわけで、今後は公式の+1ボタンを設置しても「G」の文字が出るだけでシェア数は表示されなくなってしまうわけなのですが、中にはどーしても表示したいって人もいるかもしれない。公式のボタンはしかたないにしても、自作のオリジナルボタンを表示している場合は、他のSNSのボタンはシェア数を表示してるんだからそろえておきたいって思う人もいるでしょう。俺もちょっと思う。

なので、ちょいと足掻いてみようじゃないかと。特にWordpressのプラグインである「SNS Count Cache」を使っている人はこの仕様変更でシェア数を取得できなくなったと思うので、そっちも何とかしてみようじゃないかと。そんな次第です。



PHPでシェア数を取得する

まずWordpressとかに関係なく、PHPでシェア数を取得する方法をば。curlを使って取得します。

こちら↓のページにある方法を使えば任意のページのシェア数を取得することができるみたいです。

Google +1 Button SEO – Getting Bulk Counts with the hidden API

ぶっちゃけ何年も前の記事なんで、そのうちまたGoogleが仕様変更して使えなくなってしまう可能性もなきにしもあらずなのですが、とりあえずこの記事を書いている時点(2017年8月某日)ではまだ有効なようなので、このやり方を拝借させていただくことにします。サンキューTom!!(←上記の記事を書いてる人)

いつかTomさんにお会いしたら、我が地元の名産にして和を代表する食文化の一つである美味しいお蕎麦でもおごろうと思います。

何でこのURLで取得できんのかってのが分からないんで詳細には説明できないんですが、例えばこの記事のシェア数を取得したいならこんな風に書きます。

$request_url = 'https://clients6.google.com/rpc';
$params = array(
  'method' => 'pos.plusones.get',
  'params' => array(
    'id' => 'https://norm-nois.com/blog/archives/3940',
  ),
  'apiVersion' => 'v1',
);
 
$ch = curl_init();  
curl_setopt($ch, CURLOPT_URL, $request_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
 
$result = curl_exec($ch);
curl_close($ch);

Tom氏の記事の中ではもう少しいろんなパラメータを設定しているのですが、僕が自分で試して見た限りではこれだけ書いてあれば取得はできるっぽいです。特にAPIキーはあってもなくても動きが変わらないようなので、僕は省略しました。もしエラーになるようだったらすみません。他のパラメータやAPIキーもつけてリトライしてみてください。

大事なのは「id」のパラメータに取得したいURLを書くことと、POSTデータはJSON形式でリクエストすること。「http_build_query()」を使ってクエリ形式でリクエストしても、サポートしてないぜって感じのエラーが返ってきます。

リクエストが正常に処理されれば以下のような結果が返ってきます。

{
  "result": {
    "kind": "pos#plusones",
    "id": "https://norm-nois.com/blog/archives/3940",
    "isSetByViewer": false,
    "metadata": {
      "type": "URL",
      "globalCounts": {
        "count": 1.0
      }
    },
    "abtk": "***"
  }
}

「”count”: 1.0」ってなってるところがシェア数です。なぜか小数点つきで返ってきますが、この場合はシェア数が1ってことですね。これでシェア数を取得できるので、あとはint型に直すなり何なりして好きに使ってください。json_decode()を使えば返り値のJSONデータを配列に直せるので、「$result[‘result’][‘metadata’][‘globalCounts’][‘count’]」でシェア数が取れます。「abtk」は毎回値が変わるので今は適当に「***」と書いてます。



SNS Count Cacheに応用してみる

WordpressにはGoogle+を始め、いろんなSNSのシェア数を取得してくれるSNS Count Cacheという便利なプラグインがあります。

Google+1はシェア数を取得するための公式なAPIが(たぶん)存在しないため、SNS Count Cacheでは公式の+1ボタンのhtmlを解析してシェア数を取得するみたいな処理をやってたんですよ。でも今回の仕様変更に伴ってhtml内からカウントの存在が消えてしまったため、SNS Count Cacheもシェア数を取れなくなってしまったというわけなのです。

なので、上記の取得方法をSNS Count Cacheにぶっ込んで、何とかシェア数を取れるようにしてみたいと思います。

前置きというか言い訳させてもらうと、結構強引に魔改造したので、たぶん大丈夫だとは思いますが、同じ方法で改修する場合はプラグインのバックアップをちゃんと取ってからやってください。万が一プラグインが動作不良を起こしても責任が取りきれないもんで……すんまそん。

あとプラグインに直接手を入れているので、もしも今後SNS Count Cacheのバージョンが上がった場合などにアップデートしてしまうと、改修したところも上書きされちゃうんで気をつけてください。

今回は以下の二つのファイルに手を入れました。SNS Count Cacheのバージョンは0.11.1です。

・class-scc-share-crawler.php
・class-scc-share-google-strategy.php



ほんじゃ、まずは「class-scc-share-crawler.php」の方から。

95行目くらいから「get_data()」というシェア数を取得するためのメソッドがあるのですが、その中に二箇所ほどコードを書き加えます。

書き加える行数とコードは以下の通り。

//103行目あたり
foreach($valid_target_sns as $sns => $active) {
  if(method_exists($this->crawl_strategies[$sns], 'custom_get_method')) {
    $custom_methods[$sns] = true;
    unset($valid_target_sns[$sns]);
  }
}

//180行目あたり
if(!empty($custom_methods)) {
  foreach($custom_methods as $sns => $active) {
    $response[$sns]['data'] = $this->crawl_strategies[$sns]->custom_get_method();
  }
  $data = array_merge($data, $response);
}

何をやってるかってーと、まず103行目の方で、SNSごとにシェア数取得用に自作した「custom_get_method」というメソッドがあるかどうかを判定してます。もしあれば、通常の取得方法は行わずにそっちのメソッドでシェア数を取得するようにしています。180行目の方に追加したコードでその自作メソッドを実行しています。

Google+だけ別の方法で取得するみたいなピンポイントな書き方をしても良かったとは思うのですが、もしも他のSNSでも似たような状況が発生した場合にcustom_get_method()さえ作成すれば対応できるように、なるべく汎用的にしてみました。



次に「class-scc-share-google-strategy.php」です。こっちでは「custom_get_method()」の作成と、「extract_count()」という関数の中身を書き換える必要があります。

まずは「custom_get_method」を作成し、前述のシェア数を取得するコードを当て込んでみます。

public function custom_get_method() {
  $base_url = 'https://clients6.google.com/rpc';
  $params = array(
    'method' => 'pos.plusones.get',
    'params' => array(
      'id' => $this->query_parameters['url'],
    ),
    'apiVersion' => 'v1',
  );
 
  $ch = curl_init();  
  curl_setopt($ch, CURLOPT_URL, $base_url);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS,  json_encode($params));
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
 
  $result = curl_exec($ch);
  curl_close($ch);
  return $result;
}

「extract_count()」は以下のように書き換えればオッケー。

public function extract_count( $content ) {
  SCC_Common_Util::log( '[' . __METHOD__ . '] (line='. __LINE__ . ')' );

  $count = (int) -1;

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

    if(isset($json['result']['metadata']['globalCounts']['count'])) {
      $count =  (int) $json['result']['metadata']['globalCounts']['count'];
    } else {
      $count = (int) -1;
    }
  } else {
    $count = (int) -1;
  }

  return $count;
}

さっきと同じで、[‘result’][‘metadata’][‘globalCounts’][‘count’]に入ってるシェア数を整数に直して返すようにしました。



「お前の説明は分かりにくい。良いからコードをよこすのです。ヒャッハー!!」って人は、魔改造した二つのファイルを以下に置いとくのでファイルごと自分で上書きしてください。

sns_count_cache.zip

Macで圧縮ファイル作ったからWindowsで解凍すると変なファイルが入ってるかもしれないけど無視してください。あともう一度言いますけど、くれぐれも上書きする前に元ファイルのバックアップを取っといてくださいね。僕の環境ではちゃんと動作してることを確認しましたけど、どうなるか分かんないから。






前にTwitterもシェア数を返さないように仕様変更したことがありましたけど、あれなんですかね、SNS的にはシェア数を表示することはあまり大きな意味をなさない、みたいなことなんですかね……SEOにもたいした影響はないとか。他のSNSもシェア数は表示しないのがこの先スタンダートになっていくのでしょうか。

でもたくさんの人に見られてる指針にはなると思うんだけどねぇ。確かにTwitterやはてブのシェア数が多いからと言って、それは酷評されまくってる結果かもしれないから一概に良い記事であるとは言えないかもですが……Amazonでレビュー自体はたくさんついてるけどほとんど星一つ、みたいなね。でも表示はしなくても、どれくらいシェアされてるかこちらで把握しておきたいって需要は簡単にはなくならない気はするんですがね。はたして。

何にせよGoogle+のシェア数を今後も取り続けたいって人は、上記の方法でいけると思うんで試してみてください。もし不具合が出た場合は言ってちょ。分かる範囲でですが対処いたしますゆえ。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください