概要
プログラミング初学者です。勉強のためにLine botを作成してみました。
テキストメッセージにはテキストを、スタンプにはスタンプを返す仕様です。
手順
- アプリケーション作成
- Line developperにてアカウントを作成(割愛)
- herokuにデプロイ
- gem 'line-bot-api'を使って実装
アプリケーション作成
$ rails _6.0.0_ new line_bot -d mysql # アプリ立ち上げ(DBはmysql、のちにherokuでpostgresに変換)
$ cd line_bot # ディレクトリに移動
$ rails db:create # DB作成
必要なgemを導入
gem 'line-bot-api' # Line apiを使うのに必要
gem 'dotenv-rails' # 環境変数を使うのに必要
$ bundle install # gemを反映させる
$ rails g controller line_bots client collback # コントローラーの作成
今回は、line_botコントローラーの他にpostモデルを作成し、botの返信用にランダムなテキストを登録でき使用にしました。
参照:Line-botをrailsで作ってみた。
$ rails g scaffold Post name:string # postモデルに関する全てを自動生成
$ rails db:migrate # DBにmigrateする
コントローラーの作成。
公式を読みましたがメッセージオブジェクトの理解に苦しみました。。。
参照:Line Developers
メッセージオブジェクトの中身をテキストかスタンプかに記述することで条件分岐によって返信方法を分けることができました。
class LineBotsController < ApplicationController
require 'line/bot' # gem 'line-bot-api'
# callbackアクションのCSRFトークン認証を無効
protect_from_forgery :except => [:callback]
def client
@client ||= Line::Bot::Client.new { |config|
config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
}
end
def callback
# Postモデルの中身をランダムで@postに格納する
@post=Post.offset( rand(Post.count) ).first
body = request.body.read
signature = request.env['HTTP_X_LINE_SIGNATURE']
unless client.validate_signature(body, signature)
head :bad_request
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
if event.message['text'].include?("運勢")
message = {
type: 'text',
text: ["大吉", "中吉", "小吉", "凶", "大凶"].shuffle.first
}
elsif event.message['text'].include?("天気")
message = {
type: 'text',
text: ["今日は快晴です", "今日は大雨です", "今日は曇りです", "今日は雪が降るかもしれません", "曇り時々雨"].shuffle.first
}
elsif event.message['text'].include?("おはよう")
message = {
type: 'text',
text: ["おはようございます🌞", "昨日はよく眠れたかな?", "おはよう!!", "ZZZ...", "おはよう、気持ちの良い朝ですね!!"].shuffle.first
# emojis: {
# index: 0,
# productId: "5ac21184040ab15980c9b43a",
# emojiId: "015"
# }
}
elsif event.message['text'].include?("おやすみ")
message = {
type: 'text',
text: ["おやすみなさい😴", "8時間は寝ましょう!!", "おはよう!!", "ZZZZZZZZZZ...", "眠れない。。"].shuffle.first
# emojis: {
# index: 0,
# productId: "5ac21184040ab15980c9b43a",
# emojiId: "015"
# }
}
elsif event.message['text'].include?("じゃんけん")
message = {
type: 'text',
text: "ぐー、ちょき、ぱーのどれかを出してね。じゃんけんぽん!"
}
elsif event.message['text'].include?("ぐー")
message = [{
type: 'text',
text: "ぐー!あいこ!"
},
{
type: 'text',
text: "ちょき!私の負け。。"
},
{
type: 'text',
text: "ぱー!私の勝ち!"
},
{
type: 'text',
text: "ちょき!強すぎない。。"
}].shuffle.first
elsif event.message['text'].include?("ちょき")
message = [{
type: 'text',
text: "ぐー!私の勝ち!!"
},
{
type: 'text',
text: "ちょき!あいこ!"
},
{
type: 'text',
text: "ぱー!私の負け。。"
}].shuffle.first
elsif event.message['text'].include?("ぱー")
message = [{
type: 'text',
text: "ぐー!私の負け。。"
},
{
type: 'text',
text: "ちょき!私の勝ち!"
},
{
type: 'text',
text: "ぱー!あいこ!"
}].shuffle.first
else
message = {
type: 'text',
text: @post.name
}
end
when Line::Bot::Event::MessageType::Sticker
message = [{
type: 'sticker',
packageId: '11537',
stickerId: '52002734'
},
{
type: 'sticker',
packageId: '11537',
stickerId: '52002736'
},
{
type: 'sticker',
packageId: '11537',
stickerId: '52002760'
},
{
type: 'sticker',
packageId: '11537',
stickerId: '52002740'
},
{
type: 'sticker',
packageId: '11537',
stickerId: '52002771'
}].shuffle.first
end
client.reply_message(event['replyToken'], message)
end
}
head :ok
end
end
環境変数を定義
参照:【Rails】dotenv-railsの導入方法と使い方を理解して環境変数を管理しよう!
LINE_CHANNEL_SECRET = 自身のチャンネルシークレット
LINE_CHANNEL_TOKEN = 自身のチャンネルアクセストークン
# いずれもLine Developersに記載があります
herokuにデプロイ
本番環境はherokuでやりました。
railsチュートリアルを参考に実行しました(記事内の「デプロイする」項目を参照に行いました。)
参照:Ruby on Railsチュートリアル
本番環境での環境変数の設定
# heroku上でURL作成後下記実行
$ heroku login
$ heroku config:set LINE_CHANNEL_SECRET= 自身のチャンネルシークレット
$ heroku config:set LINE_CHANNEL_TOKEN= 自身のチャンネルアクセストークン
$ heroku config # 環境変数が適用されているか確認
$ heroku run rake db:migrate # DBをmigrate
Webhook設定
Line botのapiを呼び出す
# Line Developers
アプリのURL(herokuでデプロイしたので"https//○○○.herokuapp.com")//callback
デプロイの実行
実行後、Webhookの検証で「成功」とでたらLine botが動きます。
$ git push heroku master
以上です。
今後は、pushメッセージや、他のAPIと連携したbotが作れるよう勉強していきます。