import json
|
import logging
|
import time
|
|
import requests
|
|
from utils import tool
|
|
|
class XGBApi:
|
|
@classmethod
|
def __base_request_get(cls, url):
|
response = requests.get(url)
|
return response.text
|
|
@classmethod
|
def get_limit_up_codes_infos(cls):
|
url = f"https://flash-api.xuangubao.cn/api/surge_stock/stocks?date={tool.get_now_date_str('%Y%m%d')}&normal=true&uplimit=true"
|
result = cls.__base_request_get(url)
|
result = json.loads(result)
|
if result["code"] == 20000:
|
items = result["data"]["items"]
|
return items
|
return None
|
|
@classmethod
|
def get_limit_up_reasons(cls):
|
url = f"https://flash-api.xuangubao.cn/api/surge_stock/plates"
|
result = cls.__base_request_get(url)
|
result = json.loads(result)
|
if result["code"] == 20000:
|
items = result["data"]["items"]
|
return items
|
return None
|
|
@classmethod
|
def get_code_blocks(cls, code):
|
symbol = code
|
if code.find('00') or code.find('30'):
|
symbol += ".SZ"
|
elif code.find('60') or code.find('68'):
|
symbol += ".SS"
|
|
url = f"https://flash-api.xuangubao.cn/api/stage2/plates_by_any_stock?symbol={symbol}&fields=core_avg_pcp,plate_name"
|
result = cls.__base_request_get(url)
|
result = json.loads(result)
|
if result["code"] == 20000:
|
data = result["data"]
|
return [data[k]['plate_name'] for k in data]
|
return None
|
|
|
__limit_up_codes_infos_cache = None
|
__limit_up_reasons_dict_cache = {}
|
|
|
def run():
|
global __limit_up_codes_infos_cache
|
global __limit_up_reasons_dict_cache
|
while True:
|
try:
|
results = XGBApi.get_limit_up_codes_infos()
|
if results:
|
__limit_up_codes_infos_cache = (results, time.time())
|
results = XGBApi.get_limit_up_reasons()
|
if results:
|
__limit_up_reasons_dict_cache = {k["name"]: k for k in results}
|
except:
|
pass
|
finally:
|
time.sleep(3)
|
|
|
# 加载涨停代码
|
def __load_limit_up_codes():
|
global __limit_up_codes_infos_cache
|
global __limit_up_reasons_dict_cache
|
if __limit_up_codes_infos_cache is None or time.time() - __limit_up_codes_infos_cache[1] > 10:
|
items = XGBApi.get_limit_up_codes_infos()
|
if items:
|
__limit_up_codes_infos_cache = (items, time.time())
|
items = XGBApi.get_limit_up_reasons()
|
__limit_up_reasons_dict_cache = {k["name"]: k for k in items}
|
|
|
# 获取涨停列表的原因
|
def get_code_limit_up_reasons(code):
|
__load_limit_up_codes()
|
if __limit_up_codes_infos_cache:
|
__limit_up_codes_infos = __limit_up_codes_infos_cache[0]
|
for item in __limit_up_codes_infos:
|
if item[0].split(".")[0] == code:
|
# 涨停原因:(板块,原因,['成分股名称1','成分股名称2'])
|
reasons = [[x["name"], __limit_up_reasons_dict_cache.get(x["name"]).get("description") if x[
|
"name"] in __limit_up_reasons_dict_cache else '']
|
for x in item[8]]
|
for r in reasons:
|
code_names = []
|
for l in __limit_up_codes_infos:
|
try:
|
if l[8]:
|
if r[0] in [ll["name"] for ll in l[8]]:
|
code_names.append(l[1])
|
except Exception as e:
|
logging.exception(e)
|
print(l)
|
r.append(code_names)
|
# 涨停原因
|
return reasons, item[5], XGBApi.get_code_blocks(code), round(item[4] / 100000000, 2)
|
return None
|
|
|
if __name__ == '__main__':
|
print(XGBApi.get_limit_up_codes_infos())
|