漫画の発売日に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
って書いたらエラーになったんで上のように書き直し。ルールは一個ずつしかかけないんだっけ?