Rails:用于跟踪 Facebook Messenger 聊天机器人点击次数的 Shorturl 节省了太多点击次数

Rails: Shorturl to track clicks for Facebook Messenger chatbot is saving way too many clicks

我使用 the Facebook-Messenger gem 来创建一个聊天机器人,让我可以突然向我的订阅者发送消息。

我想在我的 rails 数据库中保存每次单击 the generic model 的 url 按钮。为此,我创建了一个特殊的 url 指向一个短 url 控制器,它在保存数据后重定向到最终的 url。

worker中的发送请求:

def perform(sender, title, image_url, subtitle, cta_url, cta_text, access_token, letter_id)
    Bot.deliver({
      recipient: {
        id: sender
      },
      message: {
        "metadata": letter_id,
        "attachment":{
          "type": "template",
          "payload":{
            "template_type": "generic",
            "elements":[
            {
              "title": title,
              "image_url": image_url.html_safe,
              "subtitle": subtitle,
              "default_action": {
                "type": "web_url",
                "url": cta_url.html_safe
              },
              "buttons": [
              {
              "type": "web_url",
              "url": cta_url.html_safe,
              "title": cta_text
              },
              {
                "type": "element_share"
              }
            ]
            }
          ]
          }
        }
      }
    }, access_token: access_token)
  end

短url控制器:

class ShorturlController < ApplicationController
  def show
    @shorturl = ShortUrl.find_by_token(params[:id])
    @card = Card.find(@shorturl.card_id)
    @subscriber = BotUser.find_by_sender_id(params['u'])

    analytic_clic.increment!(:click_count, by = 1)

    @final_url = @card.cta_button_url

    redirect_to @final_url, :status => 301
  end

private

  def analytic_clic
    @analytic_clic ||= AnalyticClic.find_or_create_by(
      card_id: @card.id, 
      short_url_id: @shorturl.id, 
      bot_user_id: @subscriber.id
    )
  end

end

与短url控制器关联的路线:

get 's/:id' => "shorturl#show"

不幸的是,当我将消息发送给大约 200 名订阅者时,它立即节省了大约 100 次点击。我不知道为什么,因为 Facebook 不通过发送 http 请求 "test" url。日志很好,我有很多关于 shorturl 的 get 请求,但在那之前没有错误。

知道为什么即使订阅者还没有点击 link 它也会对我的短片url 执行所有这些获取请求吗?

这是我创建的短url的示例:https://www.botletter.com/s/qsKcsm7NCRp4qkRGUqfPx7Sp?u=1451521288246029

问题是 Facebook 爬虫,我添加了以下条件以避免在 Facebook 访问 url 时保存点击:

if request.user_agent == "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"
      puts "Facebook crawl"
    else
      # save to db
    end