ムーのしょ〜もない様でしょ〜もなくもないブログ

プログラミング未経験だけど、エンジニアになりたい、IT関係の仕事がしたい方向けに情報を発信しています!あっ!けどプログラミング以外にも皆さんに有益になる様な情報も発信しますよー!

LINE Message APIでRailsを使っておうむ返し

こんにちは! 今LINE Message APIRailsを使ってちょこっと作りたいものがあるので

その前哨戦としてまずはおうむ返しをしてみたのでメモ!

まずは携帯にはラインはあるけどパソコンにはラインはまだインストールしていなかったので

まずはインストール。

そしてLINE developersアカウントを下記のサイトから登録を行います。

https://developers.line.me/ja/

こちらの記事を参照

LINE developersアカウントの登録とMessaging APIの基本設定 - Symfoware

次にherokuアカウントの準備

あらかじめLINE-BOTディレクトリを作成しておいて

$ rails new sample_bot

本当はここで

$ rails new sample_bot --database=postgresql  

をしたかった。 herokuSQLiteが使えないのでPostgreSQLを使う為に上記の様にしたかった

そしたらローカル環境でも本番環境でもちょっとだけめんどくさくなくなるみたい

必死こいてググって色々やってみたがなぜか出来なくて

今回はローカルではSQLite、本番ではPostgreSQLで進む

rails newをした時にフレームワークが生成されるので

その時にGemfilegem 'sqlite3'も生成されるからそれをローカル環境に移動してあげる

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'sqlite3'
end

本番環境ではPostgreSQLで実行するからGemfileに追加してあげる

group :production do
  gem 'pg', '0.20.0'
end

そして

$ bundle install --without production

$ rails s

で、いつものやつが出たら成功!!

次にLINE botを使うためのgemをいれる

Gemfileに

gem 'line-bot-api'  

を追加

忘れる事なく

$ bundle install --without production

次に今回作るおうむ返し用のアプリをherokuで作成する

$ heroku create sample-line-bot20001211

heroku側の動作確認用にroutingの設定を実施

app/controllers/application_controller.rbを以下の定義を追加

def hello  
    render html: "hello, world!"  
end  

app/config/routes.rbを以下の定義を追加

root 'application#hello'  

commitしてからherokuにデプロイ

$ git add .  
$ git commit -m 'first commit'  
$ git push heroku master  
$ heroku open

heroku openした時にエラー発生!!

Gemfileみたりコードが間違えていないか色々検証したが

この時点でほとんどまだコードを書いてないのにエラーになった

herokuのアプリを消去してからもう1回作成してremoteのurlを変更してから

再度heroku openしたらしっかりと表示された!!

LINEからのrequestを受け取るcontrollerの作成

$ rails g controller linebot  

LINEbotの認証情報をセキュアに利用できるようにdotenv-railsを導入

gem 'dotenv-rails'  

gem 'dotenv-rails' とは?下記参照

環境によって変わる設定値はdotenvを使うと便利 - Qiita

忘れる事なく

$ bundle install --without production

heroku側で、値を参照できるようにLINE developersアカウントを作成した時に

Channel Secret、アクセストークンをsetしておきます。

$ heroku config:set LINE_CHANNEL_SECRET=xxxx  
$ heroku config:set LINE_CHANNEL_TOKEN=xxxx  

xxxxにコピペして貼り付け

routingの定義を追加

config/routes.rbを編集します

post '/callback' => 'linebot#callback'  

controllerの実装

app/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  
    body = request.body.read  

    signature = request.env['HTTP_X_LINE_SIGNATURE']  
    unless client.validate_signature(body, signature)  
      error 400 do 'Bad Request' end  
    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  
          message = {  
            type: 'text',  
            text: event.message['text']  
          }  
          client.reply_message(event['replyToken'], message)  
        end  
      end  
    }  

    head :ok  
  end  
end  

そしてデプロイ

$ git add .  
$ git commit -m 'setup reply'  
$ git push heroku master  

LINE Botの設定画面にherokuのappのURLを設定 LINE botの管理画面に戻って、Webhook URLという部分を編集

URLは先ほど追加したLINE Botのリクエストの受け口である/callbackの指定を忘れない f:id:muuuuukun:20181210223121p:plain

投稿に応じてWebhookイベントを発生をONにする

Webhook URL設定の上の欄です。 編集して、利用するにチェックして更新する f:id:muuuuukun:20181210224721p:plain

(任意)LINE Bot デフォルトの自動返信を削除する f:id:muuuuukun:20181210224907p:plain

以下の自動応答メッセージを削除しておくと、おうむ返しの確認がしやすいです f:id:muuuuukun:20181210225134p:plain

検証

LINE developerのページに戻りQRコードから友達追加

なんでも良いから送っておうむ返し出来たら成功!!