エビ中とLINEしてる気分になれるChatBotをPictRubyで作ってみた


おはようございます。中20のチェレンコフです。
qiita初投稿です。よろしくお願いします。

最近ChatBotがアツいらしく、
先日LINEのBOT APIが公開されて、早速 @masuidriveさんが遊んでおられる。
とりあえずLINE BOT APIでオウムを作ってみた - Qiita

総裁のブログなんてお昼から繋がらない。
はてなブックマーク - 2016年後半はbotが来るわ。LINE-bot作ったけどマジでやばい。 | ふくゆきブログ

乗るしかない このビッグウェーブに

エビ中とLINEがしたくて

PictRuby v0.5でLINE BLOGの記事を使ったChatBotを作りました。
※記事はRSSで取得します。

遊び方

iosアプリのPictRubyをインストールして下記のコードをコピペして実行。
最新10件のタイトルが表示されるので対応する数字をつぶやくと会話が始まります。
LINE固有?の絵文字は文字化けするようです😢
RSSのURLを変えればほかのアイドルさんのLINE BLOGもいけるはずです。

line_like_chatbot.rb
#line_like_chatbot v0.1
class Chat
  def initialize
    feed = "http://lineblog.me/ebichu/index.rdf"
    count = 10
    url = "https://query.yahooapis.com/v1/public/yql?q=SELECT%20title%2Clink%2Cencoded%20FROM%20rss%20WHERE%20url%3D%22" + URI.encode_www_form_component(feed) + "%22%20%7C%20truncate(count%3D" + count.to_s + ")&format=json"
    data = Browser.json url
    @menu = []
    @text = []
    data['query']['results']['item'].each_with_index {|item,i|
      @menu.push "#{i+1}:#{item['title']}"
      @text.push item['encoded']
    }
    @menu = @menu.join("\n")
    @select_index = nil
    @stdout = nil
    @i = -1
  end

  def welcome
    @menu
  end

  def call(input)
    if @select_index == nil
      @select_index = input.to_i 
      src = @text[@select_index-1]
      url = "http://api.dan.co.jp/lleval.cgi?l=rb&s=" + URI.encode_www_form_component("p '#{src}'")+".gsub(%2F%5Cn%5Cs%2B%7C(%3Cbr%5Cs%5C%2F%3E)%2B%2F%2C%22%5Cn%22).gsub(%2F%3C(%22%5B%5E%22%5D*%22%7C'%5B%5E'%5D*'%7C%5B%5E'%22%3E%5D)*%3E%2F%2C'').gsub(%2F(%5CA%5Cn%2B%7C%5Cn%2B%5Cz)%2F%2C%22%22).split(%2F%5Cs*%5Cn%2B%5Cs*%2F)"
      json = Browser.json url
      @stdout = eval(json['stdout'])
      @i += 1
      @stdout[@i].strip
    else
      @i += 1
      @i < @stdout.size ? @stdout[@i].strip : "おわり🍤"
    end
  end
end

感想

Rubyほとんど書いたことがなくていろいろハマって大変だった。夜なべすること5日。pとputsでマルチバイト文字列の見え方が変わって8進数表記の文字列どうしたらええねん!とか。
PictRubyはJSONを取ってこれるのでYQLで記事をJSONに加工して取得した。
あとPictRuby0.5では正規表現に対応していないので @dankogai さんのllevalでHTMLタグ除去に成功した。マジ感謝。
gsubの正規表現のダブルクォーテーションとかエスケープしてもllevalでエラーで返ってきたので、事前にエンコードしてくっつけたらうまくいった。
PictRuby 0.5 リリース - チャットボット、eval、irb - ブログのおんがえし
※次期バージョンで正規表現対応するとのこと。期待!!

PictRubyはサンプルがよく出来ていて、学研 科学のふろくのようなワクワク感が味わえます!

こちらからのおんがえしは以上です!!!!! @ongaeshi