## 财经新闻（Stock / Global News）

工具：`get_stock_news`（`src.tools.stock_news_tool.StockNewsTool`）
描述：两路公开免鉴权新闻面封在同一 BaseTool 下：
- **A 股（及一般中国市场财经）头条** —— 东财免费 `search-api` 新闻列表端点。按源 IP 限流，故走 `eastmoney` 节流客户端。
- **美 / 港头条** —— Yahoo Finance 公开 search 端点（`backtest.loaders.yahoo_client.search`，自身 per-host 节流），返回相关标的匹配。
两种 scope：`stock`（默认，单只证券，需 `code`）、`global`（宽口径市场头条，无需 `code`）。
市场：A 股（.SH/.SZ/.BJ → 东财）、美股（.US）/港股（.HK → Yahoo）。
限速：东财经 `eastmoney` bucket、Yahoo 经其 host bucket。

<br>

**端点**

| 上游 | 端点 URL |
| ---- | -------- |
| 东财新闻 | `https://search-api-web.eastmoney.com/search/jsonp` |
| Yahoo search | 经 `backtest.loaders.yahoo_client.search()` |

<br>

**输入参数（工具入参）**

名称 | 类型 | 必选 | 描述
---- | ---- | ---- | ----
scope | str | N | `"stock"`（默认，单只证券，需 `code`）或 `"global"`（宽口径中国市场财经，默认查询词 `财经`）。
code | str | scope=stock 必选 | symbol，如 `600519.SH` / `AAPL.US` / `00700.HK`。后缀选上游：SH/SZ/BJ → 东财；US/HK → Yahoo。
limit | int | N | 返回头条数上限（1–50，默认 20）。

<br>

**端点查询参数（东财）**

`cb=`、`_=0`、`param=<JSON 字符串>`。其中 `param` 体：`{"uid":"","keyword":<查询词>,"type":["cmsArticleWebOld"],"client":"web","clientType":"web","param":{"cmsArticleWebOld":{"searchScope":"default","sort":"default","pageIndex":1,"pageSize":<limit>}}}`。响应可能为 JSONP（`callback(...)`），工具自动剥壳。

<br>

**返回字段**

东财文章（`result.cmsArticleWebOld[]`，源字段 → 输出键）：

源字段 | 输出键 | 描述
---- | ---- | ----
title | title | 标题
url | url | 链接
mediaName | source | 媒体名
date | published | 发布时间
content | snippet | 正文（裁剪至 280 字符）

Yahoo 匹配（相关标的）：

字段 | 描述
---- | ----
title | shortname/longname/symbol 之一
symbol / exchange / quote_type | 标的代码 / 交易所 / 类型

信封：`{"ok": true, "market": <market>, "source": "eastmoney"|"yahoo", "data": {"scope", ("code"), "articles":[...]}}`。market 为 `a_share`/`us`/`hk`/`global`。

<br>

**调用范例**

```python
from src.tools.stock_news_tool import StockNewsTool

print(StockNewsTool().execute(code="600519.SH", scope="stock", limit=10))
print(StockNewsTool().execute(scope="global", limit=15))
```
