Hatak::Techlog

Verba volant, scripta manent.

Perl 製の Twitter Bot を書き直した

3年以上前に作成したまま放置していた Twitter bot を作り直して再リリースしました。
"にちぼついったー" という,東京の日の出・日の入りの時刻につぶやくだけのシンプルな bot です。

久しぶりにまともなコードを書いたので,ちょっと作業内容などを記録しておこうかなと思いました。

旧にちぼくんの仕組み

旧バージョンは 2009 年の秋頃に作成・リリースしていました。ちょうど Moose を使いたくて仕方ない頃だったらしく MooseX::App::Cmd という Moose ベースでコマンドラインツールを書くためのフレームワークを使って書いていました。

  • set
    • 実行時間を調べて Cron を書き換える
      • 日の出時刻は "sunrise" モード
      • 日の入り時刻は "sunset" モード
    • 日の出・日の入り時間はメタデータとしてローカルの DB に格納
  • tweet
    • モードによってメッセージリストの中からランダムでツイート

"set" コマンドを AM 1:00 に実行し,その日の日の出・日の入りの時間を調べて Cron 書き換え,そしてその時間に "tweet" コマンドが起動してつぶやくというイケてない実装でした。もともとは at で実行時間をセットするように書いていたものの,実際にデプロイした VPS で at を使えないというトラブルのためリリース前に cron を使う方式に書き直した経緯があります。
この旧 bot には致命的な欠点が 2 つありました。

  • メタデータ更新が必要
    • 公開されているこよみは翌年分までしかないため,適宜 DB を更新しなければならない
  • Cron 書き換えがイケてないというか危ない
    • 古い行を消して新しい行を追加,という処理が微妙
    • しかし,毎日つぶやく時間が異なるため困る

結果的にメタデータの更新を忘れてしまったことや,別サーバに移したときに cron 書き換えをしたくないために止めてしまっていました。

新にちぼくんの仕組み

そこで,欠点それぞれに対しての解決策を考えてにちぼくんを再実装しました。

hatak/twitter-bot

  • 日の出日の入り時刻問題
  • つぶやく時間問題

Astro::Sunrise は緯度・経度を基にその場所の日の出・日の入り時刻を計算してくれるモジュールです。
使い方もとてもシンプル。

1
2
3
4
5
6
use Astro::Sunrise;

# YYYY,MM,DD,longitude,latitude,Time Zone,DST,ALT
# ここでは東京とする
# -0.583 は太陽の中心が地平線に接したときの角度を示す
($sunrise, $sunset) = sunrise(2014, 02, 15, 139.7414, 35.6581, 9, 0, -0.583)

結果はそれぞれ "hh:mm" という文字列で返ってくるので,split して時と分に分けるなり,再度オブジェクトにするなり自由に加工できます。
毎回計算することでメタデータを利用する必要がなくなりました。弊害としては,計算方式の違いで国立天文台のこよみと少し違う時間となるケースが起きてしまいました。しかし,ずれていても 1 分程度なので,今回のサービス的には許容できる誤差と考えています。

AnyEvent は定番過ぎるので,紹介については割愛します。一日 2 回しかつぶやかないのでループにしておくのは勿体ないようにも思えましたが,毎回つぶやくタイミングが違うことに対する解決策が思い浮かばなかったためこうなりました。。

今後の改良とか

せっかく Astro::Sunrise で動的に計算できるようにしたので,今後は mention を受けて東京以外の場所や別の日の計算もしてくれるようにしたいですね!
それ以前にコード内に consumer_key や access_token を直接書いてしまっているので,このあたりの設定切り出しはしておきたいです。

Comments