unageanu-clickclient_scrap 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/README +1 -0
  2. data/lib/clickclient_scrap.rb +229 -124
  3. metadata +2 -2
data/README CHANGED
@@ -8,6 +8,7 @@
8
8
  - ログイン
9
9
  - ログアウト
10
10
  - レート一覧の取得
11
+ - 指値注文
11
12
 
12
13
  ===注意事項
13
14
  - スクレイピングによるアクセスのため、Webサイトの仕様変更等により
@@ -2,8 +2,7 @@ begin
2
2
  require 'rubygems'
3
3
  rescue LoadError
4
4
  end
5
- require 'httpclient'
6
- require 'rexml/document'
5
+ require 'mechanize'
7
6
  require 'date'
8
7
  require 'kconv'
9
8
 
@@ -16,11 +15,6 @@ require 'kconv'
16
15
  #クリック証券を利用するためのクライアントライブラリです。携帯向けサイトのスクレイピングにより以下の機能を提供します。
17
16
  #- 外為証拠金取引(FX)取引
18
17
  #
19
- #====依存モジュール
20
- #「{httpclient}[http://dev.ctor.org/http-access2]」を利用しています。以下のコマンドを実行してインストールしてください。
21
- #
22
- # gem install httpclient --source http://dev.ctor.org/download/
23
- #
24
18
  #====基本的な使い方
25
19
  #
26
20
  # require 'clickclient'
@@ -29,7 +23,7 @@ require 'kconv'
29
23
  # # c = ClickClient::Client.new https://<プロキシホスト>:<プロキシポート> # プロキシを利用する場合
30
24
  # c.fx_session( "<ユーザー名>", "<パスワード>" ) { | fx_session |
31
25
  # # 通貨ペア一覧取得
32
- # list = fx_session.list_currency_pairs
26
+ # list = fx_session.list_rates
33
27
  # puts list
34
28
  # }
35
29
  #
@@ -42,8 +36,66 @@ module ClickClient
42
36
  # クライアント
43
37
  class Client
44
38
  # ホスト名
45
- DEFAULT_HOST_NAME = "https://sec-sso.click-sec.com/mf"
39
+ DEFAULT_HOST_NAME = "https://sec-sso.click-sec.com/mf/"
46
40
 
41
+ #
42
+ #===コンストラクタ
43
+ #
44
+ #*proxy*:: プロキシホストを利用する場合、そのホスト名とパスを指定します。
45
+ # 例) https://proxyhost.com:80
46
+ #
47
+ def initialize( proxy=nil )
48
+ @client = WWW::Mechanize.new {|c|
49
+ # プロキシ
50
+ if proxy
51
+ uri = URI.parse( proxy )
52
+ c.set_proxy( uri.host, uri.port )
53
+ end
54
+ }
55
+ @client.user_agent_alias = 'Windows IE 7'
56
+ @host_name = DEFAULT_HOST_NAME
57
+ end
58
+
59
+ #ログインし、セッションを開始します。
60
+ #-ブロックを指定した場合、引数としてセッションを指定してブロックを実行します。ブロック実行後、ログアウトします。
61
+ #-そうでない場合、セッションを返却します。この場合、ClickClient::FX::FxSession#logoutを実行しログアウトしてください。
62
+ #
63
+ #戻り値:: ClickClient::FX::FxSession
64
+ def fx_session( userid, password, &block )
65
+ page = @client.get(@host_name)
66
+ ClickClient::Client.error(page) if page.forms.length <= 0
67
+ form = page.forms.first
68
+ form.j_username = userid
69
+ form.j_password = password
70
+ result = @client.submit(form, form.buttons.first)
71
+ if result.body.toutf8 =~ /<META HTTP-EQUIV="REFRESH" CONTENT="0;URL=([^"]*)">/
72
+ result = @client.get($1)
73
+ session = FX::FxSession.new( @client, result.links )
74
+ if block_given?
75
+ begin
76
+ yield session
77
+ ensure
78
+ session.logout
79
+ end
80
+ else
81
+ return session
82
+ end
83
+ else
84
+ ClickClient::Client.error( result )
85
+ end
86
+ end
87
+ def self.error( page )
88
+ msgs = page.body.scan( /<font color="red">([^<]*)</ ).flatten
89
+ error = !msgs.empty? ? msgs.map{|m| m.strip}.join(",") : page.body
90
+ raise "operation failed.detail=#{error}".toutf8
91
+ end
92
+
93
+ #ホスト名
94
+ attr :host_name, true
95
+ end
96
+
97
+ module FX
98
+
47
99
  # 通貨ペア: 米ドル-円
