ハブ君の寝言

日記のような何か

簡単な決められた単語を発言するBOT

a.txtの内容を上から順に発言するBOT
とりあえず簡単なBOTは作れるようになった

これで動いているBOT
http://twitter.com/gokinyan_bot

#!/usr/bin/env perl
use strict;
use warnings;
use Net::Twitter;
use utf8;  	# 文字列をutf8として扱う
use open IO  => ":utf8";
my $consumer_key = 'xxxxxx';
my $consumer_key_secret = 'xxxxxxxxxxxxxxxxxxx';
my $access_token = 'xxxxxxxxxxxxxxxxx';
my $access_token_secret = 'xxxxxxxxxxxxxxxxxxx';
my $nt = Net::Twitter->new(
  traits          => ['API::REST', 'OAuth'],
  consumer_key    => $consumer_key,
  consumer_secret => $consumer_key_secret,
);
$nt->access_token($access_token);
$nt->access_token_secret($access_token_secret);
while(1){
open(FH, "<a.txt"); #a.txtの内容を一行ずつ発言する

my @list = <FH>;
my $data_line;
foreach $data_line( @list ) {
#evalを使って異常終了を回避。
eval{
  my $res = $nt->update({ status => "$data_line"  });
};
sleep(rand(600));#10分以内に発言。待つ時間をランダムに
}
}




ランダムに発言させたかったら

my @list2;
while(@list){
	push(@list2, splice(@list, rand @list, 1));
}

とか追加したり



時刻を発言させたかったら

my $times = time();
my ($sec,$min,$hour,$mday,$month,$year,$wday,$stime) = localtime($times); 
my $res = $nt->update({ status => $hour."時".$min."分だにゃん♪" });

とか書けばいい。

  • -

update 2010.10.27

@で着た発言をRTする機能を付与しました。
以下のように動いてたりします。

my $since_id = 1;
my $list;

while(1){
eval{
    my $mentions = $nt->mentions({since_id=>$since_id, count=>'20'});
    $since_id = @{$mentions}[0]->{'id'};
    foreach $list(@{$mentions}){
	my $name = $list->{'user'}->{'screen_name'};
	if($name ne "gokinyan_bot"){
	  my $res = $nt->update({ status => "にゃにゃ/// RT @".$name." ".$list->{'text'} , in_reply_to_status_id => $list->{'id'} });
 	}
    } 
};
  sleep(60);
  • -

update 2010.11.24

各発言をサブルーチンで実行
forkさせていたのが、

Cannot fork: Resource temporarily unavailable at~

と、エラーを吐いて異常終了するのでtrycatchしようとしたら上手く動かなかったので
evalを使用

sub my_post{
my $nt = $_[0];
my $post = $_[1];
	eval{
	      $nt->update({ status =>$post });
	};

}

sub my_fav{
my $nt = $_[0];
my $fav = $_[1];
	eval{
		$nt->create_favorite($fav);
	};
}

sub my_rep{
my $nt = $_[0];
my $rep = $_[1];
my $rep_id = $_[2];
	eval{
	      $nt->update({ status =>$rep, in_reply_to_status_id => $rep_id });
	};

}

sub my_rt{
my $nt = $_[0];
my $rt = $_[1];
	eval{
	      $nt->retweet($rt);
	};
}

参考URL:
Net::Twitter
http://search.cpan.org/~mmims/Net-Twitter-3.14001/lib/Net/Twitter.pod