我在Heroku上创建了一个接收请求并在VPS上处理的LINE BOT
目标
参考LINE BOT 免费在Heroku上运行且成功的人。
拥有没有SSL证书但拥有固定IP分配的VPS(等等)的人。
なんとかしたい
Fixie プラグインの毎月500リクエストで制限がかかってしまうのをなんとかしたい。
应对方法 duì fǎ)
在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环境。
然后将VPS的IP地址添加到LINE的白名单中。
Heroku – Heroku
顺便提一下,好好安装heroku-redis。顺便提及,heroku-redis是免费的,内存限制为25MB。
虚拟专用服务器
带来源代码并进行捆绑。
创建.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'
可以通过 heroku config | grep REDIS 命令来确认 REDIS_URL。
最后运行 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将协作以提供复读回应的处理。