48
100
  USDJPY = :USDJPY
49
101
  # 通貨ペア: ユーロ-円
@@ -79,88 +131,52 @@ module ClickClient
79
131
  SELL = 1
80
132
 
81
133
  # 注文タイプ: 通常
82
- ORDER_TYPE_NORMAL = 0
134
+ ORDER_TYPE_MARKET_ORDER = "00"
135
+ # 注文タイプ: 通常
136
+ ORDER_TYPE_NORMAL = "01"
83
137
  # 注文タイプ: IFD
84
- ORDER_TYPE_IFD = 1
138
+ ORDER_TYPE_IFD = "11"
85
139
  # 注文タイプ: OCO
86
- ORDER_TYPE_OCO = 2
140
+ ORDER_TYPE_OCO = "21"
87
141
  # 注文タイプ: IFD-OCO
88
- ORDER_TYPE_IFD_OCO = 3
89
-
90
-
91
- #
92
- #===コンストラクタ
93
- #
94
- #*proxy*:: プロキシホストを利用する場合、そのホスト名とパスを指定します。
95
- # 例) https://proxyhost.com:80
96
- #
97
- def initialize( proxy=nil )
98
- @client = HTTPClient.new( proxy, "Mozilla/5.0")
99
- #@client.debug_dev=STDOUT
100
- @client.set_cookie_store("cookie.dat")
101
- @host_name = DEFAULT_HOST_NAME
102
- end
142
+ ORDER_TYPE_IFD_OCO = "31"
143
+
144
+ # 執行条件: 成行
145
+ EXECUTION_EXPRESSION_MARKET_ORDER = 0
146
+ # 執行条件: 指値
147
+ EXECUTION_EXPRESSION_LIMIT_ORDER = 1
148
+ # 執行条件: 逆指値
149
+ EXECUTION_EXPRESSION_REVERSE_LIMIT_ORDER = 2
103
150
 
104
- #ログインし、セッションを開始します。
105
- #-ブロックを指定した場合、引数としてセッションを指定してブロックを実行します。ブロック実行後、ログアウトします。
106
- #-そうでない場合、セッションを返却します。この場合、ClickClient::FX::FxSession#logoutを実行しログアウトしてください。
107
- #
108
- #戻り値:: ClickClient::FX::CurrencyPairの配列。
109
- #戻り値:: ClickClient::FX::CurrencyPairの配列。
110
- def fx_session( userid, password, &block )
111
- @client.get("#{@host_name}/" )
112
- result = @client.post_content("#{@host_name}/sso-redirect", {
113
- "j_username"=>userid,
114
- "j_password"=>password,
115
- "LoginForm"=>"ログイン".tosjis,
116
- "s"=>"02",
117
- "p"=>"80"
118
- })
119
- if result.toutf8 =~ /<META HTTP-EQUIV="REFRESH" CONTENT="0;URL=([^"]*)">/
120
- uri = URI.parse( $1 )
121
- base = "#{uri.scheme}://#{uri.host}:#{uri.port}"
122
- result = @client.get_content($1)
123
- commands = result.toutf8.scan( /<a[^>]*?href="([^"]*)"[^>]*>([^<]*)<\/a>/).inject({}) {|r,l|
124
- r[l[1]] = "#{base}#{l[0]}"; r
125
- }
126
- session = FX::FxSession.new( @client, commands )
127
- if block_given?
128
- begin
129
- yield session
130
- ensure
131
- session.logout
132
- end
133
- else
134
- return session
135
- end
136
- else
137
- error = result.toutf8 =~ /<font color="red">([^<]*)</ ? $1.strip : result
138
- raise "login failed.detail=#{error}".toutf8
139
- end
140
- end
151
+ # 有効期限: 当日限り
152
+ EXPIRATION_TYPE_TODAY = 0
153
+ # 有効期限: 週末まで
154
+ EXPIRATION_TYPE_WEEK_END = 1
155
+ # 有効期限: 無期限
156
+ EXPIRATION_TYPE_INFINITY = 2
157
+ # 有効期限: 日付指定
158
+ EXPIRATION_TYPE_SPECIFIED = 3
141
159
 
