無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

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