Herokuでリクエストを受けとり、VPSで処理をするLINE BOTをつくってみた
対象
LINE BOT をとりあえずタダで Heroku で動かす を参考にタダで Heroku で動かせたひと。
SSL証明書はないけど、固定IPの割り当てられてる VPS (など)を持ってるひと。
なんとかしたい
Fixie
プラグインの毎月500リクエストで制限がかかってしまうのをなんとかしたい。
対策
Heroku で LINE サーバからリクエストを受け取ってキューイングし、VPS で取り出して LINE API にリクエストを投げる。
Fixie
に頼らなくてよくなる。
キューイングの仕組みは、heroku-redis と sidekiq を使うと簡単。
(ただし heroku-redis はまれに接続情報が変わるので、VPS で redis の運用をした方がより良さそう)
やってみる
参考文献のプログラムを元に改造していく。
まず app.rb
にあったオウム返し処理を echoback.rb
に切り出す。(sidekiq の設定もついでにかく)
require 'bundler/setup'
require 'sinatra'
require 'json'
require './echoback'
post '/linebot/callback' do
params = JSON.parse(request.body.read)
params['result'].each do |msg|
Echoback.perform_async(msg)
end
"OK"
end
require 'sidekiq'
require 'httpclient'
Sidekiq.configure_client do |config|
config.redis = { url: ENV.fetch('REDIS_URL'), namespace: ENV.fetch('RACK_ENV') }
end
Sidekiq.configure_server do |config|
config.redis = { url: ENV.fetch('REDIS_URL'), namespace: ENV.fetch('RACK_ENV') }
end
class Echoback
include Sidekiq::Worker
def perform(msg)
request_content = {
to: [msg['content']['from']],
toChannel: 1383378250, # Fixed value
eventType: "138311608800106203", # Fixed value
content: msg['content']
}
http_client = HTTPClient.new
endpoint_uri = 'https://trialbot-api.line.me/v1/events'
content_json = request_content.to_json
http_client.post_content(endpoint_uri, content_json,
'Content-Type' => 'application/json; charset=UTF-8',
'X-Line-ChannelID' => ENV["LINE_CHANNEL_ID"],
'X-Line-ChannelSecret' => ENV["LINE_CHANNEL_SECRET"],
'X-Line-Trusted-User-With-ACL' => ENV["LINE_CHANNEL_MID"]
)
end
end
# A sample Gemfile
source "https://rubygems.org"
# gem "rails"
gem 'sinatra'
gem 'httpclient'
# gemも3つ追加
gem 'sidekiq'
gem 'redis-namespace'
gem 'dotenv'
# Procfile
web: bundle exec ruby app.rb -p $PORT
続いて、Heroku と VPS それぞれの環境を整える。
あと LINE の Whitelist に VPS の IP を登録する。
Heroku
heroku-redis をよしなにインストール。
ちなみに heroku-redis はメモリ25MBまで無料枠。
VPS
ソースコードをもってきて bundle
する。
.env
をつくる。
$ git clone https://github.com/user/sample
$ cd sample
$ bundle
$ vi .env
LINE_CHANNEL_ID='XXXXXXXXXXX'
LINE_CHANNEL_SECRET='XXXXXXXXXXX'
LINE_CHANNEL_MID='XXXXXXXXXXX'
REDIS_URL='XXXXXXXXXXX'
REDIS_URL
は heroku config | grep REDIS
で確認できる。
最後に sidekiq
を動かす。 heroku-redis
の最大コネクション数が20なので、それに収まるように調整する。
$ bundle exec sidekiq ./echoback.rb -c 5
or
$ bundle exec sidekiq ./echoback.rb -c 5 -d -L /path/to/logfile
以上で、LINE BOT に話しかけると Heroku と VPS が連携してオウム返し処理をしてくれる。
Author And Source
この問題について(Herokuでリクエストを受けとり、VPSで処理をするLINE BOTをつくってみた), 我々は、より多くの情報をここで見つけました https://qiita.com/utahta/items/1d7965a7d42ba8b25326著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .