【Rails】첫 LINE Bot(Gem line-bot-api)
                                            
                                                
                                                
                                                
                                                
                                                
                                                 16530 단어  루비RailsRails5LineBotAPIngrok
                    
개요
사사입니다만, 통근에 기차와 회사의 버스를 사용하고 있습니다.
거기서, 자신용으로 다음에 탈 수 있을 것 같은 버스의 시각과 스크래핑으로 전철의 운행 상황을 돌려 주는 LINE Bot를 실장해 보았습니다.
※ 스크래핑은 스크래핑처에 부하를 걸 우려가 있기 때문에, 실제의 운용은 하지 않고, 공부를 위한 실장입니다.
  절차 
 
gem 'line-bot-api' 에서 구현. Ngrok
이번에는 로컬 환경에서 시작한 포트 번호 3000번을 외부에서 액세스할 수 있도록 하고 싶다.
사용방법
① 다운로드
$ brew cask install ngrok
② ngrok 시작
이번에는 포트 번호 : 3000을 지정하고 ngrok을 시작합니다.
$ ngrok http 3000(port番号)
일어나면 터미널에 표시된 아래의
https://乱数.ngrok.io 부분을 복사하십시오.※ 난수 부분은 서버를 기동할 때마다 바뀌므로 그때마다 ② 이후의 작업이 필요.
    :
Forwarding    https://乱数.ngrok.io -> http://localhost:3000
    :
브라우저에서
http://localhost:3000/ 에 가면 rails 서버가 일어나는 것을 확인할 수 있다. ※ 물론, 앱도 rails s 로 기동해 둘 필요가 있다.③ LineBot Webhook 설정
LINE Developers 의 Bot 채널의 Webhook URL의 개소를, 상기 ②의 URL +/callback( 예
https://乱数.ngrok.io/callback )로 변경한다.※ Webhook : 한마디로, Bot에 이벤트가 발생했을 때, Bot 인스턴스에 통지하기 위한 액세스 포인트(URL) 일. URL을 지정하여 LINE에서 POST 요청을 보냅니다.
④ 접속 확인
그리고는, Bot를 친구 추가해, 동작 확인을 할 수 있다.
코드
DB는 mysql을 사용.
$ rails new アプリ名 -d mysql
db를 만들고 셔틀 버스 시간표 테이블을 만듭니다.
$ rails db:create
gem 소개 →
bundle installGemfile
gem 'line-bot-api'
gem 'nokogiri'
라우팅
routes.rb
post '/callback', to: 'linebot#callback'
컨트롤러
application_controller.rb
# gem 'line-bot-api'を使えるように宣言
require 'line/bot'
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :validate_signature, except: [:new, :create]
  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|
      # ローカルで動かすだけならベタ打ちでもOK。
      config.channel_secret = "your channel secret"
      config.channel_token = "your channel token"
    }
  end
end
linebot 컨트롤러 만들기
$ rails g controller linebot
linebot_controller.rb
class LinebotController < ApplicationController
  protect_from_forgery except: :sort
  # ルーティングで設定したcallbackアクションを呼び出す
  def callback
    body = request.body.read
    events = client.parse_events_from(body)
    events.each { |event|
      require "date"
      require 'nokogiri'
      require 'open-uri'
      #時刻表示を 時:分 に指定
      now = DateTime.now
      nowTime = now.strftime("%H:%M")
         :
     # 下記に記載
         :
      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)
        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
linebot_controller.rb
    :
# 1 を入力した時のアクション(DBからデータ取得)
if event.message["text"].include?("1")
  nextBus = BusTimetableKaiseiSt.all
  nextBusKaisei = []
  nextBus.each do |nextBus|
    time = nextBus.time.strftime("%H:%M")
    if time >= nowTime
      nextBusKaisei << time
    end
end
#DBから現在時刻を起点に直近の3つのバスの時刻を出力
response = 
    "開成発"+nextBusKaisei[0]+"\n
    Next "+nextBusKaisei[1]+"\n
    "+nextBusKaisei[2]+"\n\n\n
    ↓↓番号を選択↓↓\n
    1. 開成駅→会社(シャトルバス)\n
    2. 会社→開成駅(シャトルバス)\n
    3. 電車の運行状況\n
    4. 会社周辺の天気\n
    5. 東京の天気\n\n
    ※半角数字でお願いします。"
# 2 を入力した時のアクション(DBからデータ取得)
  # 流れは上記と同様なので、割愛
# 3 を入力した時のアクション(スクレイピングでデータ取得)
elsif event.message["text"].include?("3")
  urlOdakyu = 'https://www.odakyu.jp/cgi-bin/user/emg/emergency_bbs.pl'
  charset = nil
  htmlOdakyu = open(urlOdakyu) do |f|
    charset = f.charset
    f.read
  end
  docOdakyu = Nokogiri::HTML.parse(htmlOdakyu, nil, charset)
  docOdakyu.xpath('//div[@id="pagettl"]').each do |node|
    #スクレイピング情報の出力
    response = 
      node.css('p').inner_text+"\n\n\n
      ↓↓番号を選択↓↓\n
      1. 開成駅→会社(シャトルバス)\n
      2. 会社→開成駅(シャトルバス)\n
      3. 電車の運行状況\n
      4. 会社周辺の天気\n
      5. 東京の天気\n\n
      ※半角数字でお願いします。"
  end
# 4 を入力した時のアクション(スクレイピングでデータ取得)
  # 方法は上記と同様なので、割愛
# 5 を入力した時のアクション(スクレイピングでデータ取得)
  # 方法は上記と同様なので、割愛
# 上記以外を入力した時のアクション
else
  response =
      "↓↓番号を選択↓↓\n
      1. 開成駅→会社(シャトルバス)\n
      2. 会社→開成駅(シャトルバス)\n
      3. 電車の運行状況\n
      4. 会社周辺の天気\n
      5. 東京の天気\n\n
      ※半角数字でお願いします。"
end
       :
                Reference
이 문제에 관하여(【Rails】첫 LINE Bot(Gem line-bot-api)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/manbolila/items/5b6636ad64a5b4b7b074텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)