2

希望你能提供帮助,我有点不知所措......我正在开发一个 Rails 应用程序并运行 Koala 以连接 Facebook Graph API。我想维护正在使用我的应用程序的用户朋友的最新列表,因此我一直在尝试实现 Koala gem 的实时更新功能。我的应用程序部署在 Heroku 上,我正在使用 Redis-to-Go 运行 Resque 来管理来自 Facebook 的调用......不幸的是,即使我对 Facebook 服务器的测试 ping 都返回 true,我似乎也没有收到任何消息. 这是我正在使用的代码:

Realtime Controller:

 class RealtimeController < ApplicationController
 skip_before_filter :logged_in_check

  layout nil
  VERIFY_TOKEN = "purple-rain"

   def create
    Friendship.real_time_update!(params)
    render :text => 'success'
  end

  def index
    Rails.logger.info("RealTimeController verification")
    render :text=>Koala::Facebook::RealtimeUpdates.meet_challenge(params, VERIFY_TOKEN)
  end

end




Friendship Controller:

class Friendship < ActiveRecord::Base
  attr_accessible :friend_id, :user_id

   belongs_to :users, :foreign_key => "user_id"
   belongs_to :friends_ids, :class_name => "users", :foreign_key => "friend_id"

 def self.get_friends(user)
    @facebook ||= Koala::Facebook::API.new(user.oauth_token)
    @friends =  @facebook.get_connection(user.fbid, "friends")

    @friends.each do |friend|

      if @friend = User.find_by_fbid(friend["id"])

         friendship = Friendship.find_or_create_by_user_id_and_friend_id!(user.id,         
                      @friend.id)

       end
    end
  end

  def self.real_time_update!(payload)
    RealtimeUpdate.new(payload).enqueue_updates!
  end

     class RealtimeUpdate < Struct.new(:payload)


    def enqueue_updates!
      remove_duplicate_ids.each do |entry|
        if (user = User.find_by_uid(entry['uid']).try(:user))
          Resque.enqueue(Resque::Job::UpdateFacebookFriends, user.id, 
                         :since=>entry['time'])
        end
      end
    end

    protected

    def remove_duplicate_ids
      payload['entry'].each_with_object({}) do |entry, hash|
        hash[entry['uid']] ||= [] << entry
      end.values.collect { |update_payloads| update_payloads.min { |entry1, entry2|     
      entry1['time']<=>entry2['time'] } }
    end


  end

end

重新工作

 class Resque::Job::UpdateFacebookFriends

  @queue        = "facebook_friends"

   def self.perform(uid, opts={})
    ::Timeout.timeout(1800) do
      Friendship.get_friends!(User.find_by_fbid(uid))
    end
  end

end

很高兴提供我能提供的任何其他信息!!!

提前致谢!

4

1 回答 1

0

确保您read_friendlists在 rails 配置中指定了权限:

provider :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_APP_SECRET'], :scope => 'read_friendlists, friends_location'

请使用功能get_connections

@facebook ||= Koala::Facebook::API.new user.oauth_token
@friends = @facebook.get_connection user.fbid, :friends
于 2013-11-23T10:39:47.883 回答