0

私はthe Facebook-Messenger gemを使用してチャットボットを作成して、青からメッセージを自分のサブスクライバに送信できます。Rails:Facebookメッセンジャーのチャットを追跡するショートカットchatbotがあまりにも多くのクリックを保存しています

the generic modelというURLボタンをクリックするたびに私のレールデータベースに保存したいと思います。そのために、データを保存した後に最終的なURLにリダイレクトするショートカットコントローラに向ける特別なURLを作成します。

ワーカーに送信要求:

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 

SHORTURLコントローラ:

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 

SHORTURLコントローラに関連付けられたルート:

残念なことに
get 's/:id' => "shorturl#show" 

、私が送信するとき約200人の加入者にメッセージを送信すると、即座に約100回のクリックが保存されます。なぜFacebookがhttpリクエストを送信してURLを "テスト"しないのかわかりません。ログは問題ありませんが、私は短期間で多くのリクエストを受け取りますが、その前にエラーはありません。

サブスクライバがまだリンクをクリックしていない場合でも、これらのリクエストをすべて私の短期間の要請に対して実行する理由は何ですか?ここで

は、私が作成したSHORTURLの例である:https://www.botletter.com/s/qsKcsm7NCRp4qkRGUqfPx7Sp?u=1451521288246029

+0

加入者のブラウザをリンクプレビューを読み込もうとしていますか? –

+0

しかし、Facebookの一般的なモデルを使用しているので、プレビューを生成する通常のリンクではなく、そうではありません。 – AlphaNico

+0

もしそうなら、200人の受信者がいるので200人のクリックを保存し、その半分だけでなく200人のクリックを保存する必要がありますか? – AlphaNico

答えて

0

問題は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 
関連する問題