# -*- coding: utf-8 -*-
"""
龙湖榜 / 开盘啦盘口接口终端打印版 V1.1
功能:
1. 直接复现你提供的抓包请求;
2. 不保存文件,只打印到终端;
3. 不要求运行时输入机器码;
4. 支持修改股票代码;
5. 输出关键盘口字段 + 完整原始 JSON。
注意:
- 仅用于个人学习、接口分析、数据定位。
- 不要高频请求,不要批量压测。
"""
from__future__importannotations
importjson
importtime
fromtypingimportAny, Dict, List
importrequests
# =========================
# 1. 配置区:主要改这里
# =========================
接口地址="https://apphwhq.longhuvip.com/w1/api/index.php"
股票代码列表: List[str] = [
"002457",
]
请求超时时间=10
# 是否打印完整原始 JSON
打印完整JSON=True
# 多只股票之间的等待秒数,低频即可
请求间隔秒数=1.0
# =========================
# 2. 请求头:来自你提供的抓包
# =========================
请求头= {
"Host": "apphwhq.longhuvip.com",
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8",
"Connection": "keep-alive",
"Accept": "*/*",
"User-Agent": "lhb/5.23.1 (com.kaipanla.www; build:1; iOS 18.7.7) Alamofire/4.9.1",
"Accept-Language": "zh-Hans-CN;q=1.0",
"Accept-Encoding": "gzip;q=1.0, compress;q=0.5",
}
# =========================
# 3. 请求参数
# =========================
def构造请求参数(股票代码: str) -> Dict[str, Any]:
"""
按照你抓包里的 POST Form 参数构造请求。
这里不再要求你手动输入机器码,直接按抓包参数请求。
"""
return {
"PhoneOSNew": "2",
"State": "1",
"StockID": 股票代码,
"Token": "0",
"UserID": "0",
"VerSion": "5.23.0.1",
"a": "GetStockPanKou_Narrow",
"apiv": "w44",
"c": "StockL2Data",
}
# =========================
# 4. 工具函数
# =========================
def安全取值(数据: Dict[str, Any], 键: str, 默认值: Any="-") -> Any:
ifnotisinstance(数据, dict):
return默认值
return数据.get(键, 默认值)
def格式化行情时间(原始时间: Any) -> str:
"""
接口返回示例:95954000
解析为:09:59:54.000
"""
if原始时间in (None, "-", ""):
return"-"
文本=str(原始时间).zfill(9)
try:
小时=文本[0:2]
分钟=文本[2:4]
秒=文本[4:6]
毫秒=文本[6:9]
returnf"{小时}:{分钟}:{秒}.{毫秒}"
exceptException:
returnstr(原始时间)
def打印盘口摘要(数据: Dict[str, Any]) -> None:
"""
打印核心盘口字段。
"""
实时=数据.get("real", {}) or {}
print("="*80)
print("盘口数据摘要")
print("="*80)
print(f"交易日期:{安全取值(数据, 'day')}")
print(f"股票代码:{安全取值(数据, 'code')}")
print(f"股票名称:{安全取值(数据, 'name')}")
print(f"昨收价:{安全取值(数据, 'preclose_px')}")
print(f"状态码:{安全取值(数据, 'status')}")
print(f"错误码:{安全取值(数据, 'errcode')}")
print(f"服务端时间戳:{安全取值(数据, 'ts')}")
print("-"*80)
行情时间=格式化行情时间(安全取值(实时, "time"))
print(f"行情时间:{行情时间}")
print(f"最新价:{安全取值(实时, 'last_px')}")
print(f"涨跌额:{安全取值(实时, 'px_change')}")
print(f"涨跌幅:{安全取值(实时, 'px_change_rate')}%")
print(f"开盘价:{安全取值(实时, 'open_px')}")
print(f"最高价:{安全取值(实时, 'high_px')}")
print(f"最低价:{安全取值(实时, 'low_px')}")
print(f"均价:{安全取值(实时, 'avg_px')}")
print("-"*80)
print(f"涨停价:{安全取值(实时, 'up_px')}")
print(f"跌停价:{安全取值(实时, 'down_px')}")
print(f"振幅:{安全取值(实时, 'amplitude')}%")
print(f"换手率:{安全取值(实时, 'turnover_ratio')}%")
print(f"量比:{安全取值(实时, 'vol_ratio')}")
print(f"委比:{安全取值(实时, 'entrust_rate')}%")
print("-"*80)
print(f"成交量 total_amount:{安全取值(实时, 'total_amount')}")
print(f"成交额 total_turnover:{安全取值(实时, 'total_turnover')}")
print(f"主动买入 amount_in:{安全取值(实时, 'amount_in')}")
print(f"主动卖出 amount_out:{安全取值(实时, 'amount_out')}")
print("-"*80)
print(f"流通市值:{安全取值(实时, 'circulation_value')}")
print(f"总市值:{安全取值(实时, 'market_value')}")
print(f"实际流通市值:{安全取值(实时, 'actualcirculation_value')}")
print(f"市净率:{安全取值(实时, 'dyn_pb_rate')}")
print(f"市盈率:{安全取值(实时, 'pe_rate')}")
print(f"TTM市盈率:{安全取值(实时, 'TTMPeRate')}")
print("="*80)
# =========================
# 5. 请求函数
# =========================
def获取盘口数据(session: requests.Session, 股票代码: str) -> Dict[str, Any]:
"""
请求单只股票盘口数据。
"""
响应=session.post(
接口地址,
headers=请求头,
data=构造请求参数(股票代码),
timeout=请求超时时间,
)
print(f"HTTP状态码:{响应.status_code}")
响应.raise_for_status()
try:
return响应.json()
exceptjson.JSONDecodeError:
print("接口返回内容不是 JSON,原始文本如下:")
print(响应.text)
raise
# =========================
# 6. 主程序
# =========================
def主程序() -> None:
print("龙湖榜 / 开盘啦盘口接口终端打印版 V1.1")
print(f"股票数量:{len(股票代码列表)}")
print()
withrequests.Session() assession:
for序号, 股票代码inenumerate(股票代码列表, start=1):
print(f"\n正在请求第 {序号}/{len(股票代码列表)} 只股票:{股票代码}")
try:
数据=获取盘口数据(session, 股票代码)
打印盘口摘要(数据)
if打印完整JSON:
print("\n完整原始 JSON:")
print(json.dumps(数据, ensure_ascii=False, indent=2))
exceptExceptionas错误:
print(f"请求失败:{股票代码}")
print(f"错误信息:{错误}")
if序号<len(股票代码列表):
time.sleep(请求间隔秒数)
if__name__=="__main__":
主程序()