株のシステムトレードをしよう - 1から始める株自動取引システムの作り方

株式をコンピュータに売買させる仕組みを少しずつ作っていきます。できあがってから公開ではなく、書いたら途中でも記事として即掲載して、後から固定ページにして体裁を整える方式で進めていきます。

macやLinuxから kabu STATION APIを使う(Windowsにnginxを立ててリバースプロキシ)

Windowsでしか kabu STATION が動かないため、APIもWindowsでしか実行できない、そう思っていないだろうか。

そんなことはない、macやLinuxからでもAPIは叩くことができる。ただし、Windowsは必要で、Windows上にnginxを立てる必要がある。

公式のissueで削除されずに挙げられているので、リンクを貼るくらいは問題無いと思うので貼る。

github.com

要するに、下記の構成にすることで実現できる。

[mac/Linux] <---TLS (https/wss)---> Win [ nginx <---> kabu STATION ]

macやLinuxと WindowsをTLSで繋げる理由だが、経路中の暗号化のためである。暗号化しないと、生パスワードがネットワークを流れることになる。パスワードは変更可能とはいえ、それまでは容易に攻撃可能な状態を作りうる。なので、TLSによる暗号化は必須である。

下記のサンプルスクリプトでは、 python-kabusapi を改造し、TLSによる暗号化やBASIC認証を付けた状態で通信できるようにした。(ただし、BASIC認証も反射攻撃を防げないので、Digest認証等を使用するべき)

github.com

近日中に修正内容は本家のレポジトリにPRを送るようにしたい。

# coding: utf-8

import pprint
pp = pprint.PrettyPrinter()

import sys
import os
import pathlib
path_to_kabusapi = '../python-kabusapi/src'
sys.path.append(str(pathlib.Path(path_to_kabusapi).resolve()))

import kabusapi
from requests.auth import HTTPBasicAuth

HOST = os.environ.get('KABU_S_HOST')
PASSWORD = os.environ.get('KABU_S_PASSWORD')
PORT = os.environ.get('KABU_S_PORT')
USE_TLS = os.environ.get('KABU_S_TLS') == 'true'
BASIC_AUTH_USER = os.environ.get('BASIC_AUTH_USER')
BASIC_AUTH_PW = os.environ.get('BASIC_AUTH_PW')

if BASIC_AUTH_USER:
  auth = HTTPBasicAuth(BASIC_AUTH_USER, BASIC_AUTH_PW)
else:
  auth = None

api = kabusapi.Context(HOST, PORT, PASSWORD,
  auth=auth,
  tls=USE_TLS,
)

def register_stock():
  # 銘柄登録
  data = {
      "Symbols": [
          {"Symbol": 7974, "Exchange": 1, },
      ]
  }
  response = api.register(**data)
  pp.pprint(response)
register_stock()

exit()

# ---
# ここから先は調整中

print('----------------')
@api.websocket
def recieve(msg):
    # ここで処理を行う msgはdict形式である。
    print("{} / {} {} {}".format(
        msg,
        msg['Symbol'],
        msg['SymbolName'],
        msg['CurrentPrice'],
    ))

try:
  # 受信開始
  api.websocket.run()
except KeyboardInterrupt:
  print('Close websocket')
  #api.websocket.loop.close()
  api.websocket.close()
# 出力

$ python3 kabusapi_test.py
{'RegistList': [{'Exchange': 1, 'Symbol': '7974'}]}

(C) 2020 dogwood008 禁無断転載 不許複製 Reprinting, reproducing are prohibited.