44
55@author: gaoan
66"""
7+ import json
8+
79from tigeropen .common .consts import Language
810from tigeropen .common .util .signature_utils import read_private_key
11+ from tigeropen .common .util .web_utils import do_get
12+
13+ DEFAULT_DOMAIN = 'openapi.tigerfintech.com'
14+ DEFAULT_SANDBOX_DOMAIN = 'openapi-sandbox.tigerfintech.com'
15+ DOMAIN_GARDEN_ADDRESS = 'https://cg.play-analytics.com/'
16+
17+ HTTPS_PROTOCAL = 'https://'
18+ SSL_PROTOCAL = 'ssl'
19+ GATEWAY_SUFFIX = '/gateway'
920
1021# 老虎证券开放平台网关地址
11- SERVER_URL = 'https://openapi.skytigris.cn/gateway'
22+ SERVER_URL = HTTPS_PROTOCAL + DEFAULT_DOMAIN + GATEWAY_SUFFIX
1223# 老虎证券开放平台 socket 连接域名端口
13- SOCKET_HOST_PORT = ('ssl' , 'openapi.skytigris.cn' , 8883 )
24+ SOCKET_HOST_PORT = (SSL_PROTOCAL , DEFAULT_DOMAIN , 9883 )
1425# 老虎证券开放平台公钥
1526TIGER_PUBLIC_KEY = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNF3G8SoEcCZh2rshUbayDgLLrj6rKgzNMxDL2HS' \
1627 'nKcB0+GPOsndqSv+a4IBu9+I3fyBp5hkyMMG2+AXugd9pMpy6VxJxlNjhX1MYbNTZJUT4nudki4uh+LM' \
2536TIMEOUT = 15
2637
2738# sandbox 环境配置
28- SANDBOX_SERVER_URL = 'https://openapi-sandbox.skytigris.cn/gateway'
29- SANDBOX_SOCKET_HOST_PORT = ('ssl' , 'openapi-sandbox.skytigris.cn' , 8885 )
39+ SANDBOX_SERVER_URL = HTTPS_PROTOCAL + DEFAULT_SANDBOX_DOMAIN + GATEWAY_SUFFIX
40+ SANDBOX_SOCKET_HOST_PORT = (SSL_PROTOCAL , DEFAULT_SANDBOX_DOMAIN , 9885 )
3041SANDBOX_TIGER_PUBLIC_KEY = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbm21i11hgAENGd3/f280PSe4g9YGkS3TEXBY' \
3142 'MidihTvHHf+tJ0PYD0o3PruI0hl3qhEjHTAxb75T5YD3SGK4IBhHn/Rk6mhqlGgI+bBrBVYaXixm' \
3243 'HfRo75RpUUuWACyeqQkZckgR0McxuW9xRMIa2cXZOoL1E4SL4lXKGhKoWbwIDAQAB'
3344
3445
3546class TigerOpenClientConfig :
36- def __init__ (self , sandbox_debug = False ):
47+ def __init__ (self , sandbox_debug = False , enable_dynamic_domain = True ):
3748 # 开发者应用id
3849 self ._tiger_id = ''
3950 # 授权账户
@@ -44,102 +55,102 @@ def __init__(self, sandbox_debug=False):
4455 self ._sign_type = SIGN_TYPE
4556 # 机构交易员专有密钥
4657 self ._secret_key = ''
47-
48- # 老虎证券开放平台网关地址
49- self ._server_url = SERVER_URL
50- self ._socket_host_port = SOCKET_HOST_PORT
51- # 老虎证券开放平台公钥
52- self ._tiger_public_key = TIGER_PUBLIC_KEY
53-
54- if sandbox_debug :
55- self ._server_url = SANDBOX_SERVER_URL
56- self ._socket_host_port = SANDBOX_SOCKET_HOST_PORT
57- self ._tiger_public_key = SANDBOX_TIGER_PUBLIC_KEY
5858 # 请求字符集,默认utf-8
5959 self ._charset = CHARSET
6060 # 语言
6161 self ._language = LANGUAGE
62-
6362 # 以下为可选参数
6463 # 请求读取超时,单位秒,默认15s
6564 self ._timeout = TIMEOUT
66-
65+ self ._sandbox_debug = sandbox_debug
66+ # 老虎证券开放平台公钥
67+ self ._tiger_public_key = TIGER_PUBLIC_KEY
68+ # 老虎证券开放平台网关地址
69+ self ._server_url = SERVER_URL
70+ self ._socket_host_port = SOCKET_HOST_PORT
71+ if sandbox_debug :
72+ self ._tiger_public_key = SANDBOX_TIGER_PUBLIC_KEY
73+ self ._server_url = SANDBOX_SERVER_URL
74+ self ._socket_host_port = SANDBOX_SOCKET_HOST_PORT
75+ if enable_dynamic_domain :
76+ self .refresh_domains ()
77+
6778 @property
6879 def tiger_id (self ):
6980 return self ._tiger_id
70-
81+
7182 @tiger_id .setter
7283 def tiger_id (self , value ):
7384 self ._tiger_id = value
74-
85+
7586 @property
7687 def account (self ):
7788 return self ._account
78-
89+
7990 @account .setter
8091 def account (self , value ):
8192 self ._account = value
82-
93+
8394 @property
8495 def sign_type (self ):
8596 return self ._sign_type
86-
97+
8798 @sign_type .setter
8899 def sign_type (self , value ):
89100 self ._sign_type = value
90-
101+
91102 @property
92103 def private_key (self ):
93104 return self ._private_key
94-
105+
95106 @private_key .setter
96107 def private_key (self , value ):
97108 self ._private_key = value
98-
109+
99110 @property
100111 def tiger_public_key (self ):
101112 return self ._tiger_public_key
102-
113+
103114 @tiger_public_key .setter
104115 def tiger_public_key (self , value ):
105116 self ._tiger_public_key = value
106-
117+
107118 @property
108119 def server_url (self ):
109120 return self ._server_url
110-
121+
111122 @server_url .setter
112123 def server_url (self , value ):
113124 self ._server_url = value
114-
125+
115126 @property
116127 def socket_host_port (self ):
117128 return self ._socket_host_port
118-
129+
119130 @socket_host_port .setter
120131 def socket_host_port (self , value ):
121132 self ._socket_host_port = value
122-
133+
123134 @property
124135 def charset (self ):
125136 return self ._charset
126-
137+
127138 @charset .setter
128139 def charset (self , value ):
129140 self ._charset = value
130-
141+
131142 @property
132143 def language (self ):
133144 return self ._language
134-
145+
135146 @language .setter
136147 def language (self , value ):
137148 self ._language = value
138-
149+
139150 @property
140151 def timeout (self ):
141152 return self ._timeout
142-
153+
143154 @timeout .setter
144155 def timeout (self , value ):
145156 self ._timeout = value
@@ -152,9 +163,45 @@ def secret_key(self):
152163 def secret_key (self , value ):
153164 self ._secret_key = value
154165
166+ def refresh_domains (self ):
167+ """
168+ domains data like:
169+ {
170+ "ret": 0,
171+ "serverTime": 1650966832923,
172+ "items": [
173+ {
174+ "openapi": {
175+ "socket_port": 9883,
176+ "COMMON": "https://openapi.tigerfintech.com"
177+ },
178+ "openapi-sandbox": {
179+ "socket_port": 9885,
180+ "COMMON": "https://openapi-sandbox.tigerfintech.com"
181+ }
182+ }
183+ ]
184+ }
185+ :return:
186+ """
187+ try :
188+ result = json .loads (do_get (DOMAIN_GARDEN_ADDRESS , headers = dict (), params = dict (), timeout = 1 ).decode ()) \
189+ .get ('items' )
190+ if result :
191+ for item in result :
192+ conf = item .get ('openapi-sandbox' , dict ()) if self ._sandbox_debug else item .get ('openapi' , dict ())
193+ host = conf .get ('COMMON' )
194+ socket_port = conf .get ('socket_port' )
195+ if host and socket_port :
196+ self ._server_url = host + GATEWAY_SUFFIX
197+ self ._socket_host_port = (SSL_PROTOCAL , host .rpartition (HTTPS_PROTOCAL )[- 1 ], socket_port )
198+ except :
199+ pass
200+
155201
156202def get_client_config (private_key_path , tiger_id , account , sandbox_debug = False , sign_type = None , timeout = None ,
157- language = None , charset = None , server_url = None , socket_host_port = None , secret_key = None ):
203+ language = None , charset = None , server_url = None , socket_host_port = None , secret_key = None ,
204+ enable_dynamic_domain = True ):
158205 """
159206 生成客户端配置
160207 :param private_key_path: 私钥文件路径, 如 '/Users/tiger/.ssh/rsa_private_key.pem'
@@ -168,9 +215,10 @@ def get_client_config(private_key_path, tiger_id, account, sandbox_debug=False,
168215 :param server_url: 网关地址
169216 :param socket_host_port: 推送长连接的域名端口, 值为协议, 域名, 端口构成的三元组
170217 :param secret_key: 机构交易员专有密钥 (个人开发者无需指定)
218+ :param enable_dynamic_domain: 是否初始化时拉取服务域名
171219 :return:
172220 """
173- config = TigerOpenClientConfig (sandbox_debug = sandbox_debug )
221+ config = TigerOpenClientConfig (sandbox_debug = sandbox_debug , enable_dynamic_domain = enable_dynamic_domain )
174222 config .private_key = read_private_key (private_key_path )
175223 config .tiger_id = tiger_id
176224 config .account = account
@@ -189,4 +237,3 @@ def get_client_config(private_key_path, tiger_id, account, sandbox_debug=False,
189237 if secret_key :
190238 config .secret_key = secret_key
191239 return config
192-
0 commit comments