「特定サイトの複数のURLのFacebookのいいねされた数を集計してソートできないか?」と、友だちから頼まれたので、Google Apps Script(以下、GAS)で実装してみました。

そこでつかった小技をメモがてらに残そうと思う。

この記事にはこんなことをざっくりと載せてます。

  • PHPでFacebookのいいねとかコメント数、シェア数を取得する
  • GASでJSONパーサー
  • スクリプトからスプレッドシートに書き込む
  • トリガーを設定して自動的に実行する
  • スクリプトを5分以上起動させたい時は
  • JavaScriptで取得したスプレッドシートを読み込んでウェブサイトに埋める

とりあえず状況。

対象のサイトの状況

  • 特定のサイトの複数URLに対するFacebookのいいねを集計する
  • 集計をソートして、多いもの順に閲覧したい
  • 対象となるURLは日々増える
  • 対象となるURLは依頼がきた段階で60件ほど

つくるべきスクリプト

  1. そのサイトにアクセス
  2. 対象となるURLを集める
  3. 2. のURLのFacebookのいいねを取得
  4. 取得した情報を保存する
  5. 保存した情報はどこからでも見られるように。見やすいように。

こんな具合か。

で、つくったスクリプトが現在うごいてるわけですが、API制限にひっかかりつつもチューニングしたおかげでなんとか安定して動いてくれそうです。

まとめてみる

Facebookのいいね数を取得するやつ

これもGASで実装・・・と思いきや、GASの動作するサーバーはFacebookから規制をかけられてて(たぶんいろんな人がつかってるから?)、取得することができません。なので仕方なくPHPをこしらえて自前のサーバーに置いときました。

Facebook Graph API

  1. URLを受け取る
  2. 取得する

複数のURLをカンマ区切りで受け取って処理できるようにしています。ただし大量のURLはさばけないので、30件くらいずつ取得(数はテキトー)

ちなみにFacebookのこのAPIは公式にはリクエスト数制限は公開されておらず、リクエストを送りすぎると蹴られます。だいたい600リクエスト / 600秒との噂。

GASでJSONパーサー

さて、これでFacebookのデータを取れるようになったのでGASに移ります。

先ほどのPHPからJSONを取得して、JSONパーサーで解析する

投げたURLは順番通り返ってくるので、
urls[0]はres.data[0]、urls[1]はres.data[1]、urls[2]はres.data[2] という構造になってるはず。

※同月30日追記
jsonParseが非推奨となり実行されなくなりました。(ドキュメント Deprecated methods 参照
JSON.parse に変わったらしい(‘A`)

取得したデータからシートに挿入するデータをつくる

データをシートに記入する。

入力するデータがそろったので、特定のシートに入力する。

これで、スクリプトが実行されればFacebookのデータがスプレッドシートに入力されるようになった。

トリガーを設定して自動的に実行する

スクリプトを自動実行するにはトリガーを設定する。データのリアルタイム性をどこまで保つか、APIの利用制限などを考えて適切に設定しよう。
今回のスクリプトは定期的に人間がチェックして状況を把握するためそこそこの更新頻度は必要なことから、30分に一度更新することにした。

15分に1回起動するトリガー

スクリプトでトリガーを生成して、起動時間の制限をぶち破る

GASでスクリプトが動く時間は最大300秒。これを超えると強制的に停止される。また5分以内でも1アカウント内で1日の実行時間が長すぎると止められる模様。

大量の処理を行う場合、5分では済まないことなんてザラ。

スクリプト内でトリガーを生成すれば、一度処理を停止して実行し直すことになるため、この制限時間のカウントダウンをリセットして、スクリプトが停止するのを回避できる。

制限時間内におわる程度の処理を書いて、最後に必要な処理がすべて終わってるかチェック。
まだ処理するデータが残っているならトリガーを設定する。

発火するタイミングはミリ秒で指定できるが、あまりに直近すぎるとトリガーが設定されるよりも先に起動するタイミングがきてしまうようで発火しなくなるので注意。
1分先を指定しておけば、だいたい動いてる。

とりあえず完成

データが自動で更新される

無事に取得できてる模様。

HTMLにする

スプレッドシート上で集計したりはできるけど、もっとそれっぽく、どこからでも見れるように普通のウェブページにすることにした。

JavaScriptでスプレッドシートを読み込む

GoogleのAPIを使えば、JavaScriptでスプレッドシートの内容を読み込むことも簡単にできる。
※ただしJavaScriptのあるページを見ている人がそのスプレッドシートを閲覧できなければ動作しない。

これでスプレッドシートのデータが読み込めた。

JavaScriptで取得したスプレッドシートのデータを利用する

こういう具合に取得できる。あとはテーブルで出力するなりして、わかりやすく表示させるだけ。

まとめてきな

Google Apps Scriptの可能性がパない。

何か一言あれば!!

質問とかツッコミとかお気軽にコメントしてください。がんばって返します。

コメントを残す

This site uses Akismet to reduce spam. Learn how your comment data is processed.