renren2 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,20 @@
1
+ Copyright 2011 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,81 @@
1
+ = Renren2
2
+
3
+ A Ruby wrapper for Renren API(OAuth2).It is based on {OAuth2 gem}[https://github.com/intridea/oauth2], thanks for his hard-working.I have wrapped most of the APIs Renren defined.
4
+
5
+ == Installation
6
+
7
+ gem install renren2
8
+
9
+ == Usage Examples
10
+
11
+ Config your api_key, api_secret and redrect_uri somewhere like development.rb.
12
+
13
+ Renren2::Config.api_key = "1234567890"
14
+ Renren2::Config.api_secret = "somethinglooksstrageandhardtoremember"
15
+ Renren2::Config.redirect_uri = "http://www.example.com/callback"
16
+
17
+ Ok, now you are ready to enjoy it. Renren has provided several ways to get your access token, and you can easily get it using Renren2.
18
+
19
+ 1.The Authorization Code strategy with response_type set to code
20
+
21
+ # get authorize_url
22
+ client = Renren2::Client.new
23
+ client.auth_code.authorize_url
24
+ # => "https://graph.renren.com/oauth/authorize?response_type=code&client_id=1234567890&redirect_uri=http%3A%2F%2Fwww.example.com%2fcallback"
25
+
26
+ # get token using authorization_code
27
+ # Renren2::Client.from_code is a shortcut for client.auth_code.get_token("authorization_code_value")
28
+ client = Renren2::Client.from_code("authorization_code_value")
29
+
30
+ 2.The Authorization Code strategy with response_type set to token
31
+
32
+ # get authorize_url with response_type set to token
33
+ client = Renren::Client.new
34
+ client.auth_code.authorize_url(:response_type => "token")
35
+ # => "https://graph.renren.com/oauth/authorize?response_type=token&client_id=1234567890&redirect_uri=http%3A%2F%2Fwww.example.com%2fcallback"
36
+
37
+ # get token from callback hash like this /callback#access_token=6874dd3766b35536abcb76a9e3a57867&expires_in=2594445&scope=photo_upload+send_invitation
38
+ # note that the access_token is different with renren defined, just for demonstration.
39
+ client = Renren2::Client.from_hash(:access_token => "6874dd3766b35536abcb76a9e3a57867", :expires_in => 86400)
40
+
41
+ 3.The Resource Owner Password Credentials strategy
42
+
43
+ # get token with user's password
44
+ client = Renren::Client.new
45
+ client.password.get_token('username', 'password')
46
+
47
+ 4.Refresh your token
48
+
49
+ Note that you could refresh your token only when you can get the refresh_token.
50
+
51
+
52
+ client.refresh!
53
+
54
+ You can check if you are authorized by
55
+
56
+ client.is_authorized?
57
+ # => true
58
+
59
+ If you are authorized, then you can do whatever you want now.
60
+
61
+ response = client.users.get_logged_in_user
62
+ # => #<OAuth2::Response:: ...>
63
+
64
+ response.parsed
65
+ # => {"uid"=>1234567890}
66
+
67
+
68
+ == API
69
+
70
+ You can find them in /lib/renren2/interface/.Note that all methods follow the patten of
71
+
72
+ {resource}.{the_rest_path_joined_by_underline}(required_params, opts={})
73
+
74
+ So {friends.getSameFriends}[http://wiki.dev.renren.com/wiki/Friends.getSameFriends] will turn to
75
+
76
+ friends.get_same_friends(uid1, uid2, opts={})
77
+
78
+
79
+ == Copyright
80
+
81
+ Copyright (c) 2011 Acenqiu. See LICENSE for details.
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'Renren2'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+
24
+
25
+ Bundler::GemHelper.install_tasks
26
+
@@ -0,0 +1,20 @@
1
+ require 'renren2/client'
2
+ require 'renren2/config'
3
+ require 'renren2/strategy/auth_code.rb'
4
+ require 'renren2/interface/base'
5
+ require 'renren2/interface/admin'
6
+ require 'renren2/interface/blog'
7
+ require 'renren2/interface/checkins'
8
+ require 'renren2/interface/feed'
9
+ require 'renren2/interface/friends'
10
+ require 'renren2/interface/invitations'
11
+ require 'renren2/interface/like'
12
+ require 'renren2/interface/notifications'
13
+ require 'renren2/interface/pages'
14
+ require 'renren2/interface/pay'
15
+ require 'renren2/interface/photos'
16
+ require 'renren2/interface/places'
17
+ require 'renren2/interface/requests'
18
+ require 'renren2/interface/share'
19
+ require 'renren2/interface/status'
20
+ require 'renren2/interface/users'
@@ -0,0 +1,220 @@
1
+ require 'oauth2'
2
+
3
+ module Renren2
4
+
5
+ # The Renren2::Client class
6
+ class Client < OAuth2::Client
7
+
8
+ attr_reader :redirect_uri
9
+ attr_accessor :token
10
+
11
+ # Initializes a new Client from a authentication_code
12
+ #
13
+ # @param [String] code The Authorization Code value
14
+ # @param [Hash] opts the options to create the client with
15
+ # @option opts [Hash] :connection_opts ({}) Hash of connection options to pass to initialize Faraday with
16
+ # @option opts [FixNum] :max_redirects (5) maximum number of redirects to follow
17
+ # @yield [builder] The Faraday connection builder
18
+ def self.from_code(code, opts={}, &block)
19
+ client = self.new(opts, &block)
20
+ client.auth_code.get_token(code)
21
+
22
+ client
23
+ end
24
+
25
+ # Initializes a new Client from a hash
26
+ #
27
+ # @param [Hash] a Hash contains access_token and expires
28
+ # @param [Hash] opts the options to create the client with
29
+ # @option opts [Hash] :connection_opts ({}) Hash of connection options to pass to initialize Faraday with
30
+ # @option opts [FixNum] :max_redirects (5) maximum number of redirects to follow
31
+ # @yield [builder] The Faraday connection builder
32
+ def self.from_hash(hash, opts={}, &block)
33
+ client = self.new(opts, &block)
34
+ client.get_token_from_hash(hash)
35
+
36
+ client
37
+ end
38
+
39
+ # Initializes a new Client
40
+ #
41
+ # @param [Hash] opts the options to create the client with
42
+ # @option opts [Hash] :connection_opts ({}) Hash of connection options to pass to initialize Faraday with
43
+ # @option opts [FixNum] :max_redirects (5) maximum number of redirects to follow
44
+ # @yield [builder] The Faraday connection builder
45
+ def initialize(opts={}, &block)
46
+ id = Renren2::Config.api_key
47
+ secret = Renren2::Config.api_secret
48
+ @redirect_uri = Renren2::Config.redirect_uri
49
+
50
+ options = {:site => "https://graph.renren.com",
51
+ :authorize_url => "/oauth/authorize",
52
+ :token_url => "/oauth/token",
53
+ :raise_errors => false,
54
+ :ssl => {:verify => false}}.merge(opts)
55
+
56
+ super(id, secret, options, &block)
57
+ end
58
+
59
+ # Whether or not the client is authorized
60
+ #
61
+ # @return [Boolean]
62
+ def is_authorized?
63
+ !!token && !token.expired?
64
+ end
65
+
66
+ # Initializes an AccessToken by making a request to the token endpoint
67
+ #
68
+ # @param [Hash] params a Hash of params for the token endpoint
69
+ # @param [Hash] access token options, to pass to the AccessToken object
70
+ # @return [AccessToken] the initalized AccessToken
71
+ def get_token(params, access_token_opts={})
72
+ params = params.merge(:parse => :json)
73
+ access_token_opts = access_token_opts.merge({:header_format => "OAuth2 %s", :param_name => "oauth_token"})
74
+
75
+ @token = super(params, access_token_opts)
76
+ end
77
+
78
+ # Initializes an AccessToken from a hash
79
+ #
80
+ # @param [Hash] hash a Hash contains access_token and expires
81
+ # @return [AccessToken] the initalized AccessToken
82
+ def get_token_from_hash(hash)
83
+ access_token = hash.delete('access_token') || hash.delete(:access_token) || hash.delete('oauth_token') || hash.delete(:oauth_token)
84
+ opts = {:expires_at => hash.delete("expires") || hash.delete(:expires),
85
+ :header_format => "OAuth2 %s",
86
+ :param_name => "oauth_token"}.merge(hash)
87
+
88
+ @token = OAuth2::AccessToken.new(self, access_token, opts)
89
+ end
90
+
91
+ # Refreshes the current Access Token
92
+ #
93
+ # @return [AccessToken] a new AccessToken
94
+ # @note options should be carried over to the new AccessToken
95
+ def refresh!(params={})
96
+ @token = token.refresh!(params)
97
+ end
98
+
99
+ #
100
+ # Some info
101
+ #
102
+
103
+ def user
104
+ token.params["user"] if token
105
+ end
106
+
107
+ def user_id
108
+ user["id"] if user
109
+ end
110
+
111
+ def scope
112
+ token.params["scope"] if token
113
+ end
114
+
115
+ def include_scope?(scope_name)
116
+ return true
117
+ if token && token.params["scope"]
118
+ token.params["scope"].split.include? scope_name
119
+ else
120
+ false
121
+ end
122
+ end
123
+
124
+ def hash_for_save
125
+ if token
126
+ token.params.merge({"expires_in" => token.expires_in,
127
+ "expires_at" => token.expires_at,
128
+ "refresh_token" => token.refresh_token,
129
+ "access_token" => token.token})
130
+ end
131
+ end
132
+
133
+ #
134
+ # Strategies
135
+ #
136
+
137
+ # The Authorization Code strategy
138
+ #
139
+ # @see http://tools.ietf.org/html/draft-ietf-oauth-v2-15#section-4.1
140
+ def auth_code
141
+ @auth_code ||= Renren2::Strategy::AuthCode.new(self)
142
+ end
143
+
144
+ # The Resource Owner Password Credentials strategy
145
+ #
146
+ # @see http://tools.ietf.org/html/draft-ietf-oauth-v2-15#section-4.3
147
+ def password
148
+ super
149
+ end
150
+
151
+ #
152
+ # APIs
153
+ #
154
+
155
+ def admin
156
+ @admin ||= Renren2::Interface::Admin.new(self)
157
+ end
158
+
159
+ def blog
160
+ @blog ||= Renren2::Interface::Blog.new(self)
161
+ end
162
+
163
+ def checkins
164
+ @checkins ||= Renren2::Interface::Checkins.new(self)
165
+ end
166
+
167
+ def feed
168
+ @feed ||= Renren2::Interface::Feed.new(self)
169
+ end
170
+
171
+ def friends
172
+ @friends ||= Renren2::Interface::Friends.new(self)
173
+ end
174
+
175
+ def invitations
176
+ @invitations ||= Renren2::Interface::Invitations.new(self)
177
+ end
178
+
179
+ def like
180
+ @like ||= Renren2::Interface::Like.new(self)
181
+ end
182
+
183
+ def notifications
184
+ @notifications ||= Renren2::Interface::Notifications.new(self)
185
+ end
186
+
187
+ def pages
188
+ @pages ||= Renren2::Interface::Pages.new(self)
189
+ end
190
+
191
+ def pay
192
+ @pay ||= Renren2::Interface::Pay.new(self)
193
+ end
194
+
195
+ def photos
196
+ @photos ||= Renren2::Interface::Photos.new(self)
197
+ end
198
+
199
+ def places
200
+ @places ||= Renren2::Interface::Places.new(self)
201
+ end
202
+
203
+ def requests
204
+ @requests ||= Renren2::Interface::Requests.new(self)
205
+ end
206
+
207
+ def share
208
+ @share ||= Renren2::Interface::Share.new(self)
209
+ end
210
+
211
+ def status
212
+ @status ||= Renren2::Interface::Status.new(self)
213
+ end
214
+
215
+
216
+ def users
217
+ @users ||= Renren2::Interface::Users.new(self)
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,28 @@
1
+ module Renren2
2
+ module Config
3
+
4
+ def self.api_key=(val)
5
+ @@api_key = val
6
+ end
7
+
8
+ def self.api_key
9
+ @@api_key
10
+ end
11
+
12
+ def self.api_secret=(val)
13
+ @@api_secret = val
14
+ end
15
+
16
+ def self.api_secret
17
+ @@api_secret
18
+ end
19
+
20
+ def self.redirect_uri=(val)
21
+ @@redirect_uri = val
22
+ end
23
+
24
+ def self.redirect_uri
25
+ @@redirect_uri
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+ # test passed: 2011-11-06 14:50:22
3
+ module Renren2
4
+ module Interface
5
+
6
+ # Admin Interface
7
+ #
8
+ # @see http://wiki.dev.renren.com/wiki/API
9
+ class Admin < Base
10
+
11
+ # 得到一个应用当天可以发送的通知和邀请的配额
12
+ #
13
+ # @see http://wiki.dev.renren.com/wiki/Admin.getAllocation
14
+ def get_allocation
15
+ post 'admin.getAllocation'
16
+ end
17
+
18
+ # 对给定的文本进行过滤,返回过滤后的文本,如果不合法,则给出错误信息
19
+ #
20
+ # @param [String] text 需检查的文本内容
21
+ # @param [Hash] opts
22
+ # @option opts [int] :type 过滤的文本类型,1代表纯文本,2代表包含脚本或标签的文本。缺省值为1
23
+ #
24
+ # @see http://wiki.dev.renren.com/wiki/Admin.textFilter
25
+ def text_filter(text, opts={})
26
+ post 'admin.textFilter', :body => {:text => text}.merge(opts)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,54 @@
1
+ module Renren2
2
+ module Interface
3
+
4
+ # The Base class of API
5
+ class Base
6
+ def initialize(client)
7
+ @client = client
8
+ end
9
+
10
+ def check_scope(scope_name)
11
+ unless @client.include_scope? scope_name
12
+ raise "You haven't got the scope " + scope_name
13
+ end
14
+ end
15
+
16
+ def request(verb, path, opts={}, &block)
17
+ unless @client.is_authorized?
18
+ raise "I can't find a valid access_token. Forgot to get it or expired?"
19
+ end
20
+
21
+ # Note that it is a hack here. Renren hasn't started using http://graph.renren.com as its api server, so
22
+ # we still use http://api.renren.com/restserver.do as a temporary solution. And the :path param will act
23
+ # as the :method params in querystring.
24
+ params = {:access_token => @client.token.token,
25
+ :method => path,
26
+ :v => "1.0",
27
+ :format => "JSON"}.merge(opts.delete(:body) || {})
28
+ .merge(opts.delete(:params) || {})
29
+ opts.merge!(:params => params.merge(:sig => compute_sig(params)), :parse => :json)
30
+
31
+ # use the old server
32
+ path = "http://api.renren.com/restserver.do"
33
+
34
+ @client.token.request(verb, path, opts, &block)
35
+ end
36
+
37
+ def get(path, opts={}, &block)
38
+ request(:get, path, opts, &block)
39
+ end
40
+
41
+ def post(path, opts={}, &block)
42
+ request(:post, path, opts, &block)
43
+ end
44
+
45
+ private
46
+
47
+ def compute_sig(params={})
48
+ str = params.collect {|k,v| "#{k}=#{v}"}.sort.join("") + @client.secret
49
+ Digest::MD5.hexdigest(str)
50
+ end
51
+ end
52
+
53
+ end
54
+ end