Home Top About Help Login Search

まるで参考にならないtwitterボット作成方法

ID: 9
creation date: 2009/09/29 21:43
modification date: 2009/09/29 21:43
owner: naoto5959
tags: twitter,perl

私のtwitterは、id:naoto5959でして、follow me on twitterな感じであります。

ボット用のアカウントはいくつかあるんですが、id:naoto5959_(最後にアンダバー付き)で色々実験してます。

今現在(2009年9月29日)は時刻の「時」「分」「秒」がそろったときにつぶやくボットが稼働中です。ただ、サーバやらネットワークやらの都合上つぶやくタイミングにタイムラグがあります。よって、

image:1:1254228579-naoto5959_bot_zorome21_21_21.png

とかなるとやったー!って感じです。

このボットは、気まぐれで内容が変わりますし、実験中の謎のつぶやきをする事が多々あります。よって、フォローして下さる場合には、暖かく見守って下さい。もしくは、うざくなったらアンフォローしちゃって下さい。

作り方

  • ご自宅に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

やったね。

0 comments
: