프로그래밍 초학자가 LINE-bot을 만들어 보았다
개요
사사입니다만, 전혀 일기예보를 보지 않습니다.
그 때문에 아침에 비가 내리지 않으면 우산을 가져 가지 않고, 매회 편의점에서 우산을 사거나 비에 맞으면서 귀가하는 것이 많이 있습니다.
그래서! 우산비의 절약, 더 이상 집에 우산을 늘리지 않기 위해서도, 자신용으로 아침 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 계정 생성 및 설정
하고 완성! !
Reference
이 문제에 관하여(프로그래밍 초학자가 LINE-bot을 만들어 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kana20/items/18588b802291c1bc0a5d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)