2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】Line bot の作成

Last updated at Posted at 2021-01-04

概要

プログラミング初学者です。勉強のためにLine botを作成してみました。
テキストメッセージにはテキストを、スタンプにはスタンプを返す仕様です。
Image from Gyazo

手順

  • アプリケーション作成
  • 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を導入

Gemfile

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
メッセージオブジェクトの中身をテキストかスタンプかに記述することで条件分岐によって返信方法を分けることができました。

line_bots_controller

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の導入方法と使い方を理解して環境変数を管理しよう!

.env
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が作れるよう勉強していきます。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?