なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

Ruby で LINE の Bot を作成する

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


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

GitHub - mika-archived/line-weather-bot

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

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

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

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

$ mkdir line-bot
$ cd line-bot/
$ bundle init
$ vim 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 です。

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 です。

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

ではでは〜。