Files
Justin Gu 3945800728 feat(cli): company-info 传板块名自动读完整正文(分块循环 + 多服务器重试)
修复体验问题:此前传板块名仍需用户关心 --offset/--length,太笨拙。
现在传板块名即自动按目录 length 分块循环读取整个板块(单次上限 30720 字节,
大板块如「公司大事」77万字节也能一次读全),--offset/--length 仅传文件名时生效。

- _resolve_filename 返回板块 length,_run_content 分块循环读取完整内容
- 修复分块 offset 推进 bug:原按解码字符串 GBK 重编码计字节,遇 U+FFFD 崩溃;
  改为按请求字节数推进(服务器按字节偏移工作)
- 修复多服务器目录版本不一致:传板块名未命中时自动重试多个服务器(最多4次)
- bump 版本号至 1.15.3
2026-06-27 04:37:44 +08:00

136 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 06. 财务数据与 F10 公司信息
通达信原生协议(TdxClient)提供两类财务/公司数据,独立于 [新浪三表 `f10`](../../README.md#财务)
| 命令 / 接口 | 数据 | 说明 |
|-------------|------|------|
| `finance-info` / `GET /api/v1/finance` | **最新财务快照** | 单期 37 字段(股本、资产负债、利润、现金流、每股指标) |
| `company-info`(无板块名)/ `GET /api/v1/company/category` | **F10 板块目录** | 列出全部板块及其文件偏移 |
| `company-info "板块名"` / `GET /api/v1/company/content` | **F10 板块正文** | 读取指定板块的 GBK 文本 |
> **与 `f10` 的区别**`f10` 走新浪 HTTP,返回多期结构化利润表/负债表/现金流(DataFrame,可数值计算);本目录的命令走通达信协议,`finance-info` 是最新一期的快照,`company-info` 是 F10 全文板块(纯文本)。
## company-info 命令的两种用法
`company-info` 根据是否传入板块名参数自动切换行为:
```bash
# 用法 1:无板块名 → 列出 F10 板块目录
easy-tdx company-info SH 600519 --table
# 用法 2:有板块名 → 读取该板块正文
easy-tdx company-info SH 600519 "公司概况"
easy-tdx company-info SH 600519 "分红扩股" --length 2048
```
读正文时**只需传板块名即可读完整内容**(自动按目录 length 分块循环,大板块也一次读全),无需关心 offset/length。也可换成文件名(`600519.txt`),此时用 `--offset`/`--length` 控制。
## F10 板块完整列表
`company-info` 列目录时返回的全部板块(以贵州茅台 600519 为例,个股板块可能略有差异):
| 板块名 | 说明 |
|--------|------|
| 最新提示 | 最新指标、近期公告、机构持股变化、概念板块 |
| 公司概况 | 基本资料、发行上市、关联企业 |
| 财务分析 | 主要财务指标、环比/同比分析 |
| 股东研究 | 十大股东、流通股东、股东变化 |
| 股本结构 | 股本结构、股本变化、限售流通、股权激励 |
| 资本运作 | 募集资金使用、重大事项 |
| 业内点评 | 机构点评、投资建议 |
| 行业分析 | 行业地位、市场前景 |
| 公司大事 | 重要事件、公告 |
| 研究报告 | 券商研报、盈利预测 |
| 经营分析 | 主营业务、经营情况 |
| 主力追踪 | 主力资金、筹码集中度 |
| 分红扩股 | 分红送转、历史派息 |
| 高层治理 | 高管简历、薪酬 |
| 龙虎榜单 | 龙虎榜上榜记录 |
| 关联个股 | 同行业/同概念关联股票 |
## 示例文件
| 文件 | 调用方式 | 覆盖内容 |
|------|----------|----------|
| `finance_info.py` | Python API | 最新财务快照(37 字段) |
| `company_info.py` | Python API | F10 板块目录 + 遍历各板块正文 |
| `company_cli.sh` | CLI | `finance-info` / `company-info` 全用法 |
| `company_web_api.py` | Web API | `/finance` `/company/category` `/company/content` |
## 快速开始
### CLI
```bash
# 最新财务快照
easy-tdx finance-info SH 600519 --table
# F10 板块目录
easy-tdx company-info SH 600519
# 读 F10 正文
easy-tdx company-info SH 600519 "公司概况"
```
### Python API
```python
from easy_tdx import Market, TdxClient
with TdxClient.from_best_host() as c:
# 最新财务快照(单行 DataFrame)
finance = c.get_finance_info(Market.SH, "600519")
# F10 板块目录
cats = c.get_company_info_category(Market.SH, "600519")
# 读某板块正文:先从目录查 filename/start/length
row = cats[cats["name"] == "公司概况"].iloc[0]
content = c.get_company_info_content(
Market.SH, "600519", row["filename"], int(row["start"]), int(row["length"])
)
print(content)
```
### Web API
```bash
# 启动服务
easy-tdx serve
# 最新财务快照
curl "http://localhost:8000/api/v1/finance?market=SH&code=600519"
# F10 板块目录
curl "http://localhost:8000/api/v1/company/category?market=SH&code=600519"
# 读 F10 正文(filename/offset/length 从目录接口获取)
curl "http://localhost:8000/api/v1/company/content?market=SH&code=600519&filename=600519.txt&offset=0&length=2048"
```
## 字段说明
### finance-info(最新财务快照)
| 字段 | 单位 | 说明 |
|------|------|------|
| `liutong_guben` / `zong_guben` | 万股 | 流通股本 / 总股本 |
| `guojia_gu` / `faren_gu` / `b_gu` / `h_gu` | 万股 | 国家股 / 法人股 / B股 / H股 |
| `zong_zichan` / `liudong_zichan` / `guding_zichan` | 元 | 总/流动/固定资产 |
| `liudong_fuzhai` / `changqi_fuzhai` / `jing_zichan` | 元 | 流动/长期负债 / 净资产 |
| `zhuying_shouru` / `yingye_lirun` / `jing_lirun` | 元 | 主营收入 / 营业利润 / 净利润 |
| `jingying_xianjinliu` / `zong_xianjinliu` | 元 | 经营现金流 / 总现金流 |
| `meigujing_zichan` | 元 | 每股净资产 |
| `updated_date` / `ipo_date` | YYYYMMDD | 财务更新日 / 上市日 |
完整字段见 `finance_info.py` 顶部注释。
### company-infoF10 板块目录)
| 列 | 类型 | 说明 |
|----|------|------|
| `name` | str | 板块名(如「公司概况」) |
| `filename` | str | 内容文件名(如 `600519.txt` |
| `start` | int | 内容在该文件中的起始偏移(字节) |
| `length` | int | 内容长度(字节) |