weibo_user_agent.rb 4.1KB

    # encoding: utf-8 require "weibo_2" module Agents class WeiboUserAgent < Agent cannot_receive_events! description <<-MD The WeiboUserAgent follows the timeline of a specified Weibo user. It uses this endpoint: http://open.weibo.com/wiki/2/statuses/user_timeline/en You must first set up a Weibo app and generate an `acess_token` to authenticate with. Provide that, along with the `app_key` and `app_secret` for your Weibo app in the options. Specify the `uid` of the Weibo user whose timeline you want to watch. Set `expected_update_period_in_days` to the maximum amount of time that you'd expect to pass between Events being created by this Agent. MD event_description <<-MD Events are the raw JSON provided by the Weibo API. Should look something like: { "created_at": "Tue May 31 17:46:55 +0800 2011", "id": 11488058246, "text": "求关注。", "source": "<a href=\"http://weibo.com\" rel=\"nofollow\">新浪微博</a>", "favorited": false, "truncated": false, "in_reply_to_status_id": "", "in_reply_to_user_id": "", "in_reply_to_screen_name": "", "geo": null, "mid": "5612814510546515491", "reposts_count": 8, "comments_count": 9, "annotations": [], "user": { "id": 1404376560, "screen_name": "zaku", "name": "zaku", "province": "11", "city": "5", "location": "北京 朝阳区", "description": "人生五十年,乃如梦如幻;有生斯有死,壮士复何憾。", "url": "http://blog.sina.com.cn/zaku", "profile_image_url": "http://tp1.sinaimg.cn/1404376560/50/0/1", "domain": "zaku", "gender": "m", "followers_count": 1204, "friends_count": 447, "statuses_count": 2908, "favourites_count": 0, "created_at": "Fri Aug 28 00:00:00 +0800 2009", "following": false, "allow_all_act_msg": false, "remark": "", "geo_enabled": true, "verified": false, "allow_all_comment": true, "avatar_large": "http://tp1.sinaimg.cn/1404376560/180/0/1", "verified_reason": "", "follow_me": false, "online_status": 0, "bi_followers_count": 215 } } MD default_schedule "every_1h" def validate_options unless options[:uid].present? && options[:expected_update_period_in_days].present? && options[:app_key].present? && options[:app_secret].present? && options[:access_token].present? errors.add(:base, "expected_update_period_in_days, uid, app_key, app_secret and access_token are required") end end def working? event_created_within(options[:expected_update_period_in_days]) && !recent_error_logs? end def default_options { :uid => "", :access_token => "---", :app_key => "---", :app_secret => "---", :expected_update_period_in_days => "2" } end def check WeiboOAuth2::Config.api_key = options[:app_key] # WEIBO_APP_KEY WeiboOAuth2::Config.api_secret = options[:app_secret] # WEIBO_APP_SECRET client = WeiboOAuth2::Client.new client.get_token_from_hash :access_token => options[:access_token] since_id = memory[:since_id] || nil opts = {:uid => options[:uid].to_i} opts.merge! :since_id => since_id unless since_id.nil? # http://open.weibo.com/wiki/2/statuses/user_timeline/en resp = client.statuses.user_timeline opts if resp[:statuses] resp[:statuses].each do |status| memory[:since_id] = status.id if !memory[:since_id] || (status.id > memory[:since_id]) create_event :payload => status.as_json end end save! end end end