漫画の発売日にTwitterが教えてくれるスクリプト

まんがの森の発売日リストをPlaggerで取得して、そのリストとお知らせして欲しいリストを比較してマッチしたらTwitterに「今日発売だよ!」ってお知らせするスクリプトを書いたから公開してみる。
まんがの森のリスト取得にはSweetPotatoさんのCustomFeed::Manganomoriを使わせていただいた。CSVで出力したいからyamlはこんな感じ。

global:
  assets_path: /path/to/assets
  timezone: Asia/Tokyo
  log:
    level: debug

plugins:
  - module: CustomFeed::Manganomori

  - module: Publish::CSV
    config:
      dir: /path/to/dir
      encoding: utf-8
      filename: comics.csv
      mode: append
      column:
       - date
       - title
       - body

これで今月分のリストがcomics.csvに出力される。このリストから発売日とお知らせマンガリストを照らし合わせる。マンガリストは一行に1つずつタイトルを書いておく。巻数や作者名はいらない。タイトル中のスペースも消してしまうので必要ない。あってももちろんかまわない。こんな感じになる。

ONE PIECE
医龍
ゲノム

このファイルはBOMなしのUTF-8で保存する。

ファイルの比較とTwitterへの送信は以下のスクリプトで行う。

#!/usr/bin/perl -w

use warnings;
use strict;
use Date::Simple;
use Regexp::Assemble;
use Net::Twitter;
use utf8;
use Encode qw(from_to);
use Encode;

open(IN, "/path/to/comics.cvs");
my $premessage = "今日発売だよ!";
my $charset = "utf8";
my $today = Date::Simple->new;

open(LIST, "favorite.txt") or die $!;
my (@deList, @messages);
while (<LIST>) {
    chop;
    s/\s//g;
    push @deList, decode($charset,$_);
}
my $re = Regexp::Assemble->new;
$re->track->add(@deList);

while (<IN>) {
    chop;
    my $line = decode($charset,$_);
    my($date, $title, $author, $pub, $price) = split(/"?,["\s]*/, $line);
    $date =~ s/T00:00:00//;
    $title =~ s/\s//g;
    if ($date eq $today->format("%Y-%m-%d") and defined $re->match($title) ) {
        $price =~ s/"//;
        push @messages, "$premessage $title / $author / $price";
    }
}
close(IN);

my $twit = Net::Twitter->new(username=>"ユーザ名", password=>"パスワード" );
my @result;
push @result, $twit->update(encode_utf8($_)) for(@messages);

このファイルもBOMなしUTF-8で保存する。ユーザ名とパスワードを変更するのを忘れないように。
適当なところにおいてchmod +xしておいてあとはcronで1日1回実行するようにしておく。まんがの森リスト取得のPlaggerは月に1回実行すればいいと思う。
$premessageを好きな言葉にしておけばメッセージの頭が変化するので適当に編集してください。

あとはお気に入りリストにメールかなんかで追加できるようにした方がいいのかな? あ、ログとかも一切残らないから残すようにしなきゃな。

【追記】id:otsuneさんからPlaggerのRuleでフィルタすればいいんじゃないの?ってアドバイスもらったので考えてみた。

plugins:
  - module: CustomFeed::Manganomori

  - module: Filter::Rule
    rule:
      expression: $args->{entry}->date->ymd eq Plagger::Date->now(timezone=>'Asia/Tokyo')->ymd

  - module: Publish::Twitter
    config:
       username: xxxxxxxx
       password: xxxxxxxx

こんな感じにしたらいいのかな? お気に入りリストに関してはわかりませんでした。
【さらに追記】
このyamlじゃダメだった。どうしたらいいのかな? ちょっと試行錯誤してみます。
【さらにさらに追記】
id:otsuneさんが書いてくれました。今日の日付に一致するEntryだけFilterするexpressionレシピ
上のyamlで動くことを確認しました。< でも22日発売の本がなかったから、ホントに送れるのかどうかわからないです。

名古屋の天気予報ボット作った。

おさかなラボ - Twitter用天気予報ボットのまねをして、名古屋の天気予報を教えてくれるアカウントを作ってみました。Twitter / forecast_nagoya
yamlはおさかなラボさんとほとんど一緒。

plugins:
 - module: Subscription::Config
   config:
     feed:
       - http://weather.livedoor.com/forecast/rss/23/38.xml

 - module: Filter::Rule
   rule:
     expression: ++$::index == 2

 - module: Filter::Rule
   rule:
     - module: Deduped
       path: /Path/forecast.db

 - module: Publish::Twitter
   config:
       username: forecast
       password: xxxxxxxx

Filter::RuleにDedupedを入れてダブったときには更新しないようにして、これで4-18時の間に2時間間隔で巡回させてみています。

ただ最初、

 - module: Filter::Rule
   rule:
     expression: ++$::index == 2
     - module: Deduped
       path: /Path/nagoya_forecast.db

って書いたらエラーになったんで上のように書き直し。ルールは一個ずつしかかけないんだっけ?