这个问题是Facebook Real-time updated does not call our servers的扩展版本,似乎已经死了。另外,Realtime updates internal server error on Heroku using Koala没有帮助,因为我是从 pjaspers 建议的heroku控制台订阅的。
我有一个应用程序(ruby 1.9.2p290
和Rails 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}]
我不知道接下来要做什么......
感谢您的帮助:)
答案 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?