GMOインターネット証券WebServiceにログイン
GMOインターネット証券 WebServiceにログインするRubyスクリプトです。参照系優先で他の機能もちょっとづつ作っていく所存。
使い方
c = GMO::Client.new # ログインしてブロックを実行しログアウトする。 c.session( "<ユーザーID>", "<パスワード>" ) { puts "success!" }
依存モジュールについて
httpclientを利用しています。
以下のコマンドを実行してインストールしてください。
gem install httpclient --source http://dev.ctor.org/download/
実装
require 'httpclient' require 'rexml/document' # GMO インターネット証券 Webサービスクライアント module GMO class Client HOST = "https://sec-sso.gmo.jp" #HOST = "http://localhost:8000" # テスト用ローカルサーバーの場合 URI_SEQ_1 = HOST + "/webservice/ws-redirect" def initialize( proxy=nil ) @client = HTTPClient.new(proxy) @client.set_cookie_store("cookie.dat") end # ログインしてブロックを実行する。ブロックの実行後ログアウトする。 def session( userId, password, &block ) # sequence 1 result = @client.post(URI_SEQ_1, "u=" << userId ) seq2_uri = result.header["Location"].to_s raise "fail session-1.responce=" << result.content if seq2_uri == nil || seq2_uri.length <= 0 # sequence 2 result = @client.get( seq2_uri ) doc = REXML::Document.new(result.content) unless ( doc.text( "./loginResponse/responseStatus" ) =~ /OK/ ) raise "fail session-2." << doc.text( "./loginResponse/message" ) end # sequence 3 base_uri = File.dirname( seq2_uri ) result = @client.post( base_uri + "/ws-login", "j_username=#{userId}&j_password=#{password}" ) seq4_uri = result.header["Location"] if ( seq4_uri == nil || seq4_uri.length <= 0 ) doc = REXML::Document.new(result.content) raise "fail session-3." << doc.text( "./loginResponse/message" ) end # sequence 4 # responseStatusがOKになるまでリダイレクトが続く。 while ( true ) result = @client.get( seq4_uri ) doc = REXML::Document.new(result.content) if ( doc.text( "./loginResponse/responseStatus" ) =~ /OK/ ) break else seq4_uri = result.header["Location"] raise "fail session-4.responce=" << result.content if seq4_uri == nil || seq4_uri.length <= 0 end end begin block.call( ) if block_given? ensure # logout result = @client.post( base_uri + "/ws-logout" ) unless ( doc.text( "./loginResponse/responseStatus" ) =~ /OK/ ) raise "fail session-5." << doc.text( "./loginResponse/message" ) end end end end end