[Rails]LINE Bot을 로컬 환경에서 이동하거나 디버깅하는 방법

소개



LINE Bot을 개발할 때, heroku나 AWS등의 PaaS나 IaaS를 사용하고 있는 분이 많다고 생각합니다만, 수정할 때마다 매번 배포하는 것은 귀찮다고 생각합니다.
그래서 Ngrok이라는 도구를 사용하여 일반 웹 애플리케이션을 개발하기 위해 로컬 환경에서 LINE Bot을 쉽게 이동하고 디버깅하는 방법을 소개합니다.

덧붙여서 LINE Bot은 Rails 전제로 쓰고 있습니다.

환경


  • OS : Ubuntu 16.04.3
  • Ruby : 2.4.2
  • Ruby on Rails : 5.1.4

  • OS : Windows 8.1
  • Ngrok


  • ※Windows상에서 vagrant로 Rails 환경을 움직이고 있습니다

    1. LINE Developers에서 설정



    1-1. 채널 만들기



    아래 공식 절차를 참조하여 BOT용 채널을 만듭니다.
    ぇぺぺrs. 네. 메 / 자 / 도 cs / 메사 긴 g 아피 / 곁 친 g - r d /

    1-2. 콘솔에서 봇 설정



    그런 다음 아래 콘솔에서 만든 채널을 설정합니다.
    ぇぺぺrs. 네.め/こんそぇ/
    여기에서 Webhook 보내기를 선택하여 webhook을 활성화합니다.
    또한 다음 키를 삼가해 둡니다.
  • Channel Secret
  • 액세스 토큰 (긴 기간)

  • 2. Rails 초기 설정



    rails new로 프로젝트를 만듭니다. 불필요한 것은 옵션으로 생략합니다.
    bundle exec rails new sample_bot --skip-turbolinks --skip-test --skip-bundle
    

    Gemfile을 수정합니다.
    초기 설정 그대로도 문제 없습니다만, gem 'line-bot-api' 는 추가해 둡니다.

    Gemfile
    source 'https://rubygems.org'
    
    gem 'rails', '~> 5.1.4'
    gem 'puma', '~> 3.7'
    gem 'line-bot-api'
    
    group :production do
      gem 'pg', '0.18.4'
    end
    
    group :development, :test do
      gem 'sqlite3'
      gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
      gem 'better_errors'
      gem 'binding_of_caller'
      gem 'rspec-rails'
      gem 'rails-controller-testing'
    end
    
    group :development do
      gem 'web-console', '>= 3.3.0'
      gem 'listen', '>= 3.0.5', '< 3.2'
      gem 'spring'
      gem 'spring-watcher-listen', '~> 2.0.0'
    end
    
    gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
    

    bundle install합니다.
    bundle install --without production
    

    아래에서 rails가 시작되면 완료됩니다.
    bundle exec rails server
    

    2. 앵무새 반환 BOT 구현



    우선 앵무새 반환하는 bot를 구현합니다. 아래 공식 SDK 샘플을 기반으로 만듭니다.
    htps : // 기주 b. 코 m / ぃね / ぃねーぼ tsdk-by

    config/routes.rb
    Rails.application.routes.draw do
      post '/callback', to: 'webhook#callback'
    end
    

    app/controllers/application_controller.rb
    require 'line/bot'
    
    class ApplicationController < ActionController::Base
      protect_from_forgery with: :null_session
    
      before_action :validate_signature
    
      def validate_signature
        body = request.body.read
        signature = request.env['HTTP_X_LINE_SIGNATURE']
        unless client.validate_signature(body, signature)
          error 400 do 'Bad Request' end
        end
      end
    
      def client
        @client ||= Line::Bot::Client.new { |config|
          config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
          config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
          # ローカルで動かすだけならベタ打ちでもOK
          # config.channel_secret = "your channel secret"
          # config.channel_token = "your channel token"
        }
      end
    end
    

    app/controllers/webhook_controller.rb
    class WebhookController < ApplicationController
    
      def callback
        body = request.body.read
        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)
            when Line::Bot::Event::MessageType::Image, Line::Bot::Event::MessageType::Video
              response = client.get_message_content(event.message['id'])
              tf = Tempfile.open("content")
              tf.write(response.body)
            end
          end
        }
        "OK"
      end
    end
    
    application_controller.rb 에서 참조하는 환경 변수를 서버에 설정합니다만, 로컬로 움직이는 것만이라면 베타타도 문제 없습니다.
  • ENV["LINE_CHANNEL_SECRET"] -> LINE Developers 콘솔 로부터 취득한 Channel Secret 를 지정
  • ENV["LINE_CHANNEL_TOKEN"] -> LINE Developers 콘솔 로부터 취득한 액세스 토큰을 지정

  • 3. 로컬로 이동



    여기에서 로컬로 이동하는 주요 단계입니다. 다음 단계에 따라 로컬에서 LINE Bot을 움직이는 환경을 구성합니다.

    3-1. Ngrok 설치



    Ngrok을 아래에서 다운로드하여 압축을 풉니 다.
    htps : / / 응 g로 k. 코m/
    ※해동한 폴더에 path를 통해 두십시오.

    3-2. Ngrok 시작


  • vagrant 등을 이용하여 게스트 OS에서 Rails를 움직이는 경우
  • ngrok http -host-header=rewrite 192.168.33.10:3000
    # ローカルからアクセスできるRailsのURL(この場合は192.168.33.10:3000)にリライトするように指定します
    
  • 로컬에서 Rails를 이동하는 경우 ( http://localhost:3000에서 액세스 할 수있는 경우)
  • ngrok http 3000
    # リライト不要で ngrok http 3000でOK
    

    ↓의 느낌으로 기동하므로, https://d9cbf7ca.ngrok.io 의 부분을 copipe 합니다. LINE의 Webhook URL은 https인 것이 필수이지만, 아래와 같이 https로 시작하고 있음을 알 수 있습니다.
    ngrok by @inconshreveable
    
    Session Status                online
    Version                       2.2.8
    Region                        United States (us)
    Web Interface                 http://127.0.0.1:4040
    Forwarding                    http://d9cbf7ca.ngrok.io -> 192.168.33.10:3000
    Forwarding                    https://d9cbf7ca.ngrok.io -> 192.168.33.10:3000
    
    Connections                   ttl     opn     rt1     rt5     p50     p90
                                  0       0       0.00    0.00    0.00    0.00
    

    3-3. LINE Developers에서 Webhook URL 설정



    htps : //에서 ゔぇぺぺrs. 네. 메/그럼/

    방금 복사한 URL +/callback을 지정합니다.

    3-4. Rails 시작


    bundle exec rails server
    

    3-5. LINE에서 가동 확인



    지금까지 로컬에서 가동 확인할 수 있는 환경이 갖추어졌으므로, 작성한 BOT를 친구 추가하고 실제로 LINE에서 메시지를 보냅니다.


    흐름적으로는 이런 느낌입니까?LINEアプリ -> LINE Messaging API -> Ngrok -> Rails(local)

    디버깅도!


    byebug 이나 binding.pry 를 넣으면 보통 디버깅도 가능합니다.
    (디버깅 방법은 여기 → Ruby / Ruby on Rails 디버깅 방법 요약)
    [6, 15] in /vagrant/rails_app/sample_bot/app/controllers/webhook_controller.rb
        6:     events = client.parse_events_from(body)
        9:     byebug
       10:
    => 11:     events.each { |event|
       12:       case event
       13:       when Line::Bot::Event::Message
       14:         case event.type
       15:         when Line::Bot::Event::MessageType::Text
    (byebug)
    

    이제 LINE Bot 개발이 가속화됩니다. 좋았어요.

    좋은 웹페이지 즐겨찾기