私のtwitterは、id:naoto5959でして、follow me on twitterな感じであります。
ボット用のアカウントはいくつかあるんですが、id:naoto5959_(最後にアンダバー付き)で色々実験してます。
今現在(2009年9月29日)は時刻の「時」「分」「秒」がそろったときにつぶやくボットが稼働中です。ただ、サーバやらネットワークやらの都合上つぶやくタイミングにタイムラグがあります。よって、

とかなるとやったー!って感じです。
このボットは、気まぐれで内容が変わりますし、実験中の謎のつぶやきをする事が多々あります。よって、フォローして下さる場合には、暖かく見守って下さい。もしくは、うざくなったらアンフォローしちゃって下さい。
作り方
- ご自宅にlinuxをインストールしたサーバをご用意下さい。
- perlを分かったフリをして下さい。
- それとtwitterのアカウントをご用意下さい。
簡単ですね。
時間をつぶやくボットを作る
Net::TwitterモジュールをCPANから持って来ましょう。時間は、Time::Pieceを使いました。
# cpan install Net::Twitter # cpan install Time::Piece
twit_time.plという名前で以下を作成します。
1 use strict; 2 use Net::Twitter; 3 use Time::Piece; 4 5 my $t = localtime; 6 7 8 my $twit = Net::Twitter->new( 9 username => "アカウントID", 10 password => "パスワード" 13 ); 14 15 my $text = $t->hms . "です"; 16 my $result => $twit->update($text);
そんで、
# perl ./twit_time.pl
とかすると時間をつぶやくボットの完成です。ただ、これだと自分で毎回実行しないといけないので、ボットじゃないですね全然。
そこで、cronなり、cronexecなりにこのスクリプトを登録してあげれば1分間隔とかで時間をつぶやくボットが出来上がりますね。
全然ぞろめはつぶやきませんけど。
指定時間につぶやくボットを作る
で、今回作ったボットです。
cronなどで実行するのも良いですが今回は、daemon化させてみました。perlでdaemonを作るにあたって、Proc::Daemonモジュールを使いました。
例によって、CPANから持ってきます。
# cpan install Proc::Daemon
そんで、twit_time_daemon.plとかを作成。
元のソースは、以下を参考にというかパクりましたよ。ごめんなさい。
Proc::Daemonでperlデーモンプログラムを書いてみるCommentsAdd Star
1 use strict;
2 use warnings;
3 use Net::Twitter;
4 use Time::Piece;
5 use FindBin;
6 use Proc::Daemon;
7
8 my $PID;
9 my $PID_FILE = $FindBin::Bin."/twitter_bot_daemon.pid";
10 my $SLEEP_INTERVAL = 1;
11
12 main(@ARGV);
13 exit();
14
15 sub main {
16 my ($act) = @_;
17 $act ||="";
18
19 if ($act eq "start") {
20 if (get_pid_file()) {
21 print "$0 is already running\n";
22 return;
23 }
24 init();
25 run();
26 return;
27 }
28
29 if ($act eq "stop") {
30 my $pid = get_pid_file();
31 if (not defined $pid) {
32 print "$0 is not running\n";
33 return;
34 }
35 return del_pid_file();
36 }
37 print "usage: $0 [start|stop]\n";
38 return;
39 }
40
41 sub init {
42 Proc::Daemon::Init;
43
44 $SIG{INT} = $SIG{HUP} = $SIG{QUIT} = $SIG{KILL} = $SIG{TERM} ='interrupt';
45 $PID = $$;
46 set_pid_file($PID);
47 }
48
49 sub run {
50 while (1) {
51 action();
52 sleep($SLEEP_INTERVAL);
53
54 if (not get_pid_file()) {
55 kill $PID;
56 return;
57 }
58 }
59 }
60
61 sub interrupt {
62 my ($sig) = @_;
63 $SIG{$sig} = 'IGNORE';
64 return del_pid_file();
65 }
66
67 sub get_pid_file { #pid fileの名称とpidの取得
68 return undef if not -e $PID_FILE;
69
70 open my $fh, $PID_FILE or die "can't open $PID_FILE :$!";
71 my ($line) = <$fh>;
72 close $fh or die "can't close $PID_FILE :$!";
73 my ($pid) = $line =~ /(\d+)/o;
74 return ($PID_FILE,$pid);
75 }
76
77 sub set_pid_file { #pid fileにpidを書き込み
78 my ($process_id) = @_;
79 open my $fh, ">$PID_FILE" or die "can't open $PID_FILE :$!";
80 print $fh $process_id;
81 close $fh or die "can't close $PID_FILE :$!";
82 }
83 sub del_pid_file {
84 unlink $PID_FILE or die "can't unlink $PID_FILE :$!";
85 }
86
87 sub action {
88 my $t = localtime;
89
90 return unless ($t->hour eq $t->min && $t->min eq $t->sec);
91
92 my $twit = Net::Twitter->new(
93 username => "アカウント",
94 password => "パスワード"
97 );
98
99 my $text = $t->hms . "かなー?";
100 my $result => $twit->update($text);
101 }
あとは、デーモンを起動して終わりです。
# perl twit_time_daemon.pl start
止める場合は、以下の通りです。
# perl twit_time_daemon.pl stop
やったね。