Windowsでしか kabu STATION が動かないため、APIもWindowsでしか実行できない、そう思っていないだろうか。
そんなことはない、macやLinuxからでもAPIは叩くことができる。ただし、Windowsは必要で、Windows上にnginxを立てる必要がある。
公式のissueで削除されずに挙げられているので、リンクを貼るくらいは問題無いと思うので貼る。
要するに、下記の構成にすることで実現できる。
[mac/Linux] <---TLS (https/wss)---> Win [ nginx <---> kabu STATION ]
macやLinuxと WindowsをTLSで繋げる理由だが、経路中の暗号化のためである。暗号化しないと、生パスワードがネットワークを流れることになる。パスワードは変更可能とはいえ、それまでは容易に攻撃可能な状態を作りうる。なので、TLSによる暗号化は必須である。
下記のサンプルスクリプトでは、 python-kabusapi
を改造し、TLSによる暗号化やBASIC認証を付けた状態で通信できるようにした。(ただし、BASIC認証も反射攻撃を防げないので、Digest認証等を使用するべき)
近日中に修正内容は本家のレポジトリに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'}]}