没有来自Facebook的帖子使用Rails,Heroku和Koala中的实时更新

fuz*_*lej 5 facebook real-time heroku ruby-on-rails-3

这个问题是Facebook的扩展版本实时更新不会调用我们的服务器,这似乎已经死了.另外,使用Koala实时更新Heroku上的内部服务器错误没有帮助,因为我正在从heroku控制台订阅pjaspers建议.

我有一个应用程序(ruby 1.9.2p290Rails 3.1.3)连接到Facebook以从当前用户获取数据.考拉宝石(v1.2.1)一切正常,但我每次用户登录时都会轮询fb服务器.我想使用facebook实时更新,我已阅读以下内容:

我已经在测试模式下设置了系统并成功部署到了heroku.我可以订阅用户对象,我得到了我的服务器的GET请求,但是没有收到来自Facebook的更新信息的POST.如果我手动向我的服务器发出POST,一切正常.

更多信息:routes.rb

  get '/realtime' => 'realtime#verify'
  post '/realtime' => 'realtime#change'
Run Code Online (Sandbox Code Playgroud)

发电

      realtime GET  /realtime(.:format) {:controller=>"realtime", :action=>"verify"}
               POST /realtime(.:format) {:controller=>"realtime", :action=>"change"}
Run Code Online (Sandbox Code Playgroud)

控制器(模拟版本,仅测试它是否正常工作):

class RealtimeController < ApplicationController
  def verify
    render :text => params["hub.challenge"]
  end

  def change
    puts params.inspect
    render :nothing => true
  end
end
Run Code Online (Sandbox Code Playgroud)

来自heroku控制台的订阅:

irb(main):004:0> @updates = Koala::Facebook::RealtimeUpdates.new(:app_id => ENV['FACEBOOK_APP_ID'], :secret => ENV['FACEBOOK_APP_SECRET'])
=> #<Koala::Facebook::RealtimeUpdates:0x00000004f5bca8 @app_id="XXXXXXX", @app_access_token="XXXXXXX", @secret="XXXXXXX", @graph_api=#<Koala::Facebook::API:0x00000004a8d7a8 @access_token="XXXXXXX">>

irb(main):005:0> @updates.list_subscriptions
=> [{"object"=>"user", "callback_url"=>"http://blah-blah-0000.herokuapp.com/realtime", "fields"=>["education", "email", "friends", "name", "website", "work"], "active"=>true}]
Run Code Online (Sandbox Code Playgroud)

我不知道下一步该做什么......

  • 也许我没有触发正确的变化事件?
  • 如何查看我的应用程序的用户列表?(现在它是一个测试应用程序,唯一的用户就是我)
  • 有这种问题的人吗?
  • 代码中有什么问题吗?
  • Facebook下降了吗?这是互联网的终结吗?

感谢您的帮助 :)

ejl*_*in1 10

您需要通过质询响应来响应GET请求.我对POST和GET请求都有相同的路由,并使用以下代码:

路线:

match "facebook/subscription", :controller => :facebook, :action => :subscription, :as => 'facebook_subscription', :via => [:get,:post]
Run Code Online (Sandbox Code Playgroud)

控制器:

  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"
        case params['object']
        # Do logic here...
        render :text => 'Thanks for the update.'
      end
    end
  end
Run Code Online (Sandbox Code Playgroud)

这应该让你去做事情...注意,为了订阅我使用这个:

@access_token ||= Koala::Facebook::OAuth.new(FACEBOOK_API_KEY,FACEBOOK_API_SECRET).get_app_access_token
@realtime = Koala::Facebook::RealtimeUpdates.new(:app_id => FACEBOOK_API_KEY, :app_access_token => @access_token)
@realtime.subscribe('user', 'first_name,uid,etc...', facebook_subscription_url,'SOME_TOKEN_HERE')
Run Code Online (Sandbox Code Playgroud)

我认为关键是你正确回应Facebook的GET请求.他们使用此功能验证他们在发送有关其用户的机密信息之前是否正在联系正确的服务器.

此外 - 我已经看了一段时间,但是如果我没记错的话,我似乎记得在回调网址中除了默认协议端口规范之外还有任何问题.例如:http://www.something.com : 8080/ subscription不起作用 - 它必须是http://www.something.com/subscription