Help us understand the problem. What is going on with this article?

Google+1のシェア数をクライアントサイドだけで取得 & Facebookのシェア数の取得に関する特殊な事情 & ちょっと宣伝

More than 5 years have passed since last update.

Google+1のシェア数取得までの道のり

第1章 Google+1攻略作戦

巷で紹介されているシェア数の取得の情報って大体はTwitter、Facebook、はてなブックマークだけなんです。

なぜかというと上記3サービスには公式でシェア数を取得するAPIが用意されているから。

SNS分野に殴り込みをかけてしばらくたったネットの怪物、あのGoogleがこともあろうにシェア数を取得するAPIを用意していないときたもんだ。

まあ公式のボタン使えよってことなのかね・・・

でもやっぱりGoogle+1のシェア数欲しいなーって事でググってみたらこんなのを見つけました。

http://stackoverflow.com/questions/8853342/how-to-get-google-1-count-for-current-page-in-php

公式のGoogle+1ボタンは専用のスクリプトをロードして、そのスクリプトがページ内にインラインフレームを作ってそこにボタン部分のHTMLを埋め込むという処理になっていますが、その埋め込むHTML自体を直接取得してその中からシェア数の数字を引っこ抜くという力技ですが、一応この方法でシェア数は取得できるようです。

で、問題はここからで、上記の記事はPHPによる取得、つまりサーバーサイドだからこそできる方法であり、クライアントサイドからjQueryで同じことをやろうとしても「クロスドメインだからさせねーよ」になってしまいます。

安易な解決方法としてはサーバーサイドでGoogle+1のシェア数を取得する小型スクリプトを用意して、それとセットで動かせば目的は達成できますが・・・

第2章 そんなの全然お手軽じゃない!

やっぱりjQueryのプラグインだけで取得できるようにしたい。

どこかにあるはずだ・・・Google Feed APIみたいな中継サービスでRSS以外に対応しているようなのが・・・

と思い探してみたところ、YQLというYahooが提供しているサービスでインターネット上のさまざまなリソースをSQLの形式で指定して取得できるようです。

参考サイト: http://hail2u.net/blog/coding/you-can-do-it-with-yql.html

これよこれ。これとさっきのGoogle+1ボタンのシェア数取得を組み合わせれば攻略完了でないの。ブヒヒ

で、$.ajaxでこんなリクエストを飛ばしてみました。

http://query.yahooapis.com/v1/public/yql?q=SELECT * FROM html WHERE url='https://plusone.google.com/_/+1/fastbutton?hl=ja&url={シェア数を取得したいURL}'
# 実際にはパラメータのURLエンコードが必要

あれ?取得できない?と思ってYQL Consoleで確認してみたら

第3章 圧倒的拒否からの逆転

Redirected to a robots.txt restricted URL: https://plusone.google.com/_/+1/fastbutton? ...

googleのrobots.txtに拒否られてやんの。オワタ

でも諦めたらそこで試合終了らしいからもうちょっと粘ってみる。

で、見つけました。YQLにはOpen Data Tableというプラグインみたいな機能があって、その中のdata.headerというプラグインを使えばgoogleにアクセスできるみたい。

参考: http://stackoverflow.com/questions/9200513/yql-redirected-to-a-robots-txt-restricted-url-error-for-google-domain

参考: http://hail2u.net/blog/coding/jquery-query-yql-plugin-supports-open-data-tables.html

これらを参考に、先ほどの$.ajaxリクエストのURLを修正。

http://query.yahooapis.com/v1/public/yql?q=SELECT content FROM data.headers WHERE url='https://plusone.google.com/_/+1/fastbutton?hl=ja&url={シェア数を取得したいURL}' and ua='#{それっぽいUser-Agent}'&env=http://datatables.org/alltables.env
# 実際にはパラメータのURLエンコードが必要

修正バージョンのYQL Console

おおっHTMLを取得できた!あとはこのHTMLをゴニョゴニョして・・・

gplus.png

でけたー!

と、こんな感じでゴリ押し感満載ですがGoogle+1ボタンのシェア数を取得する事ができました。

めでたしめでたし。

Facebookの正確なシェア数の取得に至るまでの苦難の物語

第1章 あれ?Facebookのシェア数が公式のいいねボタンの数字と違くね?

巷でよく紹介されているFacebookのシェア数の取得方法はこんな感じだと思います。

https://graph.facebook.com/{シェア数を取得したいURL}

通常、このリクエストを飛ばすとこんなJSONが返ってきます。

{
  "shares": 100,
  "id": "{指定したURL}"
}

このsharesが公式のいいねボタンの数字と同一になると一般的には言われています。

でも、一部のサイトに対してはこんなJSONが返ってくることがあります。

{
  "were_here_count": 0,
  "talking_about_count": 0,
  "name": "{サイト名}",
  "link": "{指定したURL}",
  "likes": ,
  "is_published": true,
  "is_community_page": false,
  "id": "{数字のみで構成されたID}",
  "about": "{サイトの説明ぽい}",
  "app_id": "0",
  "can_post": false,
  "category": "Website",
  "checkins": 0,
  "description": "{サイトの説明ぽい}",
  "has_added_app": false
}

なんぞこれ?と思いましたが、どうやらOGP(Open Graph Protocol)を設定しているサイトではこんなJSONが返ってくるみたいです(でも全部じゃないっぽいので正直イミフ)。

困ったのが、このJSONにはsharesなる項目がありません。

likes2ってのがそうなんじゃないの?とも思いましたが、この時チェックしたサイトのいいねボタンの数字は7でした。

第2章 じゃあプランBで

Facebookのシェア数を取得する方法は他にもあります。FQL(Facebook Query Language)です。

参考サイト: http://www.imamura.biz/blog/sns/facebook/8393

というわけでFQLで同じサイトのシェア数を取得してみる事にします。

https://graph.facebook.com/fql?q=SELECT total_count FROM link_stat WHERE url='{シェア数を取得したいURL}'
# 実際にはパラメータのURLエンコードが必要

こんな感じでリクエストを飛ばすとこんなJSONが返ってきます。

{
  "data": [
    {
      "total_count": 5
    }
  ]
}

このtotal_countがシェア数なわけですよ(ドヤァ。

ってあれ?7じゃないし・・・

いやでも大抵の場合はこれでいけるはずなんです。ホントですカンベンしてください。

第3章 ん?2 + 5 = 7?ハッ

えー、マジでー?と思いましたがマジっぽいです。海外のフォーラムで同様の現象に遭遇した人がいました。

http://developers.easylike.net/bugs/420816354668146?browse=search_5112a71d859973e15625142

今は404になってます。なんてこった。

つまりまとめると、

  1. Graph APIのsharesが取得できればそれをそのまま
  2. Graph APIのlikesがあれば、それとFQLで取得したtotal_countを足したものを
  3. likesがなければFQLのtotal_countをそのまま

って感じの順番で試せば公式のいいねボタンと同じ数字が取得できるっぽいです。

Facebookに関しては今のところ、これで問題なく動いてます。

ちょっと宣伝 jQuery POP'n SocialButtonにも対応させました。

jQuery POP'n SocialButtonの紹介については過去の投稿をご覧ください。

簡単に言うと各種SNSサービスのカスタムシェアボタンを表示できるjQueryプラグインです。

こんな感じでGoogle+1ボタンに対応しました。

example1.png

さらにGitHubリポジトリのスター数表示ボタンもつけちゃいました(誰得)。

example3.png

こんな長文を最後まで読んでくれた方、ありがとうございます。

この情報が何らかの参考にでもなれば幸いです。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away