plurk 2.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.
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
+