Как подписаться на обновления в реальном времени для каналов пользователей моего приложения с помощью Koala Gem Rails

Возникли проблемы с получением обновлений в реальном времени от Facebook, работающего с использованием драгоценного камня Koala...

https://github.com/arsduo/koala/wiki/Realtime-Updates

Я следовал руководству в вики. Я установил URL-адрес обратного вызова со следующим в моем файле маршрутов:

match "facebook/subscription", :controller => :facebooks, :action => :subscribe, :as => 'subscribe', :via => [:get,:post]

Затем, когда Facebook отправляет запрос на получение, я пробовал в своем контроллере следующее: /getting-started#verification-requests" rel="nofollow noreferrer">https://developers.facebook.com/docs/graph-api/webhooks/getting-started#verification-requests):

class FacebooksController < ApplicationController

  def subscribe
    verify_token = "VERIFY_TOKEN"
    if params["hub.mode"] == "subscribe" && params["hub.verify_token"] == verify_token
      params["hub.challenge"]
    else
      false
    end
  end
end

Я также пробовал (с измененным маршрутом на правильное действие):

class FacebooksController < ApplicationController
 def realtime_request?(request)
    ((request.method == "GET" && params['hub.mode'].present?) ||
       (request.method == "POST" && request.headers['X-Hub-Signature'].present?))
  end

  def subscription
    if(realtime_request?(request))
      case request.method
      when "GET"
        challenge = Koala::Facebook::RealtimeUpdates.meet_challenge(params,'SOME_TOKEN_HERE')
        if(challenge)
          render :text => challenge
        else
          render :text => 'Failed to authorize facebook challenge request'
        end
      when "POST"
        p params['object']
        render :text => 'Thanks for the update.'
      end
    end
  end
end

Результатом каждый раз является следующая ошибка на их панели инструментов, когда я пытаюсь подписаться:

The URL couldn't be validated. Response does not match challenge, expected value="2090763306", received="\u003C!DOCTYPE html>\n\u003Chtm..."

И следующее, когда я пытаюсь запустить это в консоли:

Консольная команда: @updates.subscribe("user", "feed", "https://www.bettrplay.com/facebook/subscription" , "YOUR_VERIFY_TOKEN")

Ответ консоли: Koala::Facebook::ClientError: type: OAuthException, code: 2201, message: (#2201) response does not match challenge, expected value="773833772", received="\u003C!DOCTYPE html>\n\u003Ch...", x-fb-trace-id: GbtUB+FcLJS [HTTP 400]

Я не уверен, в чем проблема, поскольку я не вижу, что возвращается в Facebook, и я все еще немного не уверен, что мне следует использовать в качестве VERIFY_TOKEN.

Любая помощь приветствуется.


person Gareth32    schedule 11.07.2019    source источник
comment
Отправляемый вами ответ, очевидно, представляет собой HTML-документ, поскольку он начинается с \u003C!DOCTYPE html>…, но API ожидает, что вы ответите просто значением запроса в виде простого текста и ничего больше. Вам нужно выяснить, как настроить его, чтобы не использовать шаблон страницы по умолчанию (?) для этого конкретного ответа.   -  person misorude    schedule 12.07.2019
comment
Спасибо misorude ... Мне удалось найти проблему - контроллер действий пытался аутентифицировать пользователя для разработки, поэтому возвращал для этого HTML-шаблон ошибки! Теперь у меня проблема с ошибкой 500: ``` ActionView::MissingTemplate (отсутствует шаблон facebooks/subscribe, приложение/подписка с {:locale=›[:en], :formats=›[:html], :variants= ›[], :handlers=›[:raw, :erb, :html, :builder, :ruby, :jbuilder, :haml]}. ```Похоже, Rails ищет шаблон для отправки? Я пробовал render text: challenge, , content_type: 'text/plain' но не повезло... Есть идеи?   -  person Gareth32    schedule 12.07.2019


Ответы (1)


ОК, после долгих испытаний и скручивания я нашел проблему.

Сначала проблема заключалась в том, что разработчики пытались аутентифицироваться и поэтому отвечали документом об ошибке HTML.

Затем я использовал фрагмент кода здесь, чтобы ответить на запрос, который был хорош, но устарел.

На всякий случай, если кто-то пропустил это, render_text: теперь render_plain : Что использовать вместо `render :text` (и `render ничего: true`) в rails 5.1 и более поздних версиях?

Теперь я подписан на обновления от пользователей моего приложения, и если вы хотите сделать то же самое, вы можете использовать приведенный выше код, просто не забудьте пропустить аутентификацию в FacebooksController и использовать render_plain вместо render_text!

person Gareth32    schedule 12.07.2019