マンガ発売日ボットスクリプト手直し

id:otsuneさんにブクマコメントで「Text::CSV使おう」とアドバイスいただいたので、早速使ってみた。Text::CSVCSVをお手軽に使うためのモジュールで、カンマが要素内にある場合なんかに対応してくれるらしい。ちょっと調べてみたら、Text::CSV_XSという同じくCSVを扱うためのモジュールの例がたくさん出てきたので、今回はこっちを使ってみた。
下のボットスクリプトとのdiffはこんな感じ。ちょっとリファクタリングをして、出力結果に出版社を加えてみました。同じように変更したら自分のところに投稿する方でも問題ないはず。

一度diffの結果を張ってみたかったんだ。

--- comicALL2Twitter.pl	2007-04-22 20:58:11.316659200 +0900
+++ comicALL2Twitter_CSV.pl	2007-04-22 21:28:21.940208000 +0900
@@ -6,30 +6,35 @@
 use Net::Twitter;
+use Text::CSV_XS;
 use utf8;
 use Encode;
 
 open(IN, "/Path/To/comics.csv") or die $!;
 my $charset = "utf8";
 my $today = Date::Simple->new;
 
 my @messages;
+my $csv = Text::CSV_XS->new({'binary' => 1});
 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")) {
-        $price =~ s/"//;
-        my $day = $today->format("%m/%d");
-        push @messages, "[$day] $title / $author / $price";
-    }
 
+    $line =~ s/\s//g;
+
+    $csv->parse($line);
+    my @columns = $csv->fields();
+    $csv->parse(pop @columns);
+    for ($csv->fields()) {
+        s/^\s//;
+        push @columns, $_;
+    }
+
+    if ((shift @columns) =~ (my $day = $today->format("%m-%d"))) {
+        my $data = join " / ", @columns;
+        push @messages, "[$day] $data";
+    }
 }
 close(IN);
 
 @messages = reverse @messages;
 
 my $twit = Net::Twitter->new(username=>"ユーザ名", password=>"パスワード" );
 my @result;
-push @result, $twit->update(encode_utf8($_)) for(@messages);
+push @result, $twit->update($_) for(@messages);

一度diffの結果を張ってみたかったんだ。
あと、newのところで

$csv = Text::CSV_XS->new({'binary' => 1});

として日本語を使えるようにしてるけど、ここの時点でutf8にエンコードされているみたい。

マンガ発売当日告知ボット

昨日のスクリプトを流用して作った。
Twitter / comics_ja
まんがの森の発売リストにあるマンガ(18禁含む)の発売当日にまとめてメッセージがくるようになってるので少なくとも20件位はくるので気をつけてくださいませ。

#!/usr/bin/perl -w

use warnings;
use strict;
use Date::Simple;
use Net::Twitter;
use utf8;
use Encode;

open(IN, "/Path/To/comics.csv") or die $!;
my $charset = "utf8";
my $today = Date::Simple->new;

my @messages;
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")) {
        $price =~ s/"//;
        my $day = $today->format("%m/%d");
        push @messages, "[$day] $title / $author / $price";
    }
}
close(IN);

@messages = reverse @messages; # リスト順に並べ替える。

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

基本的には昨日作ったのと同じで、自分用のリストをなくしてPlaggerでもってきたまんがの森リスト(comics.cvs)にある当日発売のマンガを全部投稿するようにしただけ。id:otsuneさんに教わったPlaggerだけで実現する方法はまだテストできてないからとりあえず保留することに。

ここに書いたスクリプトだとcronの設定は2つ必要だけどまんがの森には月1のアクセス。Plaggerのみだとcronの設定は1つで良いけど、まんがの森には毎日アクセス。一長一短かな? スクリプト書く手間を考えたら当然Plaggerのみの方が良いに決まってるけど、もう書いちゃったからなー。テストしてみてうまく動いたらまた書きます。