142
- #ホスト名
143
- attr :host_name, true
144
- end
145
-
146
- module FX
147
160
  #=== FX取引のためのセッションクラス
148
161
  #Client#fx_sessionのブロックの引数として渡されます。詳細はClient#fx_sessionを参照ください。
149
162
  class FxSession
150
163
 
151
- def initialize( client, commands )
164
+ def initialize( client, links )
152
165
  @client = client
153
- @commands = commands
166
+ @links = links
154
167
  end
168
+
155
169
  #レート一覧を取得します。
156
170
  #
157
171
  #戻り値:: 通貨ペアをキーとするClickClient::FX::Rateのハッシュ。
158
172
  def list_rates
159
- result = @client.get_content( @commands["レート一覧(新規注文)"] )
173
+ result = @client.click( @links.find {|i|
174
+ i.attributes["accesskey"] == "1"
175
+ })
160
176
  @swaps = list_swaps unless @swaps
161
177
  reg = />([A-Z]+\/[A-Z]+)<\/a>[^\-\.\d]*?([\d]+\.[\d]+\-[\d]+)/
162
- return result.toutf8.scan( reg ).inject({}) {|r,l|
163
- pair = l[0].gsub( /\//, "" ).to_sym
178
+ return result.body.toutf8.scan( reg ).inject({}) {|r,l|
179
+ pair = to_pair( l[0] )
164
180
  swap = @swaps[pair]
165
181
  rate = FxSession.convert_rate l[1]
166
182
  if ( rate && swap )
@@ -189,10 +205,12 @@ module ClickClient
189
205
  #
190
206
  #戻り値:: 通貨ペアをキーとするClickClient::FX::Swapのハッシュ。
191
207
  def list_swaps
192
- result = @client.get_content( @commands["スワップ/証拠金一覧"] )
208
+ result = @client.click( @links.find {|i|
209
+ i.attributes["accesskey"] == "8"
210
+ })
193
211
  reg = /<dd>([A-Z]+\/[A-Z]+) <font[^>]*>売<\/font>[^\-\d]*?([\-\d]+)[^\-\d]*<font[^>]*>買<\/font>[^\-\d]*([\-\d]+)[^\-\d]*<\/dd>/
194
- return result.toutf8.scan( reg ).inject({}) {|r,l|
195
- pair = l[0].gsub( /\//, "" ).to_sym
212
+ return result.body.toutf8.scan( reg ).inject({}) {|r,l|
213
+ pair = to_pair( l[0] )
196
214
  r[pair] = Swap.new( pair, l[1].to_i, l[2].to_i ); r
197
215
  }
198
216
  end
@@ -200,66 +218,153 @@ module ClickClient
200
218
  #
201
219
  #注文を行います。
202
220
  #
203
- #*currency_pair_code*:: 通貨ペアコード(必須)
204
- #*sell_or_buy*:: 売買区分。ClickClient::FX::BUY,ClickClient::FX::SELLのいずれかを指定します。(必須)
205
- #*unit*:: 取引数量(必須)
206
- #*options*:: 注文のオプション。注文方法に応じて以下の情報を設定できます。
221
+ #currency_pair_code:: 通貨ペアコード(必須)
222
+ #sell_or_buy:: 売買区分。ClickClient::FX::BUY,ClickClient::FX::SELLのいずれかを指定します。(必須)
223
+ #unit:: 取引数量(必須)
224
+ #options:: 注文のオプション。注文方法に応じて以下の情報を設定できます。
225
+ # - <b>成り行き注文</b>
226
+ # - <tt>:slippage</tt> .. スリッページ (オプション)
227
+ # - <tt>:slippage_base_rate</tt> .. スリッページの基準となる取引レート(スリッページが指定された場合、必須。)
207
228
  # - <b>通常注文</b> ※注文レートが設定されていれば通常取引となります。
208
229
  # - <tt>:rate</tt> .. 注文レート(必須)
209
230
  # - <tt>:execution_expression</tt> .. 執行条件。ClickClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須)
210
231
  # - <tt>:expiration_type</tt> .. 有効期限。ClickClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須)
211
232
  # - <tt>:expiration_date</tt> .. 有効期限が「日付指定(ClickClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須)
212
- #<b>戻り値</b>:: ClickClient::FX::OrderResult
233
+ # - <b>OCO注文</b> ※逆指値レートが設定されていればOCO取引となります。
234
+ # - <tt>:rate</tt> .. 注文レート(必須)
235
+ # - <tt>:stop_order_rate</tt> .. 逆指値レート(必須)
236
+ # - <tt>:expiration_type</tt> .. 有効期限。ClickClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須)
237
+ # - <tt>:expiration_date</tt> .. 有効期限が「日付指定(ClickClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須)
238
+ # - <b>IFD注文</b> ※決済取引の指定があればIFD取引となります。
239
+ # - <tt>:rate</tt> .. 注文レート(必須)
240
+ # - <tt>:execution_expression</tt> .. 執行条件。ClickClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須)
241
+ # - <tt>:expiration_type</tt> .. 有効期限。ClickClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須)
242
+ # - <tt>:expiration_date</tt> .. 有効期限が「日付指定(ClickClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須)
243
+ # - <tt>:settle</tt> .. 決済取引の指定。マップで指定します。
244
+ # - <tt>:unit</tt> .. 決済取引の取引数量(必須)
245
+ # - <tt>:sell_or_buy</tt> .. 決済取引の売買区分。ClickClient::FX::BUY,ClickClient::FX::SELLのいずれかを指定します。(必須)
246
+ # - <tt>:rate</tt> .. 決済取引の注文レート(必須)
247
+ # - <tt>:execution_expression</tt> .. 決済取引の執行条件。ClickClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須)
248
+ # - <tt>:expiration_type</tt> .. 決済取引の有効期限。ClickClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須)
249
+ # - <tt>:expiration_date</tt> .. 決済取引の有効期限が「日付指定(ClickClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須)
250
+ # - <b>IFD-OCO注文</b> ※決済取引の指定と逆指値レートの指定があればIFD-OCO取引となります。
251
+ # - <tt>:rate</tt> .. 注文レート(必須)
252
+ # - <tt>:execution_expression</tt> .. 執行条件。ClickClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須)
253
+ # - <tt>:expiration_type</tt> .. 有効期限。ClickClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須)
254
+ # - <tt>:expiration_date</tt> .. 有効期限が「日付指定(ClickClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須)
255
+ # - <tt>:settle</tt> .. 決済取引の指定。マップで指定します。
256
+ # - <tt>:unit</tt> .. 決済取引の取引数量(必須)
257
+ # - <tt>:sell_or_buy</tt> .. 決済取引の売買区分。ClickClient::FX::BUY,ClickClient::FX::SELLのいずれかを指定します。(必須)
258
+ # - <tt>:rate</tt> .. 決済取引の注文レート(必須)
259
+ # - <tt>:stop_order_rate</tt> .. 決済取引の逆指値レート(必須)
260
+ # - <tt>:expiration_type</tt> .. 決済取引の有効期限。ClickClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須)
261
+ # - <tt>:expiration_date</tt> .. 決済取引の有効期限が「日付指定(ClickClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須)
262
+ #戻り値:: ClickClient::FX::OrderResult TODO
213
263
  #
214
264
  def order ( currency_pair_code, sell_or_buy, unit, options={} )
215
- result = @client.get_content( @commands["レート一覧(新規注文)"] )
216
- if result.toutf8 =~ /<form[~>]?*action="([^"]*)"[~>]*>(.*?<select name="P001"[^>]*>(.*)<\/select>.*?<select name="P100"[^>]*>(.*)<\/select>.*)<\/form>)/m
217
- action = $1
218
- p001 = $3
219
- p100 = $4
220
- hidden = $2
221
- # 通貨ペア
222
- pairs = p001.scan( /<option value="([^"]+)">([A-Z]+\/[A-Z]+)/m ).inject({}) {|r,l|
223
- pair = l[1].gsub( /\//, "" ).to_sym
224
- r[pair] = l[0]; r
225
- }
226
- # 取り引き種別
227
- type = p100.scan( /<option value="([^"]+)">([^\s]+)/m ).inject({}) {|r,l|
228
- r[l[1]] = l[0]; r
229
- }
230
- # hidden
231
- params = hidden.scan( /<input type="hidden" name="([^"]+)" value="([^"]+)">/m ).inject({}) {|r,l|
232
- r[l[1]] = l[0]; r
233
- }
265
+
266
+ # 取り引き種別の判別とパラメータチェック
267
+ type = ORDER_TYPE_MARKET_ORDER
268
+ if ( options[:settle] != nil )
269
+ if ( options[:settle][:stop_order_rate] != nil)
270
+ # 逆指値レートと決済取引の指定があればIFD-OCO取引
271
+ raise "options[:settle][:rate] is required." if options[:settle][:rate] == nil
272
+ type = ORDER_TYPE_IFD_OCO
273
+ else
274
+ # 決済取引の指定のみがあればIFD取引
275
+ raise "options[:settle][:rate] is required." if options[:settle][:rate] == nil
276
+ raise "options[:settle][:execution_expression] is required." if options[:settle][:execution_expression] == nil
277
+ type = ORDER_TYPE_IFD
278
+ end
279
+ raise "options[:rate] is required." if options[:rate] == nil
280
+ raise "options[:execution_expression] is required." if options[:execution_expression] == nil
281
+ raise "options[:expiration_type] is required." if options[:expiration_type] == nil
282
+ raise "options[:settle][:rate] is required." if options[:settle][:rate] == nil
283
+ raise "options[:settle][:sell_or_buy] is required." if options[:settle][:sell_or_buy] == nil
284
+ raise "options[:settle][:unit] is required." if options[:settle][:unit] == nil
285
+ raise "options[:settle][:expiration_type] is required." if options[:expiration_type] == nil
286
+ elsif ( options[:rate] != nil )
287
+ if ( options[:stop_order_rate] != nil )
288
+ # 逆指値レートが指定されていればOCO取引
289
+ type = ORDER_TYPE_OCO
290
+ else
291
+ # そうでなければ通常取引
292
+ raise "options[:execution_expression] is required." if options[:execution_expression] == nil
293
+ type = ORDER_TYPE_NORMAL
294
+ end
295
+ raise "options[:expiration_type] is required." if options[:expiration_type] == nil
296
+ else
297
+ # 成り行き
298
+ type = ORDER_TYPE_MARKET_ORDER
299
+ if ( options[:slippage] != nil )
300
+ raise "if you use a slippage, options[:slippage_base_rate] is required." if options[:slippage_base_rate] == nil
301
+ end
302
+ end
303
+ raise "not supported yet." if type != ORDER_TYPE_NORMAL
304
+
305
+ # レート一覧
306
+ result = @client.click( @links.find {|i|
307
+ i.attributes["accesskey"] == "1"
308
+ })
309
+ form = result.forms.first
310
+
311
+ # 通貨ペア
312
+ option = form.fields.find{|f| f.name == "P001" }.options.find {|o|
313
+ to_pair( o.text.strip ) == currency_pair_code
314
+ }
315
+ raise "illegal currency_pair_code. currency_pair_code=#{currency_pair_code.to_s}" unless option
316
+ option.select
317
+
318
+ #注文方式
319
+ form["P100"] = type
320
+
321
+ # 詳細設定画面へ
322
+ result = @client.submit(form)
323
+ form = result.forms.first
324
+ form["P003"] = options[:rate].to_s # レート
325
+ form["P005"] = unit.to_s # 取り引き数量
326
+ form["P002.0"] = sell_or_buy == ClickClient::FX::SELL ? "1" : "0" #売り/買い
327
+
328
+ exp = options[:execution_expression]
329
+ form["P004.0"] = exp == ClickClient::FX::EXECUTION_EXPRESSION_REVERSE_LIMIT_ORDER ? "2" : "1" #指値/逆指値
330
+
331
+ # 有効期限
332
+ case options[:expiration_type]
333
+ when ClickClient::FX::EXPIRATION_TYPE_TODAY
334
+ form["P008"] = "0"
335
+ when ClickClient::FX::EXPIRATION_TYPE_WEEK_END
336
+ form["P008"] = "1"
337
+ when ClickClient::FX::EXPIRATION_TYPE_SPECIFIED
338
+ form["P008"] = "3"
339
+ raise "options[:expiration_date] is required." unless options[:expiration_date]
340
+ form["P009.Y"] = options[:expiration_date].year
341
+ form["P009.M"] = options[:expiration_date].month
342
+ form["P009.D"] = options[:expiration_date].day
343
+ form["P009.h"] = options[:expiration_date].respond_to?(:hour) ? options[:expiration_date].hour : "0"
344
+ else
345
+ form["P008"] = "2"
234
346
  end
235
- # if ( options[:rate] != nil )
236
- # if ( options[:stop_order_rate] != nil )
237
- # # 逆指値レートが指定されていればOCO取引
238
- # path = "/ws/fx/ocoChumon.do"
239
- # body << "&srp=#{options[:rate].to_s}"
240
- # body << "&grp=#{options[:stop_order_rate].to_s}"
241
- # else
242
- # # そうでなければ通常取引
243
- # raise "options[:execution_expression] is required." if options[:execution_expression] == nil
244
- # path = "/ws/fx/tsujoChumon.do"
245
- # body << "&crp=#{options[:rate].to_s}"
246
- # body << "&sjt=#{options[:execution_expression].to_s}"
247
- # end
248
- # raise "options[:expiration_type] is required." if options[:expiration_type] == nil
249
- # body << "&bbt=#{sell_or_buy.to_s}"
250
- # body << "&thn=#{unit.to_s}"
251
- # body << "&dat=#{options[:expiration_type].to_s}"
252
- # body << "&ykd=" << options[:expiration_date].strftime( "%Y%m%d%H" ) if options[:expiration_date] != nil
253
- # end
254
- # result = @client.post( @base_uri + path, body)
255
- # doc = ClickClient.parse( result.content )
256
- # return OrderResult.new( doc.root )
347
+
348
+ # 確認画面へ
349
+ result = @client.submit(form)
350
+ result = @client.submit(result.forms.first)
351
+ #puts result.body.toutf8
352
+ ClickClient::Client.error( result ) unless result.body.toutf8 =~ /注文受付完了/
353
+ # TODO 結果を返す・・・どうするかな。
257
354
  end
258
355
 
259
356
  # ログアウトします。
260
357
  def logout
261
- @client.get_content( @commands["ログアウト"] )
358
+ @client.click( @links.find {|i|
359
+ i.text == "\303\233\302\270\303\236\302\261\302\263\303\204"
360
+ })
262
361
  end
362
+
363
+ private
364
+ # "USD/JPY"を:USDJPYのようなシンボルに変換します。
365
+ def to_pair( str )
366
+ str.gsub( /\//, "" ).to_sym
367
+ end
263
368
  end
264
369
 
265
370
  #=== スワップ
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unageanu-clickclient_scrap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaya Yamauchi
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-02-13 00:00:00 -08:00
12
+ date: 2009-02-25 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15