plurk 2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/plurk.rb +392 -0
  2. metadata +62 -0
@@ -0,0 +1,392 @@
1
+ require 'rubygems'
2
+ require 'cgi'
3
+ require 'net/http'
4
+ require 'net/https'
5
+ require 'json'
6
+
7
+
8
+ module Plurk
9
+ DOMAIN = "www.plurk.com"
10
+ ENDPOINTS = {
11
+ :register => {:path => "/API/Users/register", :login_required => false, :required_params => [:nick_name, :full_name, :password, :gender, :date_of_birth, :email]},
12
+ :login => {:path => "/API/Users/login", :login_required => false},
13
+ :logout => {:path => "/API/Users/logout", :login_required => false},
14
+ :update_profile => {:path => "/API/Users/update", :login_required => true, :required_params => [:current_password]},
15
+ :update_picture => {:path => "/API/Users/updatePicture", :login_required => true, :required_params => [:profile_image]},
16
+ :get_own_profile => {:path => "/API/Profile/getOwnProfile", :login_required => true},
17
+ :get_public_profile => {:path => "/API/Profile/getPublicProfile", :login_required => false, :required_params => [:user_id]},
18
+ :get_polled_plurks => {:path => "/API/Polling/getPlurks", :login_required => true},
19
+ :get_polled_unread_count => {:path => "/API/Polling/getUnreadCount", :login_required => true},
20
+ :get_plurk => {:path => "/API/Timeline/getPlurk", :login_required => true, :required_params => [:plurk_id]},
21
+ :get_plurks => {:path => "/API/Timeline/getPlurks", :login_required => true},
22
+ :get_unread_plurks => {:path => "/API/Timeline/getUnreadPlurks", :login_required => true},
23
+ :plurk_add => {:path => "/API/Timeline/plurkAdd", :login_required => true, :required_params => [:content, :qualifier]},
24
+ :plurk_delete => {:path => "/API/Timeline/plurkDelete", :login_required => true, :required_params => [:plurk_id]},
25
+ :plurk_edit => {:path => "/API/Timeline/plurkEdit", :login_required => true, :required_params => [:plurk_id, :content]},
26
+ :mute_plurks => {:path => "/API/Timeline/mutePlurks", :login_required => true, :required_params => [:ids]},
27
+ :unmute_plurks => {:path => "/API/Timeline/unmutePlurks", :login_required => true, :required_params => [:ids]},
28
+ :mark_as_read => {:path => "/API/Timeline/markAsRead", :login_required => true, :required_params => [:ids]},
29
+ :upload_picture => {:path => "/API/Timeline/uploadPicture", :login_required => true, :required_params => [:image]},
30
+ :get_responses => {:path => "/API/Responses/get", :login_required => false, :required_params => [:plurk_id, :from_response]},
31
+ :add_response => {:path => "/API/Responses/responseAdd", :login_required => true, :required_params => [:plurk_id, :content, :qualifier]},
32
+ :delete_response => {:path => "/API/Responses/responseDelete", :login_required => true, :required_params => [:plurk_id, :response_id]},
33
+ :get_friends_by_offset => {:path => "/API/FriendsFans/getFriendsByOffset", :login_required => false, :required_params => [:user_id]},
34
+ :get_fans_by_offset => {:path => "/API/FriendsFans/getFansByOffset", :login_required => false, :required_params => [:user_id]},
35
+ :get_following_by_offset => {:path => "/API/FriendsFans/getFollowingByOffset", :login_required => true},
36
+ :become_friend => {:path => "/API/FriendsFans/becomeFriend", :login_required => true, :required_params => [:friend_id]},
37
+ :remove_as_friend => {:path => "/API/FriendsFans/removeAsFriend", :login_required => true, :required_params => [:friend_id]},
38
+ :become_fan => {:path => "/API/FriendsFans/becomeFan", :login_required => true, :required_params => [:fan_id]},
39
+ :set_following => {:path => "/API/FriendsFans/setFollowing", :login_required => true, :required_params => [:user_id, :follow]},
40
+ :get_completion => {:path => "/API/FriendsFans/getCompletion", :login_required => true},
41
+ :active_alerts => {:path => "/API/Alerts/getActive", :login_required => true},
42
+ :alert_history => {:path => "/API/Alerts/getHistory", :login_required => true},
43
+ :add_as_fan => {:path => "/API/Alerts/addAsFan", :login_required => true, :required_params => [:user_id]},
44
+ :add_all_as_fan => {:path => "/API/Alerts/addAllAsFan", :login_required => true},
45
+ :add_all_as_friends => {:path => "/API/Alerts/addAllAsFriend", :login_required => true},
46
+ :add_as_friend => {:path => "/API/Alerts/addAsFriend", :login_required => true, :required_params => [:user_id]},
47
+ :deny_friendship => {:path => "/API/Alerts/denyFriendship", :login_required => true, :required_params => [:user_id]},
48
+ :remove_notification => {:path => "/API/Alerts/removeNotification", :login_required => true, :required_params => [:user_id]},
49
+ :search_plurks => {:path => "/API/PlurkSearch/search", :login_required => false, :required_params => [:query]},
50
+ :search_users => {:path => "/API/UserSearch/search", :login_required => false, :required_params => [:query]},
51
+ :get_emoticons => {:path => "/API/Emoticons/get", :login_required => false},
52
+ :get_blocked_users => {:path => "/API/Blocks/get", :login_required => true},
53
+ :block_user => {:path => "/API/Blocks/block", :login_required => true, :required_params => [:user_id]},
54
+ :unblock_user => {:path => "/API/Blocks/unblock", :login_required => true, :required_params => [:user_id]},
55
+ :get_cliques => {:path => "/API/Cliques/getCliques", :login_required => true},
56
+ :get_clique => {:path => "/API/Cliques/getClique", :login_required => true, :required_params => [:clique_name]},
57
+ :create_clique => {:path => "/API/Cliques/createClique", :login_required => true, :required_params => [:clique_name]},
58
+ :rename_clique => {:path => "/API/Cliques/renameClique", :login_required => true, :required_params => [:clique_name, :new_name]},
59
+ :clique_add => {:path => "/API/Cliques/add", :login_required => true, :required_params => [:clique_name, :user_id]},
60
+ :clique_remove => {:path => "/API/Cliques/remove", :login_required => true, :required_params => [:clique_name]}
61
+ }
62
+
63
+ class Client
64
+ attr_accessor :cookie, :logged_in, :api_key
65
+
66
+ # params: username, password
67
+ def login(params={})
68
+ send_secure(:login, params)
69
+ end
70
+
71
+ def logout
72
+ send_request(:logout)
73
+ @cookie = ""
74
+ @logged_in = false
75
+ end
76
+
77
+ # params: nick_name, fulle_name, password, gender, date_of_birth, email
78
+ def register(params={})
79
+ raise "Must be logged out to register" if logged_in?
80
+ send_secure(:register, params)
81
+ end
82
+
83
+ # params: current_password
84
+ def update_profile(params={})
85
+ send_secure(:update_profile, params)
86
+ end
87
+
88
+ # params: attachment[name]=profile_image, attachment[file]
89
+ def update_picture(params={})
90
+ file_upload(:update_picture, params)
91
+ end
92
+
93
+ # params: none
94
+ def get_own_profile
95
+ send_request(:get_own_profile)
96
+ end
97
+
98
+ # params: user_id
99
+ def get_public_profile(params={})
100
+ send_request(:get_public_profile, params)
101
+ end
102
+
103
+ # get plurks newer than :offset
104
+ # offset format: 2010-01-18T20:30:25
105
+ def get_polled_plurks(params={})
106
+ send_request(:get_polled_plurks, params)
107
+ end
108
+
109
+ def get_polled_unread_count
110
+ send_request(:get_polled_unread_count)
111
+ end
112
+
113
+ # params: plurk_id
114
+ def get_plurk(params={})
115
+ send_request(:get_plurk, params)
116
+ end
117
+
118
+
119
+ def get_plurks(params={})
120
+ send_request(:get_plurks, params)
121
+ end
122
+
123
+ def get_unread_plurks(params={})
124
+ send_request(:get_unread_plurks, params)
125
+ end
126
+
127
+ # params: content, qualifier
128
+ def plurk_add(params={})
129
+ send_request(:plurk_add, params)
130
+ end
131
+
132
+ # params: plurk_id
133
+ def plurk_delete(params={})
134
+ send_request(:plurk_delete, params)
135
+ end
136
+
137
+ # params: plurk_id, content
138
+ def plurk_edit(params={})
139
+ send_request(:plurk_edit, params)
140
+ end
141
+
142
+ # params: ids
143
+ def mute_plurks(params={})
144
+ send_request(:mute_plurks, {:ids => params[:ids].to_json})
145
+ end
146
+
147
+ # params: ids
148
+ def unmute_plurks(params={})
149
+ send_request(:unmute_plurks, {:ids => params[:ids].to_json})
150
+ end
151
+
152
+ # params: ids
153
+ def mark_as_read(params={})
154
+ send_request(:mark_as_read, {:ids => params[:ids].to_json})
155
+ end
156
+
157
+ # params: attachment[name]=image, attachment[file]
158
+ def upload_picture(params={})
159
+ file_upload(:upload_picture, params)
160
+ end
161
+
162
+ # params: plurk_id, from_response
163
+ def get_responses(params={})
164
+ send_request(:get_responses, params)
165
+ end
166
+
167
+ # params: plurk_id, content, qualifier
168
+ def add_response(params={})
169
+ send_request(:add_response, params)
170
+ end
171
+
172
+ # params: plurk_id, response_id
173
+ def delete_response(params={})
174
+ send_request(:delete_response, params)
175
+ end
176
+
177
+ # params: user_id
178
+ def get_friends_by_offset(params={})
179
+ send_request(:get_friends_by_offset, params)
180
+ end
181
+
182
+ # params: user_id
183
+ def get_fans_by_offset(params={})
184
+ send_request(:get_fans_by_offset, params)
185
+ end
186
+
187
+ # params:
188
+ def get_following_by_offset(params={})
189
+ send_request(:get_following_by_offset, params)
190
+ end
191
+
192
+ # params: friend_id
193
+ def become_friend(params={})
194
+ send_request(:become_friend, params)
195
+ end
196
+
197
+ # params: friend_id
198
+ def remove_as_friend(params)
199
+ send_request(:remove_as_friend, params)
200
+ end
201
+
202
+ # params: fan_id
203
+ def become_fan(params={})
204
+ send_request(:become_fan, params)
205
+ end
206
+
207
+ # params: user_id, follow
208
+ def set_following(params={})
209
+ send_request(:set_following, params)
210
+ end
211
+
212
+ # params:
213
+ def get_completion
214
+ send_request(:get_completion)
215
+ end
216
+
217
+ def active_alerts
218
+ send_request(:active_alerts)
219
+ end
220
+
221
+ def alert_history
222
+ send_request(:alert_history)
223
+ end
224
+
225
+ # params: user_id
226
+ def add_as_fan(params={})
227
+ send_request(:add_as_fan, params)
228
+ end
229
+
230
+ def add_all_as_fan
231
+ send_request(:add_all_as_fan)
232
+ end
233
+
234
+ def add_all_as_friends
235
+ send_request(:add_all_as_friends)
236
+ end
237
+
238
+ # params: user_id
239
+ def add_as_friend(params={})
240
+ send_request(:add_as_friend, params)
241
+ end
242
+
243
+ # params: user_id
244
+ def deny_friendship(params={})
245
+ send_request(:deny_friendship, params)
246
+ end
247
+
248
+ # params: user_id
249
+ def remove_notification(params={})
250
+ send_request(:remove_notification, params)
251
+ end
252
+
253
+ # params: query
254
+ def search_plurks(params={})
255
+ send_request(:search_plurks, params)
256
+ end
257
+
258
+ # params: query
259
+ def search_users(params={})
260
+ send_request(:search_users, params)
261
+ end
262
+
263
+ # params
264
+ def get_emoticons
265
+ send_request(:get_emoticons)
266
+ end
267
+
268
+ def get_blocked_users
269
+ send_request(:get_blocked_users)
270
+ end
271
+
272
+ # params: user_id
273
+ def block_user(params={})
274
+ send_request(:block_user, params)
275
+ end
276
+
277
+ # params: user_id
278
+ def unblock_usre(params={})
279
+ send_request(:unblock_user, params)
280
+ end
281
+
282
+ def get_cliques
283
+ send_request(:get_cliques)
284
+ end
285
+
286
+ # params: clique_name
287
+ def get_clique(params={})
288
+ send_request(:get_clique, params)
289
+ end
290
+
291
+ # params: clique_name
292
+ def create_clique(params={})
293
+ send_request(:create_clique, params)
294
+ end
295
+
296
+ # params: clique_name, new_name
297
+ def rename_clique(params={})
298
+ send_request(:rename_clique, params)
299
+ end
300
+
301
+ # params: clique_name, user_id
302
+ def clique_add(params={})
303
+ send_request(:clique_add, params)
304
+ end
305
+
306
+ # params: clique_name, user_id
307
+ def clique_remove(params={})
308
+ send_request(:clique_remove, params)
309
+ end
310
+
311
+ def initialize(api_key)
312
+ @cookie = ""
313
+ @api_key = api_key
314
+ end
315
+
316
+ def logged_in?
317
+ defined?(@logged_in) && @logged_in
318
+ end
319
+
320
+ private
321
+ def send_request(endpoint, params={}, headers={})
322
+ raise LoginRequired, "Requires Login" if ENDPOINTS[endpoint][:login_required] && !logged_in?
323
+
324
+ http = Net::HTTP.new(DOMAIN, 80)
325
+ headers.merge!({"Cookie" => @cookie}) if logged_in?
326
+ params.merge!({"api_key" => @api_key})
327
+ params = Hash[*params.collect{|k,v| [k.to_s, v]}.flatten]
328
+ request = Net::HTTP::Post.new(ENDPOINTS[endpoint][:path], headers)
329
+ request.set_form_data(params)
330
+ response = http.request(request)
331
+ @cookie = response["set-cookie"] || @cookie
332
+ JSON.parse(response.body)
333
+ end
334
+
335
+ def send_secure(endpoint, params={}, headers={})
336
+ raise LoginRequired, "Requires Login" if ENDPOINTS[endpoint][:login_required] && !logged_in?
337
+
338
+ http = Net::HTTP.new(DOMAIN, 443)
339
+ http.use_ssl = true
340
+ headers.merge!({"Cookie" => @cookie}) if logged_in?
341
+ params.merge!({"api_key" => @api_key})
342
+ params = Hash[*params.collect{|k,v| [k.to_s, v]}.flatten]
343
+ request = Net::HTTP::Post.new(ENDPOINTS[endpoint][:path], headers)
344
+ request.set_form_data(params)
345
+ response = http.request(request)
346
+ @cookie = response["set-cookie"] || @cookie
347
+ @logged_in = true if endpoint == :login && response.code.to_i == 200
348
+ JSON.parse(response.body)
349
+ end
350
+
351
+ def file_upload(endpoint, params={}, headers={})
352
+ raise LoginRequired, "Requires Login" if ENDPOINTS[endpoint][:login_required] && !logged_in?
353
+ http = Net::HTTP.new(DOMAIN, 80)
354
+ headers.merge!({"Cookie" => @cookie}) if logged_in?
355
+ request = Net::HTTP::Post.new(ENDPOINTS[endpoint][:path], headers)
356
+ request = construct_body(request, params)
357
+ response = http.request(request)
358
+ @cookie = response["set-cookie"] || @cookie
359
+ JSON.parse(response.body)
360
+ end
361
+
362
+ # stolen from http://boonedocks.net/mike/archives/162-Determining-Image-File-Types-in-Ruby.html
363
+ def image_type(file)
364
+ case IO.read(file, 10)
365
+ when /^GIF8/: 'image/gif'
366
+ when /^\x89PNG/: 'image/png'
367
+ when /^\xff\xd8\xff\xe0\x00\x10JFIF/: 'image/jpeg'
368
+ when /^\xff\xd8\xff\xe1(.*){2}Exif/: 'image/jpeg'
369
+ else 'application/octet-stream'
370
+ end
371
+ end
372
+
373
+ def construct_body(request, params)
374
+ boundary = "plurkAABBZ012A"
375
+ body = []
376
+ body << "--#{boundary}\r\n"
377
+ body << "Content-Disposition: file; name=\"#{params[:attachment][:name]}\"; filename=\"#{File.basename(params[:attachment][:file])}\"\r\n"
378
+ body << "Content-Type: #{image_type(params[:attachment][:file])}\r\n"
379
+ body << "\r\n"
380
+ body << File.read(params[:attachment][:file])
381
+ body << "\r\n--#{boundary}\r\n"
382
+ body << "Content-Disposition: form-data; name=\"api_key\"\r\n"
383
+ body << "\r\n"
384
+ body << "#{@api_key}\r\n"
385
+ body << "--#{boundary}--\r\n"
386
+ request.body = body.join
387
+ request["Content-Type"] = "multipart/form-data; boundary=#{boundary}"
388
+ request
389
+ end
390
+ end
391
+ class LoginRequired < Exception; end
392
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: plurk
3
+ version: !ruby/object:Gem::Version
4
+ version: "2.0"
5
+ platform: ruby
6
+ authors:
7
+ - kates
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-01-18 00:00:00 +08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: An unofficial ruby Plurk client.
26
+ email: katesgasis@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files: []
32
+
33
+ files:
34
+ - lib/plurk.rb
35
+ has_rdoc: false
36
+ homepage: http://github.com/kates/plurk
37
+ post_install_message:
38
+ rdoc_options: []
39
+
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ version:
54
+ requirements: []
55
+
56
+ rubyforge_project:
57
+ rubygems_version: 1.3.1
58
+ signing_key:
59
+ specification_version: 2
60
+ summary: A Plurk ruby client
61
+ test_files: []
62
+