plurk 2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/plurk.rb +392 -0
- metadata +62 -0
data/lib/plurk.rb
ADDED
@@ -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
|
+
|