Line Messaging APIを利用してRubyとHerokuで雑談Botを作成
はじめに
近々、優勝賞金1000万円の LINE BOT AWARDS が開催されるらしいので、準備がてら雑談BOTを作ってみることに。
利用したサービス
- Line Messaging API
- Ruby
- Heroku
- UserLocal人工知能ボットAPI
実際のコード
リポジトリ
GitHub regonn/line-bot-ruby-heroku で公開しています。 Heroku ボタンも用意したので皆さんの Heroku にデプロイできるようになっています。
実際に動かす場合には、Herokuの環境変数に Line Developers 画面で取得した LINE_CHANNEL_SECRET
と LINE_CHANNEL_TOKEN
あと、 User Local で取得した USR_LOCAL_API_KEY
の設定が必要です。
コードの解説
app.rb
require 'sinatra'
require 'line/bot'
require 'rest-client'
def client
@client ||= Line::Bot::Client.new { |config|
config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
}
end
def get_user_local_bot_reply(word)
response = RestClient.get 'https://chatbot-api.userlocal.jp/api/chat', { params: { key: ENV['USR_LOCAL_API_KEY'], message: CGI.escape(word) } }
response_json = JSON.parse(response)
response_json['status'] == "success" ? response_json['result'] : '通信エラー'
end
post '/callback' do
body = request.body.read
signature = request.env['HTTP_X_LINE_SIGNATURE']
unless client.validate_signature(body, signature)
error 400 do 'Bad Request' end
end
events = client.parse_events_from(body)
events.each { |event|
case event
when Line::Bot::Event::Message
case event.type
when Line::Bot::Event::MessageType::Text
message = {
type: 'text',
text: get_user_local_bot_reply(event.message['text'])
}
client.reply_message(event['replyToken'], message)
when Line::Bot::Event::MessageType::Image, Line::Bot::Event::MessageType::Video
response = client.get_message_content(event.message['id'])
tf = Tempfile.open("content")
tf.write(response.body)
end
end
}
"OK"
end
今回は、 Line 公式 Gem line-bot-sdk-ruby で公開されているサンプルコードの部分がほとんどです。
追加したのも UserLocal API を叩くための rest-client Gem ぐらいです。
get_user_local_bot_reply
メソッドで UserLocalAPI とのやりとりをしています。今回は面倒なので UserLocalAPI 通信に失敗しても '通信エラー'
と Line に投稿されます。