2009-07-11
twitter bot的な何かをつくる。その2
同僚のmasarusanjpとしゃべっていて、
「MAGIが否決とか可決してくれるbotっていいですよねー。」
「お、いいね、でもエヴァ終わる前に作んないとだめじゃね?」
といった勢い。大事です。
概要
@magi_bot ほげほげしたい。
例:http://twitter.com/connvoi_tyou/status/2582362513
見たいな感じにつぶやくと。
@connvoi_tyou MAGIにより "ほげほげしたい。" は否決されました。 MELCHIOR:否決 BALTHASAR:否決 CASPER:可決
例:http://twitter.com/magi_bot/status/2582916646
見たいにリプライかかえってくると。
中身
1.Net::Twitter経由でmenstionsを取得
2.md5して最初の4桁をYAMLファイルで指定した数で割ったあまりを取得
3.その値を元にYAMLから返信するつぶやきをえらんでpost
大体こんな流れです。今回はYAML勉強をかねてやりました。
んで、ソースコードいじることなく、yamlファイルいじるだけで
発言内容とかパターンとかを変更できるようにしてみました。
参考サイト:http://gihyo.jp/dev/serial/01/yaml_library/0005
ソースコード
電車さん@densya_jpよりもWeb::Scraper部分が無いので、
行数がかなりへってます。
うーん。正規表現が微妙だ。。。。
同義制をもったプログラムみたいな感じにしたかったんですが、
面白いのがおもいつかず。結局単純な割り算のあまりです。
#!/usr/bin/perl use warnings; use strict; use YAML::Syck; use Digest::MD5; use Encode; use Data::Dumper; use Net::Twitter; use utf8; my $tweet=Net::Twitter->new( traits =>[qw/API::REST API::Search WrapError/], username=>'USER', password=>'PASS', ); my $since_id=&getsince_id; my $mentions=$tweet->mentions({since_id=>$since_id, count=>'200'}); if(defined($mentions->[0]->{id})){ &setsince_id($mentions->[0]->{id}); } $YAML::Syck::ImplicitTyping = 1; my $yamlpath='./magi.yaml'; my $data = LoadFile($yamlpath); foreach my $mention (@{$mentions}){ if(defined($mention->{text})){ next if $mention->{text} =~ /RT/; next if $mention->{user}->{screen_name} eq 'magi_bot'; my $text=$mention->{text}; $text=~s/\@magi_bot //g; my $md5=Digest::MD5->new; $md5->add(encode('utf8',$text)); my $str=substr ($md5->hexdigest, 0, 4); my $num=hex($str) % $data->{number}; my $post='@'. $mention->{user}->{screen_name} .' '. decode('utf8',$data->{magi_ja}->{$num}->{head}) .' "'. $text .'" '. decode('utf8',$data->{magi_ja}->{$num}->{text}); if($text =~/^[a-zA-Z0-9\!\' ]+$/){ $post='@'. $mention->{user}->{screen_name} .' '. decode('utf8',$data->{magi_en}->{$num}->{head}) .' "'. $text .'" '. decode('utf8',$data->{magi_en}->{$num}->{text}); } $tweet->update($post); } } sub getsince_id{ open my $infh, '<' , './since_id' or die "$!"; my $since_id=0; while(my $line = <$infh>){ last if $since_id ne 0; $since_id=$line; } close($infh); return $since_id; } sub setsince_id{ my $since_id=shift; open my $outfh, '>' , './since_id' or die "$!"; if($since_id ne ''){ print $outfh $since_id."\n"; } }
返答パターンは9種類です。
8じゃないのは1個適当なパターンを加えたからです。
YAMLファイルの中身は発言内容が全部わかっちゃうので、見せません(笑)
どうでもいいことを決めなきゃいけないとか、
お遊び感覚でつかってみるといいですよ!
MAGIじゃない人のリプライもあるかもね!!
追記:YAMLファイルの形式
そういえば中身は見せないけど形式だけいいんじゃないの?ってことで乗せてみる
magi_ja:
0:
head: hogehoge
text: fugaguga
1:
head: hogehoge
text: fugafuga
2:
head: hogehoge
......
number:10
↑のような形になっていて、読み込んだYAMLファイルのnumberで発言数を
取得して、ほかのメッセージは
$yaml->{magi_ja}->{$num}->{text}
見たいにしてアクセスしてます。
追記:つぶやき追加しました。
replyするつぶやきパターンが1つ増えました!!
内容かかないけど(笑
- 223 http://twitter.com/magi_bot
- 80 http://twitter.g.hatena.ne.jp/maname/
- 60 http://twitter.com/connvoi_tyou
- 22 http://reader.livedoor.com/reader/
- 20 http://twitter.com/
- 16 http://twitter.com/connvoi_tyou?utm_campaign=twitter20080331162631&utm_medium=email&utm_source=follow
- 13 http://d.hatena.ne.jp/munaryo/20090714/1247577155
- 11 http://www.google.co.jp/reader/view/
- 9 http://m.twitter.com/magi_bot
- 9 http://twitter.g.hatena.ne.jp/maname/20090712/1247362873





