rixi 0.2.0 → 0.3.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.
- data/VERSION +1 -1
- data/lib/rixi.rb +121 -48
- data/rixi.gemspec +2 -2
- data/sample_safari.rb +3 -1
- metadata +15 -15
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/rixi.rb
CHANGED
@@ -3,12 +3,9 @@ require 'cgi'
|
|
3
3
|
require 'oauth2'
|
4
4
|
require 'json'
|
5
5
|
|
6
|
+
# monkey patch
|
6
7
|
module OAuth2
|
7
8
|
class Client
|
8
|
-
# Initializes an AccessToken by making a request to the token endpoint
|
9
|
-
#
|
10
|
-
# @param [Hash] params a Hash of params for the token endpoint
|
11
|
-
# @return [AccessToken] the initalized AccessToken
|
12
9
|
def get_token(params)
|
13
10
|
opts = { :raise_errors => true, :parse => params.delete(:parse)}
|
14
11
|
if options[:token_method] == :post
|
@@ -19,13 +16,15 @@ module OAuth2
|
|
19
16
|
end
|
20
17
|
response = request(options[:token_method], token_url, opts)
|
21
18
|
raise Error.new(response) unless response.parsed.is_a?(Hash) && response.parsed['access_token']
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
:
|
19
|
+
|
20
|
+
# デフォルトではヘッダーでのAccessToken指定が出来ないため
|
21
|
+
# modeとheader_formatを追加
|
22
|
+
#AccessToken.from_hash(self, response.parsed)
|
23
|
+
response = response.parsed
|
24
|
+
AccessToken.new(self, response.delete("access_token") || response.delete(:access_token),
|
25
|
+
{:mode => :header,
|
26
|
+
:header_format => "OAuth %s"
|
27
|
+
}.merge(response))
|
29
28
|
end
|
30
29
|
end
|
31
30
|
end
|
@@ -40,26 +39,30 @@ class Rixi
|
|
40
39
|
end
|
41
40
|
|
42
41
|
attr_reader :consumer_key, :consumer_secret, :redirect_uri, :token, :client
|
43
|
-
|
42
|
+
|
44
43
|
SITE = 'http://api.mixi-platform.com'
|
45
44
|
AUTH_URL ='https://mixi.jp/connect_authorize.pl'
|
46
45
|
TOKEN_URL ='https://secure.mixi-platform.com/2/token'
|
47
|
-
|
46
|
+
|
48
47
|
def initialize(params = { })
|
49
48
|
if params[:consumer_key] == nil && params[:consumer_secret] == nil
|
50
49
|
raise "Rixi needs a consumer_key or consumer_secret."
|
51
50
|
end
|
52
|
-
|
53
|
-
@consumer_key = params
|
54
|
-
@consumer_secret = params
|
55
|
-
@redirect_uri = params
|
56
|
-
@scope = scope_to_query(params
|
51
|
+
|
52
|
+
@consumer_key = params.delete :consumer_key
|
53
|
+
@consumer_secret = params.delete :consumer_secret
|
54
|
+
@redirect_uri = params.delete :redirect_uri
|
55
|
+
@scope = scope_to_query(params.delete(:scope))
|
56
|
+
|
57
|
+
params.merge!({
|
58
|
+
:site => SITE,
|
59
|
+
:authorize_url => AUTH_URL,
|
60
|
+
:token_url => TOKEN_URL
|
61
|
+
})
|
57
62
|
@client = OAuth2::Client.new(
|
58
63
|
@consumer_key,
|
59
64
|
@consumer_secret,
|
60
|
-
|
61
|
-
:authorize_url => AUTH_URL,
|
62
|
-
:token_url => TOKEN_URL
|
65
|
+
params
|
63
66
|
)
|
64
67
|
end
|
65
68
|
|
@@ -91,7 +94,7 @@ class Rixi
|
|
91
94
|
# 次期バージョンが出来るとするならAPIの種類毎に
|
92
95
|
# モジュールに切り分けて実装したいです。
|
93
96
|
#
|
94
|
-
# 注:%
|
97
|
+
# 注:%o は省略可能なpathを表現するために使ってます
|
95
98
|
# 例えば、友人のつぶやき一覧の取得をするAPIは以下で、
|
96
99
|
# /2/voice/statuses/friends_timeline/[Group-ID]?since_id=[つぶやきのID]
|
97
100
|
# Group-IDはpathにも含まれますが省略可能です
|
@@ -99,13 +102,6 @@ class Rixi
|
|
99
102
|
# 指定するとして、:optional_pathが存在しなければAPIのパスから
|
100
103
|
# 省略することとします。
|
101
104
|
#
|
102
|
-
# 注2:mixiチェック用API /2/share はPOSTメソッドでリクエストする際に、
|
103
|
-
# データをJSON形式で与えるため、未実装です。
|
104
|
-
#
|
105
|
-
# 注3:DiaryAPIもmultipart/form-data形式として投稿しなければならないため
|
106
|
-
# 現状、未実装です
|
107
|
-
#
|
108
|
-
# 注4:画像投稿系のAPIは未対応です
|
109
105
|
#
|
110
106
|
def self.api_settings
|
111
107
|
# method name, path for API endpoints, http method
|
@@ -117,11 +113,12 @@ class Rixi
|
|
117
113
|
show_status /2/voice/statuses/show/%s get
|
118
114
|
show_favorites /2/voice/favorites/show/%s get
|
119
115
|
update_status /2/voice/statuses/update post
|
120
|
-
|
116
|
+
delete_status /2/voice/statuses/destroy/%s post
|
121
117
|
create_replies /2/voice/statuses/replies/create/%s post
|
122
118
|
delete_replies /2/voice/replies/destroy/%s/%s post
|
123
119
|
create_favorite /2/voice/favorites/create/%s post
|
124
120
|
delete_favorite /2/voice/favorites/destory/%s/%s post
|
121
|
+
share /2/share post_json
|
125
122
|
albums /2/photo/albums/%s/@self/%o get
|
126
123
|
recent_album /2/photo/albums/%s/%s get
|
127
124
|
photos_in_album /2/photo/mediaItems/%s/@self/%s/%o get
|
@@ -129,14 +126,26 @@ class Rixi
|
|
129
126
|
comments_album /2/photo/comments/albums/%s/@self/%s get
|
130
127
|
comments_photo /2/photo/comments/mediaItems/%s/@self/%s/%s get
|
131
128
|
favorites_photo /2/phoho/favorites/mediaItems/%s/@self/%s/%s get
|
132
|
-
create_album /2/photo/albums/%s/@self
|
129
|
+
create_album /2/photo/albums/%s/@self post_json
|
133
130
|
delete_album /2/photo/albums/%s/@self/%s delete
|
134
|
-
create_comment_album /2/photo/comments/albums/%s/@self/%s
|
131
|
+
create_comment_album /2/photo/comments/albums/%s/@self/%s post_json
|
135
132
|
delete_comment_album /2/photo/comments/albums/%s/@self/%s/%s delete
|
136
133
|
upload_photo /2/photo/mediaItems/%s/@self/%s post_image
|
137
|
-
|
134
|
+
delete_photo /2/photo/mediaItems/%s/@self/%s/%s delete
|
135
|
+
create_comment_photo /2/photo/comments/mediaItems/%s/@self/%s/%s/ post_json
|
136
|
+
delete_comment_photo /2/photo/comments/mediaItems/%s/@self/%s/%s/ delete
|
138
137
|
create_favorite_photo /2/photo/favorites/mediaItems/%s/@self/%s/%s/ post
|
139
138
|
delete_favorite_photo /2/photo/favorites/mediaItems/%s/@self/%s/%s/ delete
|
139
|
+
spot /2/spots/%s get
|
140
|
+
search_spot /2/search/spots get
|
141
|
+
spots_list /2/spots/%s/@self get
|
142
|
+
create_myspot /2/spots/%s/@self post
|
143
|
+
delete_myspot /2/spots/%s/@self delete
|
144
|
+
get_checkins /2/checkins/%s/%s get
|
145
|
+
get_checkin /2/checkins/%s/@self/%s get
|
146
|
+
checkin /2/checkins/%s post_multipart
|
147
|
+
checkin_with_photo /2/checkins/%s post_multipart
|
148
|
+
diary /2/diary/articles/@me/@self post_multipart
|
140
149
|
messages_inbox /2/messages/%s/@inbox/%o get
|
141
150
|
messages_outbox /2/messages/%s/@outbox/%o get
|
142
151
|
create_message /2/messages/%s/@self/@outbox post
|
@@ -146,7 +155,7 @@ class Rixi
|
|
146
155
|
people_images /2/people/images/%s/@self/%o get
|
147
156
|
create_people_image /2/people/images/%s/@self post
|
148
157
|
set_people_image /2/people/images/%s/@self/%s put
|
149
|
-
|
158
|
+
delete_people_image /2/people/images/%s/@self/%s delete
|
150
159
|
".strip.split("\n").map {|l| l.strip.split(/\s+/)}
|
151
160
|
end
|
152
161
|
|
@@ -163,10 +172,12 @@ class Rixi
|
|
163
172
|
path.sub!("/%o","")
|
164
173
|
end
|
165
174
|
end
|
175
|
+
extend_expire()
|
166
176
|
__send__ http_method, path % args, params
|
167
177
|
end
|
168
178
|
else
|
169
179
|
define_method method_name do |params = { }|
|
180
|
+
extend_expire()
|
170
181
|
__send__ http_method, path, params
|
171
182
|
end
|
172
183
|
end
|
@@ -175,36 +186,59 @@ class Rixi
|
|
175
186
|
# define_methodで定義されたメソッドは最終的に
|
176
187
|
# これらのメソッドを呼ぶ
|
177
188
|
def get(path, params = { })
|
178
|
-
extend_expire()
|
179
189
|
parse_response(@token.get(path, :params => params))
|
180
190
|
end
|
181
191
|
|
182
192
|
def post(path, params = { })
|
183
|
-
extend_expire()
|
184
193
|
parse_response(@token.post(path,:params => params))
|
185
194
|
end
|
186
195
|
|
187
|
-
#
|
196
|
+
# 画像 は params[:image], タイトルは params[:title]で渡す
|
197
|
+
# 画像はバイナリ文字列で渡す
|
188
198
|
def post_image(path, params = { })
|
189
|
-
extend_expire()
|
190
199
|
path += "?title="+ CGI.escape(params[:title]) if params[:title]
|
191
|
-
parse_response(@token.post(path,
|
192
|
-
{
|
200
|
+
parse_response(@token.post(path,{
|
193
201
|
:headers => {
|
194
202
|
:content_type => "image/jpeg",
|
195
203
|
:content_length => params[:image].size.to_s,
|
204
|
+
},:body => params[:image]}))
|
205
|
+
end
|
206
|
+
|
207
|
+
# params[:json]はハッシュで渡して関数内でJSON化する
|
208
|
+
def post_json(path, params = { })
|
209
|
+
parse_response(@token.post(path,{
|
210
|
+
:headers => {
|
211
|
+
:content_type => "application/json; charset=utf-8",
|
212
|
+
:content_length => params[:json].size.to_s
|
213
|
+
},:body => params[:json]}))
|
214
|
+
end
|
215
|
+
|
216
|
+
# JSON形式+写真を投稿することが可能なAPIについて
|
217
|
+
def post_multipart(path, params ={ })
|
218
|
+
if params[:image]
|
219
|
+
now = Time.now.strftime("%Y%m%d%H%M%S")
|
220
|
+
content_type = "multipart/form-data; boundary=boundary#{now}"
|
221
|
+
body = application_json(now,params[:json])
|
222
|
+
body << attach_photos(now,params[:image])
|
223
|
+
body << end_boundary(now)
|
224
|
+
else
|
225
|
+
content_type = "application/json"
|
226
|
+
body = params[:json]
|
227
|
+
end
|
228
|
+
|
229
|
+
parse_response(@token.post(path,{
|
230
|
+
:headers => {
|
231
|
+
:content_type => content_type,
|
232
|
+
:content_length => body.size.to_s
|
196
233
|
},
|
197
|
-
:body
|
198
|
-
}))
|
234
|
+
:body => body}))
|
199
235
|
end
|
200
236
|
|
201
237
|
def delete(path, params = { })
|
202
|
-
|
203
|
-
parse_response(@token.delete(path, :params => params))
|
238
|
+
@token.delete(path, :params => params).response.env[:status].to_s
|
204
239
|
end
|
205
240
|
|
206
241
|
def put(path, params = { })
|
207
|
-
extend_expire()
|
208
242
|
parse_response(@token.put(path, :params => params))
|
209
243
|
end
|
210
244
|
|
@@ -220,14 +254,53 @@ class Rixi
|
|
220
254
|
voice_statuses_update(:statsus => status)
|
221
255
|
end
|
222
256
|
|
223
|
-
def parse_response(
|
224
|
-
res =
|
257
|
+
def parse_response(response)
|
258
|
+
res = response.response.env
|
225
259
|
case res[:status].to_i
|
226
260
|
when 400...600
|
227
|
-
|
261
|
+
puts "API ERROR: status_code=" + res[:status].to_s
|
262
|
+
JSON.parse(res[:body])
|
228
263
|
else
|
229
264
|
JSON.parse(res[:body])
|
230
265
|
end
|
231
266
|
end
|
267
|
+
|
268
|
+
# build request body
|
269
|
+
def application_json(time,json)
|
270
|
+
return <<-"EOF".force_encoding("UTF-8")
|
271
|
+
--boundary#{time}\r
|
272
|
+
Content-Disposition: form-data; name="request"\r
|
273
|
+
Content-Type: application/json\r
|
274
|
+
\r
|
275
|
+
#{json.to_json}\r
|
276
|
+
EOF
|
277
|
+
end
|
278
|
+
|
279
|
+
def attach_photos(time, imgs)
|
280
|
+
if imgs.instance_of?(Array)
|
281
|
+
count = 1
|
282
|
+
else
|
283
|
+
count = ""
|
284
|
+
imgs = [imgs]
|
285
|
+
end
|
286
|
+
|
287
|
+
attach = ""
|
288
|
+
imgs.each do |img|
|
289
|
+
tmp = <<"IMAGE".force_encoding("UTF-8")
|
290
|
+
--boundary#{time}\r
|
291
|
+
Content-Disposition: form-data; name="photo#{count}"; filename="#{time+count.to_s}.jpg"\r
|
292
|
+
Content-Type: image/jpeg\r
|
293
|
+
\r
|
294
|
+
#{img}\r
|
295
|
+
IMAGE
|
296
|
+
count+=1 if count != ""
|
297
|
+
attach << tmp
|
298
|
+
end
|
299
|
+
attach
|
300
|
+
end
|
301
|
+
|
302
|
+
def end_boundary(time)
|
303
|
+
"--boundary#{time}--"
|
304
|
+
end
|
232
305
|
|
233
306
|
end
|
data/rixi.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rixi}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = [%q{ainame }]
|
12
|
-
s.date = %q{2011-08-
|
12
|
+
s.date = %q{2011-08-22}
|
13
13
|
s.description = %q{Rixi is a simply library for mixi graph api in Ruby.}
|
14
14
|
s.email = %q{ainame954@facebook.com}
|
15
15
|
s.extra_rdoc_files = [
|
data/sample_safari.rb
CHANGED
@@ -64,7 +64,9 @@ config = YAML.load_file("setting.yml")
|
|
64
64
|
M = Rixi.new( :consumer_key => config['consumer_key'],
|
65
65
|
:consumer_secret => config['consumer_secret'],
|
66
66
|
:redirect_uri => 'http://0.0.0.0:4567/callback',
|
67
|
-
:scope => scope
|
67
|
+
:scope => scope,
|
68
|
+
:connection_opts => {:proxy => ENV["https_proxy"]},
|
69
|
+
:raise_errors => false)
|
68
70
|
|
69
71
|
browser = Watir::Safari.new
|
70
72
|
browser.goto M.authorized_uri
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rixi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-08-
|
12
|
+
date: 2011-08-22 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: oauth2
|
16
|
-
requirement: &
|
16
|
+
requirement: &70166902590920 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70166902590920
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: json
|
27
|
-
requirement: &
|
27
|
+
requirement: &70166902589980 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70166902589980
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &70166902589100 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 2.3.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70166902589100
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: bundler
|
49
|
-
requirement: &
|
49
|
+
requirement: &70166902588060 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.0.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70166902588060
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: jeweler
|
60
|
-
requirement: &
|
60
|
+
requirement: &70166902587220 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 1.6.4
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70166902587220
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rcov
|
71
|
-
requirement: &
|
71
|
+
requirement: &70166902586280 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70166902586280
|
80
80
|
description: Rixi is a simply library for mixi graph api in Ruby.
|
81
81
|
email: ainame954@facebook.com
|
82
82
|
executables: []
|
@@ -113,7 +113,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
113
113
|
version: '0'
|
114
114
|
segments:
|
115
115
|
- 0
|
116
|
-
hash:
|
116
|
+
hash: -3097028528826085841
|
117
117
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
118
|
none: false
|
119
119
|
requirements:
|