| | |
| | | import json |
| | | import time |
| | | |
| | | import requests |
| | | |
| | | import constant |
| | | from third_data import kpl_util |
| | | from utils import middle_api_protocol |
| | | |
| | | |
| | | # 竞价 |
| | | DABAN_TYPE_BIDDING = 8 |
| | |
| | | DABAN_TYPE_EVER_LIMIT_DOWN = 5 |
| | | |
| | | |
| | | def __base_request(url, data): |
| | | def __base_request(url, data, timeout=10): |
| | | DELEGATE = True |
| | | if not DELEGATE: |
| | | headers = { |
| | |
| | | } |
| | | # proxies={'https': '192.168.3.251:9002'} |
| | | # 禁止代理,不然会走本地代理 |
| | | response = requests.post(url, data=data, headers=headers, proxies={"http": None, "https": None}) |
| | | response = requests.post(url, data=data, headers=headers, proxies={"http": None, "https": None}, |
| | | timeout=timeout) |
| | | if response.status_code != 200: |
| | | raise Exception("请求出错") |
| | | return response.text |
| | | else: |
| | | fdata = middle_api_protocol.load_kpl(url, data) |
| | | fdata = middle_api_protocol.load_kpl(url, data, timeout) |
| | | return middle_api_protocol.request(fdata) |
| | | |
| | | |
| | | def daBanList(pidType): |
| | | data = "Order=1&a=DaBanList&st=50&c=HomeDingPan&PhoneOSNew=1&DeviceID=a38adabd-99ef-3116-8bb9-6d893c846e23" \ |
| | | f"&VerSion=5.8.0.2&Index=0&Is_st=1&PidType={pidType}&apiv=w32&Type=4&FilterMotherboard=0&Filter=0&FilterTIB=0" \ |
| | | "&FilterGem=0 " |
| | | def daBanList(pidType, page_size=50, index=0): |
| | | data = f"Order=1&a=DaBanList&st={page_size}&c=HomeDingPan&PhoneOSNew=1&DeviceID=a38adabd-99ef-3116-8bb9-6d893c846e24" \ |
| | | f"&VerSion=5.8.0.2&Index={index}&Is_st=1&PidType={pidType}&apiv=w32&Type=4&FilterMotherboard=0&Filter=0&FilterTIB=0" \ |
| | | "&FilterGem=0" |
| | | result = __base_request("https://apphq.longhuvip.com/w1/api/index.php", data=data) |
| | | return result |
| | | |
| | | |
| | | def __getLimitUpInfo(pidType, page, pageSize): |
| | | data = f"Order=0&a=DailyLimitPerformance&st={pageSize}&apiv=w35&Type=4&c=HomeDingPan&PhoneOSNew=1&DeviceID=a38adabd-99ef-3116-8bb9-6d893c846e24&VerSion=5.13.0.0&Index={(page - 1) * pageSize}&PidType={pidType}&" |
| | | result = __base_request("https://apphq.longhuvip.com/w1/api/index.php", data=data) |
| | | return result |
| | | |
| | | |
| | | def getLimitUpInfoNew(): |
| | | pids = [(1, "首板"), (2, "2连板"), (3, "3连板"), (4, "4连板"), (5, "")] |
| | | fresults = [] |
| | | day = '' |
| | | for pid_info in pids: |
| | | results = [] |
| | | for i in range(100): |
| | | start_time = time.time() |
| | | result = __getLimitUpInfo(pid_info[0], i + 1, 20) |
| | | result = json.loads(result) |
| | | datas = result["info"][0] |
| | | results.extend(datas) |
| | | day = result["info"][1] |
| | | if len(datas) < 20: |
| | | break |
| | | for r in results: |
| | | if not r[18] and pid_info[1]: |
| | | r[18] = pid_info[1] |
| | | # 替换掉板块名称 |
| | | for i in range(len(r)): |
| | | if type(r[i]) == str: |
| | | r[i] = kpl_util.filter_block(r[i]) |
| | | fresults.extend(results) |
| | | |
| | | return json.dumps({"errcode": 0, "list": fresults, "day": day}) |
| | | |
| | | |
| | | def getLimitUpInfo(): |
| | | list_ = [] |
| | | page_size = 20 |
| | | MAX_SIZE = 150 |
| | | for i in range(0, 10): |
| | | result_str = daBanList(DABAN_TYPE_LIMIT_UP, page_size=page_size, index=len(list_)) |
| | | result = json.loads(result_str) |
| | | temp_list = result["list"] |
| | | list_ += temp_list |
| | | if len(temp_list) < page_size: |
| | | result['list'] = list_ |
| | | return json.dumps(result) |
| | | elif len(list_) > MAX_SIZE: |
| | | return json.dumps(result) |
| | | return None |
| | | |
| | | |
| | | def getHistoryLimitUpInfo(day): |
| | | fresults = [] |
| | | for i in range(0, 100): |
| | | data = f"Order=1&a=HisDaBanList&st=20&c=HisHomeDingPan&PhoneOSNew=1&DeviceID=a38adabd-99ef-3116-8bb9-6d893c846e23&VerSion=5.8.0.2&Index={i * 20}&Is_st=1&PidType=1&apiv=w32&Type=6&FilterMotherboard=0&Filter=0&FilterTIB=0&Day={day}&FilterGem=0&" |
| | | result = __base_request("https://apphis.longhuvip.com/w1/api/index.php", data=data) |
| | | result = json.loads(result) |
| | | result = result["list"] |
| | | fresults.extend(result) |
| | | if len(result) < 20: |
| | | break |
| | | return fresults |
| | | |
| | | |
| | | # 市场行情-行业 |
| | |
| | | # 市场行情-精选 |
| | | def getMarketJingXuanRealRankingInfo(orderJingE_DESC=True): |
| | | data = f"Order={1 if orderJingE_DESC else 0}&a=RealRankingInfo&st=20&apiv=w32&Type=5&c=ZhiShuRanking&PhoneOSNew=1&DeviceID=a38adabd-99ef-3116-8bb9-6d893c846e23&VerSion=5.8.0.2&Index=0&ZSType=7&" |
| | | result = __base_request("https://apphq.longhuvip.com/w1/api/index.php", |
| | | data=data) |
| | | return result |
| | | |
| | | |
| | | def getMarketJingXuanRealRankingInfoByTimeRange(startTime, endTime, date, orderJingE_DESC=True): |
| | | data = f"Order={1 if orderJingE_DESC else 0}&st=30&a=RealRankingInfo&apiv=w35&Type=5&Index=0&RStart={startTime}&c=ZhiShuRanking&VerSion=5.13.0.0&REnd={endTime}&Date={date}&PhoneOSNew=1&ZSType=7&DeviceID=d6f20ce9-fa08-31c9-a493-536ebb8e9773&" |
| | | result = __base_request("https://apphq.longhuvip.com/w1/api/index.php", |
| | | data=data) |
| | | return result |
| | |
| | | |
| | | # 获取代码的精选板块 |
| | | # 返回格式:[(板块代码,板块名称,涨幅百分比)] |
| | | def getCodeJingXuanBlocks(code): |
| | | def getCodeJingXuanBlocks(code, jx=True): |
| | | data = f"a=GetStockIDPlate&apiv=w32&Type=2&c=StockL2Data&StockID={code}&PhoneOSNew=1&UserID=0&DeviceID=a38adabd-99ef-3116-8bb9-6d893c846e23&VerSion=5.8.0.2&Token=0&" |
| | | result = __base_request("https://apphq.longhuvip.com/w1/api/index.php", data=data) |
| | | result = json.loads(result) |
| | | return result.get("ListJX") |
| | | # print(result) |
| | | if jx: |
| | | return result.get("ListJX") if result.get("ListJX") else result.get("List") |
| | | else: |
| | | fresults = [] |
| | | if result.get("List"): |
| | | fresults.extend(result.get("List")) |
| | | if result.get("ListJX"): |
| | | fresults.extend(result.get("ListJX")) |
| | | return fresults |
| | | |
| | | |
| | | # 获取自由流通市值 |
| | | def getZYLTAmount(code): |
| | | data = f"a=GetStockPanKou_Narrow&apiv=w32&c=StockL2Data&VerSion=5.8.0.2&State=1&PhoneOSNew=1&DeviceID=a38adabd-99ef-3116-8bb9-6d893c846e23&StockID={code}&" |
| | | result = __base_request("https://apphq.longhuvip.com/w1/api/index.php", data=data) |
| | | result = __base_request("https://apphq.longhuvip.com/w1/api/index.php", data=data, timeout=3) |
| | | result = json.loads(result) |
| | | if "real" in result: |
| | | return result["real"].get("actualcirculation_value") |
| | | return None |
| | | |
| | | |
| | | # 获取F10中的精选板块 |
| | | def __getConceptJXBK(code): |
| | | data = f"a=GetConceptJXBKw23&apiv=w32&c=StockF10Basic&StockID={code}&PhoneOSNew=1&DeviceID=a38adabd-99ef-3116-8bb9-6d893c846e23&VerSion=5.8.0.2&" |
| | | result = __base_request("https://apparticle.longhuvip.com/w1/api/index.php", data=data, timeout=3) |
| | | result = json.loads(result) |
| | | if result: |
| | | if "List" in result: |
| | | names = [kpl_util.filter_block(x["CName"]) for x in result["List"]] |
| | | return names if len(names) < 3 else names[:2] |
| | | return [] |
| | | |
| | | |
| | | # 获取F10常规板块 |
| | | def __getConceptBK(code): |
| | | data = f"a=GetConceptw23&apiv=w32&c=StockF10Basic&StockID={code}&PhoneOSNew=1&DeviceID=a38adabd-99ef-3116-8bb9-6d893c846e23&VerSion=5.8.0.2&" |
| | | result = __base_request("https://apparticle.longhuvip.com/w1/api/index.php", data=data, timeout=3) |
| | | result = json.loads(result) |
| | | if result: |
| | | if "List" in result: |
| | | names = [kpl_util.filter_block(x["CName"]) for x in result["List"]] |
| | | return names |
| | | return [] |
| | | |
| | | |
| | | # 获取代码的板块 |
| | | def getCodeBlocks(code): |
| | | blocks = [] |
| | | try: |
| | | _bks = getCodeJingXuanBlocks(code) |
| | | # 取前2个 |
| | | if _bks and len(_bks) > 2: |
| | | _bks = _bks[:2] |
| | | _bks = [x[1] for x in _bks] |
| | | if _bks: |
| | | blocks.extend(_bks) |
| | | except: |
| | | pass |
| | | if not blocks: |
| | | try: |
| | | _bks = __getConceptBK(code) |
| | | print(_bks) |
| | | if _bks: |
| | | blocks.extend(_bks) |
| | | except: |
| | | pass |
| | | return list(set(blocks)) |
| | | |
| | | |
| | | # 获取F10里面的大事件 |
| | | def __getF10BigReminders(code): |
| | | data = f"a=BigReminder&st=25&apiv=w32&c=StockF10Basic&StockID={code}&PhoneOSNew=1&DeviceID=a38adabd-99ef-3116-8bb8-6d893c846e23&VerSion=5.8.0.2&Index=0&" |
| | | result = __base_request("https://apparticle.longhuvip.com/w1/api/index.php", data=data, timeout=3) |
| | | result = json.loads(result) |
| | | if int(result["errcode"]) == 0: |
| | | return result["info"] |
| | | return None |
| | | |
| | | |
| | | # 获取股票减持日期 |
| | | def getCodeReductionDate(code): |
| | | infos = __getF10BigReminders(code) |
| | | if not infos: |
| | | return None |
| | | keys = ["终止", "结束", "结果", "不减持", "完成"] |
| | | for info in infos: |
| | | if info.get("type") == 5: |
| | | title = str(info.get("title")) |
| | | if title.find("减持") < 0: |
| | | continue |
| | | wrong = False |
| | | for k in keys: |
| | | if title.find(k) >= 0: |
| | | wrong = True |
| | | if wrong: |
| | | continue |
| | | return info.get("date").split(" ")[0] |
| | | return None |
| | | |
| | | |
| | | def getZLJECodesRank(index): |
| | | """ |
| | | 获取主力金额的排行 |
| | | @return: |
| | | """ |
| | | data = f"Order=1&a=RealRankingInfo_W8&st=50&c=NewStockRanking&PhoneOSNew=1&RStart=0925&DeviceID=d6f20ce9-fa08-31c9-a493-536ebb8e9773&VerSion=5.13.0.0&Isst=0&index={index}&Date=&REnd=1420&apiv=w35&Type=1&FilterMotherboard=0&Filter=0&Ratio=6&FilterTIB=1&FilterGem=0&" |
| | | result = __base_request("https://apphwhq.longhuvip.com/w1/api/index.php", data=data, timeout=3) |
| | | result = json.loads(result) |
| | | return result |
| | | |
| | | |
| | | def getMarketStrong(): |
| | | """ |
| | | 获取市场强度 |
| | | :return: |
| | | """ |
| | | result = __base_request("https://apphwhq.longhuvip.com/w1/api/index.php", |
| | | data=f"a=DiskReview&apiv=w35&c=HomeDingPan&VerSion=5.13.0.0&PhoneOSNew=1&DeviceID=d6f20ce9-fa08-31c9-a493-536ebb8e9773&", |
| | | timeout=3) |
| | | data = json.loads(result) |
| | | return int(data["info"]["strong"]) |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | | print(len(json.loads(daBanList(DABAN_TYPE_LIMIT_UP))["list"])) |
| | | result =getHistoryLimitUpInfo("2024-02-19") |
| | | print(result) |