WEBrickで人工無脳WebAPIを書いてみた。

人工無脳Sixamo」が応答するWebAPIサーバをWEBrickで書いてみました。


WEBrickで書かれたししゃもAPIサーバの生コードです。

#!ruby -Ku
# Sixamo Simple WebAPI Servlet
#
# Setting
#   ruby sixamo.rb --init dict_path
#
# Running
#   ruby sixamo_api.rb
#
# Sixamo talk API(Only Charcode='UTF-8')
#   GET http://localhost:10080/sixamo.xml #=> SixamoAPI for XML
#   GET http://localhost:10080/sixamo.json #=> SixamoAPI for Json
#    params {'text' => String} optional
#
# Sixamo memorize API
#   POST http://localhost:10080/sixamo.xml #=> SixamoAPI for XML
#   POST http://localhost:10080/sixamo.json #=> SixamoAPI for Json
#    params {'text' => String}
#

require 'webrick'
require 'sixamo'
require 'kconv'
dict = 'sixamo'
$sixamo = Sixamo.new(dict)

srv = WEBrick::HTTPServer.new({:BindAddress => '0.0.0.0',
                               :Port => 10080})

def message_to_xml(message)
  doc = <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<message>#{message}</message>
EOF
end

def message_to_json(message)
  doc = <<EOF
{ message: "#{message}" }
EOF
end

class SixamoServlet < WEBrick::HTTPServlet::AbstractServlet
  def do_POST(req, res)
    message = nil
    if req.query.key?('text')
      if req.query['text'].isutf8
        $sixamo.memorize(req.query['text'])
        res.status = 201
        message = "memorize omplete."
      else
        res.status = 403
        message = "Input text-charcode is only 'UTF-8'."
      end
    else
      res.status = 403
      message = "No Text."
    end
    res.body = message_to_xml(message)
    res.content_type = "application/xml; charset=UTF-8"
  end

  def do_GET(req, res)
    message = nil
    if req.query.key?('text')
      if req.query['text'].isutf8
        message = $sixamo.talk(req.query['text'])
      else
        res.status = 403
        message = "Input text-charcode is only 'UTF-8'."
      end
    else
      message = $sixamo.talk
    end
    res.body = message_to_xml(message)
    res.content_type = "application/xml; charset=UTF-8"
  end
end

class SixamoJson < WEBrick::HTTPServlet::AbstractServlet
  def do_POST(req, res)
    message = nil
    if req.query.key?('text')
      if req.query['text'].isutf8
        res.status = 201
        message = "memorize complete."
      else
        res.status = 403
        message = "Input text-charcode is only 'UTF-8'"
      end
    else
      res.status = 403
      message = "No Text."
    end
    res.body = message_to_json(message)
    res.content_type = "application/json; charset=UTF-8"
  end

  def do_GET(req, res)
    message = nil
    if req.query.key?('text')
      if req.query['text'].isutf8
        message = $sixamo.talk(req.query['text'])
      else
        res.status = 403
        messge = "Input text-charcode is only 'UTF-8'."
      end
    end
    res.body = message_to_json(message)
    res.content_type = "application/json; charset=UTF-8"
  end
end

srv.mount("/sixamo", SixamoServlet)
srv.mount("/sixamo.xml", SixamoServlet)
srv.mount("/sixamo.json", SixamoJson)
trap("INT") { srv.shutdown }
srv.start

設定方法

1. Sixamoを取得する
$ wget http://yowaken.dip.jp/okiba/sixamo/sixamo.rb
2. UTF-8にしてあげる
$ ruby -i.bak -rnkf -e 'print NKF.nkf("-Eu", ARGF.read)' sixamo.rb
3. 6行目の 'e' を 'u' にしてあげる
$ vim sixmao.rb
4. ししゃもさんの辞書ディレクトリをつくってあげる
$ mkdir sixamo
5. ししゃもさんの辞書を初期化してあげる
$ ruby sixamo.rb --init sixamo
6. ししゃもWebAPIサーバ(上記のコード)を起動してみる
$ ruby sixamo_api.rb
7. ためしにブラウザで「http://localhost:10080/sixamo.xml?text=hello」にアクセスしてみる

hello

このように表示されれば成功です。
8. 停止してみる
CTRL + C

GETでアクセスすると、ししゃもさんが投げかけた文章を元にお話してくれます。
POSTでアクセスすると、ししゃもさんが投げかけた文章を勉強してくれます。
textパラメータをなげるときは、必ずUTF-8で!
エスケープ処理も忘れずに!

/sixamo.xml にアクセスすると、XMLでレスポンスしてくれます。
/sixamo.json にアクセスすると、JSONでレスポンスしてくれます。

こんなひとにおすすめ!

  • ししゃもBotを育てているひと
  • 人工無脳をWebAPIにしてみたいひと
  • ししゃもには興味あるけど、Rubyわかんね …な、ひと
  • WebAPIを自作してみたいひと*1
  • WEBrickでなんかやってみたいひと

お粗末でした。*2

*1:おこがましいけど、参考になるといいな

*2:本当はコメントアウト部分をRDoc形式で書けばよかったな