このブログでは各ポストにTwitterやらFacebookのシェアカウントを付けてますが、 FacebookのAPIの仕様がちょっと変更されて正しく取れなくなっていたのでアップデート。
Facebookのシェア数取得方法
Facebookのシェア数は Graph API と呼ばれるAPIを使って
http://graph.facebook.com/?id=<URL>
というURLを呼ぶとシェア数の入ったJSONを返してきます。
これが、以前は
{
"id": "<URL>",
"shares": 37
}
みたいな形だったんですが、今は
{
"id": "<URL>",
"share": {
"comment_count": 0,
"share_count": 37
}
}
こんな感じになっています。
http://graph.facebook.com/?id=http://rcmdnk.github.io/blog/2014/02/19/computer-markdown/
従って、これまでJavaScriptとかだと、
取ってきたdata
に対して、
var n = data.shares;
みたいな感じでアクセスしてたのを
var n = data.share.share_count;
の様に変更してあげればOK。
もしくは
data["shares"];
みたいになってる所を
data["share"]["share_count"];
に。
これで今まで通りシェア数が取れます。
上の形はversion 2.0のもので、version 2.1から下の様になったようです。
現在の最新バージョンは2.7です。
が、バージョン指定しない状態で呼ぶと今使える最も古いものが呼ばれるということで、 これまでは2.0のものが呼ばれてたのですが、 2016年8月7日にこれが廃止され、現状呼んでるものは2.1になっています。
バージョン指定して呼ぶには
http://graph.facebook.com/v2.7/?id=<URL>,access_token=<access_token>
の様な感じでid
等の指定の前にバージョンディレクトリを挟んでやれば良いのですが、
アクセストークンが要求されるのでちょっと面倒です。
現在は2.1から2.7までこのシェア数に関するものは同等なので特に気にしなくて大丈夫そうですが。
また、以前まであったFQL (Facebook Query Language)やREST APIといったものが 2.1から廃止されています。
http://graph.facebook.com/fql?q=SELECT%20total_count%20FROM%20link_stat%20WHERE%20url=<URL>
以前はこんな感じの呼び出しができていましたが、今やると
"message": "(#12) fql is deprecated for versions v2.1 and higher",
というエラーが返ってきます。
各バージョン間のアップグレードに関して以下の様なイントロダクションページがあるのですが、 2.0は既に廃止になったからか既にv2.0 to v2.1のものが無いのでちょっと不便。
API Level Rate Limiting
追記: 2016/08/30
このブログでシェア数を表示させるに辺り、 毎回Octopressビルド時に全ての数を取ってきて置いてありました。
が、上の新しい仕様になった後、全部のページの情報を一気に取ろうとしたら、一定数のページ分を取得後、 その後の分で
{
"error": {
"message": "(#4) Application request limit reached",
"type": "OAuthException",
"is_transient": true,
"code": 4,
"fbtrace_id": "HsHyTwUZeDn"
}
}
と言った返答が来る様になってしまいました。
どうも使用数の制限があるらしく、一定時間内に沢山使うと 制限がかかってしまうようです。 以前は何故大丈夫だったのか。
Facebook api: (#4) Application request limit reached - Stack Overflow
正確な数字はFacebookが出してないみたいですが、 やってみた感じでは大体1分位の間に40回位呼ぶとそれ以降上のエラーが出る感じです。
その後、数分すると割とすぐにまた使える様になります。
デベロッパー的な設定をしてアクセストークンとかの設定をすれば回避出来るのかもしれませんが、 そこまですることもないのでローカルで何度かに分けて数を取ってきておいて、 それを渡すようにすれば良いか、と思いそんなスクリプトを作って試してみました。
ですが、上の様なエラーが返ってきたら数分待って試行する、みたいなことをやってみたんですが、 500ページ位を取ってくるのに半日位かかってそこでスクリプトが何故か止まってしまって上手く行かず。
もう一度走らせてみようとした所今度は全然取ってこれないので 手動で見てみると
$ wget http://graph.facebook.com/?id=http://google.com -O -
--2016-08-30 xx:xx:xx-- http://graph.facebook.com/?id=http://google.com
Resolving graph.facebook.com (graph.facebook.com)... 31.13.95.8, 2a03:2880:f002:109:face:b00c::2
Connecting to graph.facebook.com (graph.facebook.com)|31.13.95.8|:80... connected.
HTTP request sent, awaiting response... 403 Forbidden
2016-08-30 xx:xx:xx ERROR 403: Forbidden.
みたいなのが返ってきてました。。。
全く同じコマンドを他の端末で見ると普通に取ってこれるので どうも端末のIPか何かがブラックリスト入りして接続を拒否られる様になってしまったようです。
これ、数日前になってからずっと同じ状態でどれくらいしたら解除されるのかも分かりません。
ということで、これまでと同じようなやり方でまとめて シェア数を取得するというのはどうも無理みたいです。
その上、一度ブロックされると最早普通にすら使えなくなっていつ解除されるかも分からないので 注意が必要です。。。
ちょっとどうすればよいか試行中ですが、 差し当たり、Travis CIでビルドしているので その際に上のアクセス制限が来るまでは探してその後は単に0にしてしまうようにしています。
全部のページを取り敢えずでも取得したければFacebookの部分だけでも その場でJavaScriptで取得、ということもありですが、 Archiveページとかでボタンを設置してあるページもそうしてしまうと そのページを開いた人の端末がバンされてしまって他のページを見ても今後一切見れない状況になってしまうかも。。。
実際そういうこといくらでも起こってそうなんですが、どうなんでしょうか?
まあこのブログはFacebookでシェアされることは少ないのでどうでもよいといえば良いのですが、 上手く出来ないと気持ち悪いのでなんとかしたいところではあります。
追記ここまで