ゆーすけべー日記

はてなBlogってどーなの!?

Yahoo!知恵袋とマッシュアップさせたTwitterボット作った

  • @oshiete_twit に向けてのつぶやきを収集
  • テキストをまず特徴語抽出APIに投げてキーワードを拾ってくる
  • キーワードをYahoo!知恵袋APIに投げて関連しそうな解決済みの質問を取ってくる
  • その中からランダムで答えを一個に絞る
  • さらにその最初の文を最初のつぶやきの答えとする
  • ボットがつぶやく

ってな具合のYahoo!APIとのマッシュアップなTwitterボットを作ってみたよ! @oshiete_twit に向って質問を投げてかけてみて!

なかなかかわいいやつだからかわいがってね! もうねこういう返事とかフイタよ!

以下、コーディング例

use strict;
use warnings;
use Net::Twitter;
use List::Util qw(shuffle);
use XML::Simple;
use WebService::Simple;
use WebService::Simple::Parser::XML::Simple;
use Encode;
use utf8;
 
# local settings
my $user = 'username';
my $password = 'password';
my $appid = 'myappid';
 
my $nt = Net::Twitter->new(
    traits => [qw/API::REST/],
    username => $user,
    password => $password
);
 
my $xs = XML::Simple->new( ForceArray => ['Result', 'Question'] );
my $parser = WebService::Simple::Parser::XML::Simple->new( xs => $xs );
my $yahoo_keyword = WebService::Simple->new(
    base_url => 'http://jlp.yahooapis.jp/KeyphraseService/V1/extract',
    params => { appid => $appid },
    response_parser => $parser,
);
my $yahoo_question = WebService::Simple->new(
    base_url => 'http://chiebukuro.yahooapis.jp/Chiebukuro/V1/questionSearch',
    params => { appid => $appid },
    response_parser => $parser,
);
 
for my $tweet ( @{ $nt->mentions } ){
    my $q_text = $tweet->{text};
    if( $q_text =~ /RT/ ){
        next;
    }
    $q_text =~ s/\@oshiete_twit\s//;
    my $a = get_answer( $q_text );
    my $a_text = $a->{text};
    if( $a_text && $a_text =~ m/(.+?)(?:。|.)/ ){
        $a_text = $1;
    }
    if( $a_text ){
        my $text = "$a_text RT \@$tweet->{user}->{screen_name} : $tweet->{text}";
        warn $text;
        $nt->update($text);
    }
}
 
sub get_answer {
    my $sentence = shift;
    my $res = $yahoo_keyword->get( { sentence => $sentence } );
    my $ref = $res->parse_response();
    my @keywords;
    map { push( @keywords, $_->{Keyphrase} ) } @{ $ref->{Result} };
    my $keyword = join( ' ', @keywords );
    $res = $yahoo_question->get( { query => $keyword, condition => 'solved' } );
    $ref = $res->parse_response();
    my $q = shuffle( @{ $ref->{Result}->[0]->{Question} } );
    return { text => $q->{BestAnswer}, url => $q->{Url} };
}