# GitHub 接口台账（接口文档撰写岗 D — 次级平台）

> 唯一证据来源：`/tmp/aiddit_captures/github_search.json`（`code=0` ✅）。host：`http://crawler.aiddit.com`。
> **平台级关键发现：GitHub 接口搜的是「代码仓库」，不是视频内容。** item 为 repo（`name`=仓库名 / `git_url` / `topics` 等），无视频地址、无播放/时长字段。topics 即 tag。本平台作为「次级 / 非视频」来源接入，下游不可按视频内容处理。

平台仅一个接口：

- `PLT_GITHUB_KEYWORD` — 关键词搜索代码仓库（verified ✅，**非视频**）

---

## 接口：GitHub 关键词搜索 `PLT_GITHUB_KEYWORD`

### ① 身份
| 项 | 值 |
|---|---|
| source_id | `PLT_GITHUB_KEYWORD` |
| display_name | Crawapi GitHub 关键词搜索（代码仓库） |
| 平台 channel | GitHub |
| 接口路径 | `/crawler/github/keyword` |
| 状态 | **verified ✅**（capture `github_search.json`，`code=0`，返回 10 条 repo item + 翻页） |
| 用途 | 关键词 → 代码仓库列表（**非视频内容源**） |

### ② 请求标准
- **method**：POST
- **path**：`http://crawler.aiddit.com/crawler/github/keyword`
- **鉴权**：抓包 `request_body` 含 `token` 字段，但本次为**空串** `""`（统一走 crawler 网关，base_url 由 `CONTENTFIND_API_CRAWAPI_BASE_URL` 提供）。
- **Content-Type**：`application/json`

| 参数 | 类型 | 必填 | 含义 | 抓包真值 |
|---|---|---|---|---|
| `keyword` | string | 是 | 搜索关键词 | `"彩虹"` |
| `token` | string | 否 | 翻页 token（首页空串；下一页取 response 的 `next_cursor`） | `""` |

### ③ 真实 curl
```bash
curl -X POST 'http://crawler.aiddit.com/crawler/github/keyword' \
  -H 'Content-Type: application/json' \
  -d '{"keyword":"彩虹","token":""}'
```

### ④ 响应信封 + 翻页
信封：`{ code, msg, data }`，`code=0`。
```
data.has_more   = true
data.next_cursor= "1"          ← 真值为短页码风格字符串（不是长 token）
data.data       = [ {repo item}, ... ]   ← 本次抓包 10 条
```
**翻页规则**：`has_more=true` 时，把 response 的 `next_cursor`（如 `"1"`）作为下一次请求的 **`token`** 参数传回（请求参数名为 `token`，响应字段名为 `next_cursor`，二者对应）。GitHub 的 cursor 是**短页码字符串**，与 YouTube 的长 token 不同。

### ⑤ 字段台账表（raw 名）
来源：`github_search.json` → `data.data[]`。

| 字段名(raw) | 类型 | 含义 | 提取标注 | 真实示例值 |
|---|---|---|---|---|
| `id` | string | **内容 id**（repo id，字符串） | 直接可用 | `702272852` |
| `hl_name` | string | **标题 / 仓库全名**（`owner/repo`，含 `<em>` 高亮标记） | 需正则抽（去 `<em></em>`） | `v03413/BEpusdt` |
| `repo.repository.name` | string | 仓库名（纯名，无 owner） | 直接可用 | `BEpusdt` |
| `repo.repository.owner_login` | string | **作者**（owner 登录名） | 直接可用 | `v03413` |
| `repo.repository.owner_id` | int | **作者 id**（owner 数字 id） | 直接可用 | `49953737` |
| `hl_trunc_description` | string | 仓库描述（截断，含 `<em>` 高亮） | 需正则抽（去 `<em></em>`） | `一款更好用的个人加密货币收款网关...支持独角数卡 <em>彩</em><em>虹</em>易支付` |
| `topics` | array<string> | **tag**（仓库 topics，多数为空数组） | 直接可用（即 tag） | `["vue"]`；`["markdown","youtube","pixiv",...]`；常见 `[]` |
| `language` | string\|null | 主语言 | 直接可用 | `Go` / `PHP` / `null` |
| `followers` | int | star/关注数 | 直接可用 | `1626` |
| `archived` | bool | 是否归档 | 直接可用 | `false` |
| `repo.repository.updated_at` | string(ISO) | 仓库更新时间 | 直接可用 | `2026-06-10T01:28:04.341Z` |
| `repo.repository.has_issues` | bool | 是否开启 issue | 直接可用 | `true` |
| `type` | string | 仓库可见性 | 直接可用 | `Public` |
| `has_more` | bool | **翻页**：是否还有下一页 | 直接可用 | `true` |
| `next_cursor` | string | **翻页**：下一页 token（短页码，回传到请求 `token`） | 直接可用 | `1` |

> **内容 url / git_url 推导**：抓包 item 内**无独立 `link`/`git_url`/`html_url` 字段**，仓库 url 须由 `hl_name`（去高亮后的 `owner/repo`）拼出：`https://github.com/{owner}/{repo}`。提取标注=需后处理（拼接）。

### ⑥ 提取与后处理规则
- **本平台是代码仓库，非视频**：无 `video_id` / `duration` / `view_count` / `video_url` 等任何视频字段。下游不可按「视频内容」流程处理，应作为「仓库/文本资产」类内容。
- `hl_name` 与 `hl_trunc_description` 含搜索高亮标记 `<em>...</em>`，落库前须正则 `</?em>` 去除。
- **tag = `topics`**：直接作为 tags 落库；注意多数仓库 `topics=[]`（空），少数才有（如 `["vue"]`）。
- 仓库 url 无现成字段，需用 `hl_name`（清洗后）拼 `https://github.com/{owner/repo}`。
- `owner_login`/`owner_id` 即作者；GitHub 无「频道」概念，作者即仓库 owner。

### ⑦ 边界与失败
- 单次约 10 条；`has_more=true` 时透传 `next_cursor → token` 翻页。
- 限流：请求间隔 **≥ 15s**。
- 多数 item `topics=[]`、`language=null`，下游不可强假定非空。
- 无视频/媒体文件，无 detail 接口抓包（本批次只验证了 search）。

### ⑧ 落点（canonical + 游走边）
- canonical 映射：`id → platform_content_id`、`owner_id`（或 `owner_login`）`→ platform_author_id`、`topics → tags`、拼出的 `https://github.com/{owner/repo}` → content url。
- 游走边：
  - `search_page_to_content`：搜索页 → 各 repo `id`。
  - `video_to_author`（此处语义为 content→author）：`id → owner_id/owner_login`。
  - `video_to_hashtag`（此处语义为 content→tag）：`id → topics[]`（topics 即 tag；空时不产生边）。
- 标注：内容类型为「代码仓库」，非视频，沉淀时打类型标记以免误入视频处理链路。
