我在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将协作以提供复读回应的处理。

广告
将在 10 秒后关闭
bannerAds