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

时间:2011-12-02 12:38:43

标签: ruby-on-rails-3 facebook heroku real-time

这个问题是Facebook Real-time updated does not call our servers的扩展版本,似乎已经死了。另外,Realtime updates internal server error on Heroku using Koala没有帮助,因为我是从 pjaspers 建议的heroku控制台订阅的。

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

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

更多信息: 的routes.rb

  get '/realtime' => 'realtime#verify'
  post '/realtime' => 'realtime#change'

生成

      realtime GET  /realtime(.:format) {:controller=>"realtime", :action=>"verify"}
               POST /realtime(.:format) {:controller=>"realtime", :action=>"change"}

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

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

  def change
    puts params.inspect
    render :nothing => true
  end
end

来自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}]

我不知道接下来要做什么......

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

感谢您的帮助:)

3 个答案:

答案 0 :(得分:10)

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

路线:

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

控制器:

  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

这应该让你顺其自然...注意,为了订阅我正在使用它:

@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')

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

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

答案 1 :(得分:3)

不确定您是否可以这样做,但请确保您有权访问对象 - 用户,权限,页面属性(位置,电子邮件等)

在我的情况下,我试图收到位置属性更改的通知,而我的应用不需要 user_location 权限。对于 用户 对象,请查看此页面中的字段部分https://developers.facebook.com/docs/reference/api/user/

答案 2 :(得分:1)

Facebook知道你的申请在哪里吗?它是否有可以解析的URL?