FLYING

〈全日本・紀文豆乳飲料シリーズ「麦芽コーヒー」の500ミリリットルパックを扱う小売店が少ないことに遺憾の意を表明する会〉活動記録

NicoNotifier:公開マイリストの更新状況をチェック

NicoNotifier

NicoNotifierはニコニコ動画の公開マイリストの更新状況をメールでお知らせしてくれるアプリです。投稿作品一覧をマイリストで公開している動画制作者の方が多いので,これを使って誰よりも早く注目動画をチェックしようという試みです。個人的には気になるボカロPが投稿した新曲をいち早くチェックするために使っています*1

使い方は比較的単純です。上記のページでユーザー登録を行い,チェックしたいマイリストのURLをチェックリストに追加します。以降,チェックリストにあるマイリストに動画が追加されると,以下のようなお知らせメールが届くようになります。

tondolさんのマイリスト「mylist」に動画が追加されました。

【初音ミク】celluloid【リミックス】
http://www.nicovideo.jp/watch/sm8468603
Mon, 04 Jan 2010 04:54:49 +0900

Bad Apple!! Game Boy 8bit ver
http://www.nicovideo.jp/watch/sm8954478
Mon, 04 Jan 2010 04:54:49 +0900

NicoNotifier powered by tondol
http://digilog.usamimi.info/nico_notifier/

10分間隔でマイリストの新着チェックを行っているので,最悪の場合でもマイリストに動画が追加されてから10分後にはメールが届くはずです。また,メール配信が絡むアプリなので,メール経由で本登録を完了しないとサービスを利用できない形にしてみました。

技術的なところ

NicoNotifierのユーザーはサービス表面のPHPスクリプトにアクセスするだけでメール配信サービスを利用できますが,内部的には定期的にDBに登録されているマイリストの新着をまとめてチェックし,そのマイリストを登録しているユーザーにメールを配信するRubyスクリプトが存在しています。

このRubyスクリプトは適当なサーバーのcronを利用して定期実行したいところですが,個人的に趣味で使っているサーバーでcronに対応したものがなかったので,Google App Engineのcron機能を使ってみました。つまり,GAEのcronによって10分毎にPythonスクリプトが起動し,そのPythonスクリプトの中で前述のRubyスクリプトをリクエストし,そのRubyスクリプトの中でマイリストのチェックとメール配信を行うという流れになっています。

(GAE上のcron)
 ↓
(GAE上のPythonスクリプト)
 ↓
(自前のRubyスクリプト) ←→ (DB:MySQL) ←→ (PHP製のフロントエンド)
 ↓
(ニコ動にアクセス&メール配信)

本来ならフロントエンド部分も含めてGAEだけですべて完結できるはずなので,単に処理のオーバーヘッドが増えているだけのような気もしますが,普段から慣れている環境で開発を行えることと,GAEの制限に囚われずにリソースを使えるのがメリットといえばメリット?かもしれません。とはいっても,内部でRubyPHPの2つの言語を使う必要はなかったような気もします。

from google.appengine.api import urlfetch

print 'Content-Type: text/plain'
print ''

api = "uri_of_your_api"
myheaders = {
	'pragma': 'no-cache',
	'Cache-Control': 'no-cache, must-revalidate',
}

try:
	res = urlfetch.fetch(api, headers=myheaders)
	print "cron executed!"
	print res.content
	
except Exception, e:
	print "cron failed!: %s" % e

GAE上でAPIをリクエストするPythonスクリプトのサンプルはこんな感じです。念のためキャッシュを無効にするようなヘッダを指定していますが,本当に必要なのかどうかよく理解していません。

チェック対象のマイリストが増えたときにニコニコ動画API制限に引っかかってしまわないかどうかが目下の不安です。

追記

アカウント登録を行えない不具合があったため,修正しました。現在は問題なくアカウントを登録できるようになっています。

*1:NicoNotifierをデバッグしていたときに,とある新着動画で4GETできました