Hatena::ブログ(Diary)

connvoi_tyouの日記 RSSフィード

2009-07-11

twitter bot的な何かをつくる。その2

同僚のmasarusanjpとしゃべっていて、

MAGIが否決とか可決してくれるbotっていいですよねー。」

「お、いいね、でもエヴァ終わる前に作んないとだめじゃね?」

といった勢い。大事です。

http://twitter.com/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じゃない人のリプライもあるかもね!!

@magi_bot


追記: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つ増えました!!

内容かかないけど(笑

あち屋。あち屋。 2011/08/28 13:54 返信が無いのですが、何か設定しないといけないんでしょうか?ちなみに鍵付き。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証