みかづきメモ

学習したことのメモとか、日記とか、備忘録。

Ruby で LINE の Bot を作成する

どうやら、 LINE の Bot を作るための API が公開されているようなので、
早速作ってみようと思います(若干乗り遅れた感はありますが)。


ということで、作成したやつのリポジトリ

github.com

地名を送信すると、その場所の天気を絵文字で返信するだけのものです。
Heroku の無料プラン上で動いています。


今回は、小さなアプリであるため、 Sinatra で作成しました。

アカウント登録などは、すでに解説記事などが上がっていたので、そちらを参考に。
ちなみに、今日もまだ申し込みできるようでしたので、興味が有るのならお早めに。

ということで、早速作成していきます。
とりあえず、 Sinatra アプリを作っていきます。

$ mkdir line-bot
$ cd line-bot/
$ bundle init 
$ vim Gemfile


Gemfile を編集。

# @ Gemfile
source "https://rubygems.org"

gem "sinatra"
gem "sinatra-contrib"


gem をインストールし、スクリプトを書いていきます。

$ bundle
$ vim app.rb
require "sinatra"
require "sinatra/reloader" if development?

get "/" do
  "Hello, world!"
end

これで、 ruby app.rb とし、 http://localhost:4567 にアクセスすれば、「Hello, world!」と
表示されます。

次は、 Bot の機能を作成していきます。
チャットなどが送られてきたら、 Callback URL へとアクセスされるようなので、そこへ実装していきます。
とりあえず、送られてきたテキストを、そのまま返すだけの Bot です。

# @ app.rb
# ~
require "rest-client"
require "json"
# ~

post "/callback" do
  line_mes = JSON.parse(request.body.read)["result"][0]
  message = line_mes["content"]["text"]
  contents = {
    contentType: 1,
    toType: 1,
    text: message
  }
  post_params = {
    to: [line_mes["content"]["from"]], 
    toChannel: 1383378250, 
    eventType: 138311608800106203, 
    content: contents
  }
  headers = {
    "Content-Type": "application/json; charser=UTF-8",
    "X-Line-ChannelID": "YOUR_CHANNEL_ID",
    "X-Line-ChannelSecret": "YOUR_CHANNEL_SECRET",
    "X-Line-Trusted-User-With-ACL": "YOUR_CHANNEL_MID"
  }
  
  RestClient.proxy = ENV["FIXIE_URL"]S
  RestClient.post("https://trialbot-api.line.me/v1/events", post_params.to_json, headers)
end

これを、 Heroku へと push します。

$ heroku create line-bot
$ git push heroku master

次に Heroku にて、 Fixie を導入します。
これは、 LINE が Bot がメッセージを送信する際に、送信元の IPアドレスを、
予めホワイトリストに登録する必要が有るためです。

アプリの Resources から、 Add-on で、 Fixie を導入します(FreeプランでOK)。
なお、 Add-on の導入には、クレジットカードの登録が必要です。
導入したら、 Outbound IPs の IP アドレスをホワイトリストに登録します。

あとは、コンタクトに追加して、チャットを送信すれば OK です。

(私の作ったものだと、)こんな感じで動きます。

f:id:MikazukiFuyuno:20160412174222p:plain:w400

ではでは〜。