LoginSignup
26
33

More than 3 years have passed since last update.

Line-botをrailsで作ってみた。

Posted at

はじめに

linebotの設定とか内容は以下のリンクをかなり参考にしてます。
ありがとう御座いました。
環境設定↓
今更ながらRails5+line-bot-sdk-ruby+HerokuでLineBot作成してみたら、色々詰まったのでまとめました。

ボットの内容↓
Ruby on Rails でlinebot。メンヘラbotを作ってみた。
LINEBOT + RailsでWikipediabotを作ってみました。

アカウントの作成

line developerでアカウント作成。
サイトのデザインはちょくちょく変わってるみたいです。
詳しくは以下のリンク↓
今更ながらRails5+line-bot-sdk-ruby+HerokuでLineBot作成してみたら、色々詰まったのでまとめました。

アプリの作成

プロジェクトを作って

$rails new sample_bot -d postgresql

dbを作って

$rails db:create

gemを入れて

gem 'line-bot-api'
$bundle install

ルートの作成

/callbackにラインからアクセスがあった時にlinebotコントローラーのcallbackアクションで処理を行う。

routes.rb

Rails.application.routes.draw do
  post '/callback' => 'linebot#callback'
end

コントローラーの作成

Postモデルは以下のコマンドで作りました。
サンプルのデーターは以下のサイトをまるっとパクりました。すいません。

Ruby on Rails でlinebot。メンヘラbotを作ってみた。

$rails g scaffold Post name:string

コントローラーは送られてきたメッセージに含まれた文字によって返すメッセージをif文で条件分岐しています。

controllers/linebot_controller.rb
class LinebotController < 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|

      # event.message['text']でLINEで送られてきた文書を取得
      if event.message['text'].include?("好き")
        response = "んほぉぉぉぉぉぉ!すきすきすきすきすきすきすきすきぃぃぃぃぃ"
      elsif event.message["text"].include?("行ってきます")
        response = "どこいくの?どこいくの?どこいくの?寂しい寂しい寂しい。。。"
      elsif event.message['text'].include?("おはよう")
        response = "おはよう。なんで今まで連絡くれなかったの?"
      elsif event.message['text'].include?("みーくん")
        response = "みーくん!?" * 50
      else
        response = @post.name
      end
      #if文でresponseに送るメッセージを格納

      case event
      when Line::Bot::Event::Message
        case event.type
        when Line::Bot::Event::MessageType::Text
          message = {
            type: 'text',
            text: response
          }
          client.reply_message(event['replyToken'], message)
        end
      end
    }

    head :ok
  end
end

本番環境の設定

herokuにデプロイして、herokuの環境変数に LINE_CHANNEL_SECRET と LINE_CHANNEL_TOKEN をセットする

$heroku config:set LINE_CHANNEL_SECRET=xxxx   #xxxxに自分のLINE_CHANNEL_SECRET
$heroku config:set LINE_CHANNEL_TOKEN=xxxx    #xxxxに自分のLINE_CHANNEL_TOKEN

でハマったのがLINE_CHANNEL_TOKENがどこにもない!!
IDとLINE_CHANNEL_SECRETしかない!!ってなったのですが、
結果見ている場所が違いました。どうやら、botの設定のサイトを見ていたみたいです。

Line official account managerのサイトでなく、

Line Developerのサイトをみてください!!

そこのTOP > プロバイダーリスト > プロバイダー名 > チャンネル名(ボットの名前) > チャネル基本設定に Channel Secret(LINE_CHANNEL_SECRET)とアクセストークン(LINE_CHANNEL_TOKEN)アクセストークンは再発行を押してください。

Webhook URLの設定

同じくチャンネル基本設定にあるWebhook送信を利用するにし、
Webhook URL ※SSLのみ対応に自分サイトのurlを登録してください。
https://.herokuapp.com/callback :例
注意:ここに登録したurlにラインのデータが送られるようになります。/callbackにラインからアクセスがあった時にlinebotコントローラーのcallbackアクションで処理を行うようにしてるため、このようなurlになっています。

26
33
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
26
33