あっかぎのページ

自動実行できてGoogle Apps Scriptが便利

20150623_1

Google Apps Scriptを使って「定期的に自動実行できて便利」というお話。

先日、2015夏アニメ前評判ランキングを即興で作りました。これはtwitterのフォロワー数を指標として2015夏アニメをランク付けするサイトでした。これを毎日twitterのフォロワー数を監視して、それをデータにしてもう少し時系列に見てみたいと思っています。

毎日twitterのフォロワー数をチェックする

毎日のtwitterのフォロワー数をチェックする必要があるのですが、もちろん人力だとめちゃ大変(>o<) なので、自動化して勝手にtwitterのフォロワー数を取得してきてデータ化しておきたいところです。

そこでうってつけなのが「cron」という定期実行する専用ツールです。ところが、データを置いているサーバーがロリポップのコロリポプランを使っているので1つしかcronが使えません。ロリポップのcronを使うのはちょっともったいないので、違う方法を考えます。



Google Apps Scriptを利用する

Google Apps ScriptはGoogleでプログラムを書けるサービスです。これを利用して定期的に自動実行する仕組みを作ります。こちらのサイトを参考にさせていただきました。

例えば、次のように2行ほどプログラムを書いてタイマー登録するだけで、タイマーで指定した時間に勝手にプログラムを実行しに行ってくれます。

function myFunction() {
  var response = UrlFetchApp.fetch( 'http://xxx.com/yyy.php' );
  Logger.log( response );
}

UrlFetchApp.fetchで指定したプログラム(上では’yyy.php’)を自動実行してくれます。cronのような細かい時間指定はできませんが、分・時間・日などでプログラムの実行間隔を指定できます。

カウンターの例

例えばyyy.phpをカウンターのプログラム例とします。

<?php

$fp = fopen( 'count.dat', 'r+' );

flock( $fp, LOCK_EX );
$line  = fgets( $fp );
fseek( $fp, 0 );
fputs( $fp, $line + 1 );
print $line . "n";
flock( $fp, LOCK_UN );

fclose( $fp );

プログラムはアクセスする度にcount.datに記録された数値を読みだして、終了する前にカウントを1加えています。flockは同時アクセスでファイルが壊れないようにロック処理しています。

こんな感じでhttp://xxx.com/yyy.phpにプログラムを置いて、カウンターの記録用にcount.datの空ファイルを準備します。

http://xxx.com/
               - yyy.php    : 権限 644
               - count.dat  : 権限 666

count.datはファイル権限を666にして、プログラムから読み書きできるようにしておきます。これで準備ができました。

まずは確認として、ブラウザにhttp://xxx.com/yyy.phpと入力して、何度か再読み込みするとアクセスする度にカウントアップします。

ここまで問題なく確認できれば、Google Apps Scriptから▲ボタンで実行すればGoogle Apps Scriptからyyy.phpを実行できます。さらに、タイマーをセットすれば定期的にプログラムが自動実行することも確認できると思います。

おわりに

Google Apps ScriptのUrlFetchAppとタイマーを使うことで、cronのような定期実行する仕組みが作れました。

実はRaspberry Piがあるのでcronはお手の物だったのですが、ローカル環境でデータ取得したあとにサーバーへアップロードするのをどうしたものかと考えていました(簡単にRaspberry Piからcronで定期的にアクセスするのかとか)。それが今回のやり方を利用することで「レンタルサーバーのcron制限」や「アップロードをどうするのか」という悩みが解決できました。

ということで、2015夏アニメのフォロワー数を自動的に定期取得できるようになりました(取得する部分は作っていたので)。これを使って2015夏アニメ前評判ランキングに時間軸のフォロワー数の変化などを追加して、もっと「面白いアニメを見つける」を洗練させたいなと思います。もちろんアニメ絵の追加などのビジュアル面も・・・