fuz*_*lej 5 facebook real-time heroku ruby-on-rails-3
这个问题是Facebook的扩展版本实时更新不会调用我们的服务器,这似乎已经死了.另外,使用Koala实时更新Heroku上的内部服务器错误没有帮助,因为我正在从heroku控制台订阅pjaspers建议.
我有一个应用程序(ruby 1.9.2p290和Rails 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)
我不知道下一步该做什么......
感谢您的帮助 :)
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
| 归档时间: |
|
| 查看次数: |
1967 次 |
| 最近记录: |