프로그래밍 초학자가 LINE-bot을 만들어 보았다

17300 단어 linebot루비Rails

개요



사사입니다만, 전혀 일기예보를 보지 않습니다.
그 때문에 아침에 비가 내리지 않으면 우산을 가져 가지 않고, 매회 편의점에서 우산을 사거나 비에 맞으면서 귀가하는 것이 많이 있습니다.
그래서! 우산비의 절약, 더 이상 집에 우산을 늘리지 않기 위해서도, 자신용으로 아침 7시에 우산이 필요한지 통지해 줘, 이쪽이 「내일・내일・오늘・등등」이라고 입력하면 그 날 에 비가 내리는지를 돌려주는 LINE Bot을 구현해 보았습니다.



절차



・사전에 Rails의 환경을 정돈한다
새로운 Rails 애플리케이션 만들기 "rails new"명령 실행
$ rails new アプリケーション名

생성된 디렉토리(폴더)로 이동
$ cd 作成されたディレクトリ名

Gemfile 하단에 다음 코드 추가

gem ' dotenv-rails ' 
gem 'line-bot-api' #dotenv-railsは環境変数を扱うために使用するgem

다음 명령으로 Gem 설치
$bundle install

User 모델 만들기
$ rails generate model モデル名 カラム名:データ型

위의 명령으로 새로 마이그레이션 파일도 생성됩니다. 이 마이그레이션 파일을 다음과 같이 편집
class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :line_id, null: false # この行を修正

      t.timestamps
    end
  end
end

다음 명령으로 데이터베이스 테이블 작성
$ bundle exec rails db:create
$ bundle exec rails db:migrate

새로 만든 파일 편집

lib/tasks/scheduler.rake
task :update_feed => :environment do
  require 'line/bot'  # gem 'line-bot-api'
  require 'open-uri'
  require 'kconv'
  require 'rexml/document'
#line-bot側の設定
  client ||= Line::Bot::Client.new { |config|
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
  }
  # 使用したいxmlデータURLを入力
  # xmlデータをパース
  # パスの共通部分を変数化
  # 6時〜12時の降水確率
  # メッセージを発信する降水確率の下限値の設定
  min_per = 20
  if per06to12.to_i >= min_per || per12to18.to_i >= min_per || per18to24.to_i >= min_per
    word1 =
      ["テキスト入力",].sample
    word2 =
      ["テキスト入力"].sample
    # 降水確率によってメッセージを変更する閾値の設定。
#ifの条件式の中で降水確率によって送信されるメッセージを変更
    mid_per = 50
    if per06to12.to_i >= mid_per || per12to18.to_i >= mid_per || per18to24.to_i >= mid_per
      word3 = "テキスト入力"
    else
      word3 = "テキスト入力!"
    end
    # 発信するメッセージの設定
    push =
      "#{word1}\n#{word3}\n降水確率\n   6〜12時 #{per06to12}\n 12〜18時  #{per12to18}\n 18〜24時 #{per18to24}\n#{word2}"
    # メッセージの発信先idを配列で渡す必要があるため、userテーブルよりpluck関数を使ってidを配列で取得。
#multicastsメソッドは、今回利用しているgem「line-bot-api」で定義されており、このメソッドを呼び出している
    user_ids = User.all.pluck(:line_id)
    message = {
      type: 'text',
      text: push
    }
    response = client.multicast(user_ids, message)
  end
  "OK"
end

다음 명령으로 컨트롤러 만들기
$ bundle exec rails g controller linebot

생성된 컨트롤러 편집

app/controller/linebot_controller.rb
class LinebotController < ApplicationController
  require 'line/bot'  # gem 'line-bot-api'
  require 'open-uri'
  require 'kconv'
  require 'rexml/document'

  def callback
    body = request.body.read
    signature = request.env['HTTP_X_LINE_SIGNATURE']
    unless client.validate_signature(body, signature)
      return head :bad_request
    end
    events = client.parse_events_from(body)
    events.each { |event|
      case event
        # メッセージが送信された場合の対応を入力

        # ユーザーからテキスト形式のメッセージが送られて来た場合の対応を入力

          when /.*(明日|あした).*/
            # info[2]:明日の天気
            per06to12 = doc.elements[xpath + 'info[2]/rainfallchance/period[2]'].text
            per12to18 = doc.elements[xpath + 'info[2]/rainfallchance/period[3]'].text
            per18to24 = doc.elements[xpath + 'info[2]/rainfallchance/period[4]'].text
            if per06to12.to_i >= min_per || per12to18.to_i >= min_per || per18to24.to_i >= min_per
              push =
                "テキスト\nテキスト\n降水確率\n   6〜12時 #{per06to12}\n 12〜18時  #{per12to18}\n 18〜24時 #{per18to24}\nテキスト"
            else
              push =
                "テキスト"            end
          # テキスト以外(画像等)のメッセージが送られた場合
        else
          push = "テキスト"
        end
        message = {
          type: 'text',
          text: push
        }
        client.reply_message(event['replyToken'], message)
        # LINEお友達追された場合
      when Line::Bot::Event::Follow
        # 登録したユーザーのidをユーザーテーブルに格納
        line_id = event['source']['userId']
        User.create(line_id: line_id)
        # LINEお友達解除された場合
      when Line::Bot::Event::Unfollow
        # お友達解除したユーザーのデータをユーザーテーブルから削除
        line_id = event['source']['userId']
        User.find_by(line_id: line_id).destroy
      end
    }
    head :ok
  end

  private

  def client
    @client ||= Line::Bot::Client.new { |config|
      config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
      config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
    }
  end
end




기호의 의미
・「.」:무언가 1문자(「아」나 「a」등 1문자라면 무엇이든 히트합니다)
・「*」:직전의 문자가 0회 이상 반복하는 경우에 매치

라우팅 설정
메시지가 왔을 때, 친구 추가되었을 때, 해제가 되었을 때, linebot 컨트롤러의 callback 액션이 불려지도록 하고 있습니다.

config/routes.rb

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

이 후 원하는 렌탈 서버, 공유 서버에 배포
(나는 Heroku에 배포했다)

여기
LINE Bot 계정 생성 및 설정
하고 완성! !

좋은 웹페이지 즐겨찾기