th2ch-g/gh-email-get
GitHub: th2ch-g/gh-email-get
一个基于 GitHub CLI 的扩展工具,用于从用户的公开提交历史中提取其使用过的所有电子邮件地址。
Stars: 0 | Forks: 0
# gh-email-get
一个 [GitHub CLI](https://cli.github.com/) 扩展,用于提取隐藏在 GitHub 提交背后的公开电子邮件地址。根据参数形式的不同,它会在以下两种模式下之一运行:
- **用户模式** — 给定用户名或个人主页 URL,列出该用户在其所有公开仓库中用于提交的每个电子邮件地址,以及每个电子邮件地址最早和最晚的提交日期(`YYYYMMDD`,UTC)。
- **仓库模式** — 给定 `owner/repo`(或仓库 URL),列出该仓库的所有贡献者及其用于提交的不同电子邮件地址。
输出为 stdout 上的 JSON 格式,因此可以方便地通过管道传递给 `jq` 等工具。
## 安装
```
gh extension install th2ch-g/gh-email-get
```
后续升级:
```
gh extension upgrade email-get
```
## 使用方法
```
gh email-get [flags]
```
接受的参数形式:
| 形式 | 模式 |
| --- | --- |
| `th2ch-g` / `github.com/th2ch-g` / `https://github.com/th2ch-g` | 用户模式 |
| `th2ch-g/dotfiles` / `github.com/th2ch-g/dotfiles` / `https://github.com/th2ch-g/dotfiles(.git)` | 仓库模式 |
仓库 URL 末尾的斜杠和可选的 `.git` 后缀将被去除。
### 用户模式示例
```
$ gh email-get th2ch-g
[
{
"email": "76892059+th2ch-g@users.noreply.github.com",
"start_date": "20221005",
"last_date": "20260424"
}
]
```
通过管道传递给 `jq` 进行过滤——例如,过滤掉 noreply 地址:
```
gh email-get th2ch-g --quiet | jq '[.[] | select(.email | contains("noreply") | not)]'
```
### 仓库模式示例
```
$ gh email-get th2ch-g/dotfiles
[
{
"user": "th2ch-g",
"emails": [
"76892059+th2ch-g@users.noreply.github.com"
]
}
]
```
过滤掉机器人 / noreply 贡献者:
```
gh email-get owner/repo --quiet \
| jq '[.[] | select(.user | endswith("[bot]") | not)]'
```
## 标志
| 标志 | 默认值 | 模式 | 描述 |
| --- | --- | --- | --- |
| `--quiet` | `false` | 两者皆可 | 抑制 stderr 上的进度消息。 |
| `--include-fork` | `true` | 仅用户模式 | 包含用户拥有的 fork 仓库。传入 `--include-fork=false` 可跳过它们。 |
| `--contributions` | `false` | 仅用户模式 | 同时扫描用户参与提交的外部仓库,这些仓库通过 GitHub `search/commits` API 发现。该搜索端点的速率限制更严格(认证后为 30 次/分钟),并且最多返回 1000 个结果。 |
`--include-fork` 和 `--contributions` 仅影响用户模式;在仓库模式下,指定的单个仓库始终只会被扫描一次。
`--help` 用于打印使用说明并退出。
## 工作原理
参数会被解析为一个 `Target{Kind, User, Repo}` 值。两段式输入(`owner/repo`)会成为仓库模式目标;单段式输入会成为用户模式目标。包含三个或更多路径段的任何输入都将被拒绝。
### 用户模式
1. `GET /users/{user}/repos?type=owner` 列出用户拥有的公开仓库(通过 `Link` 标头进行分页)。除非设置 `--include-fork=false`,否则 fork 的仓库也会被包含在内。
2. 如果使用 `--contributions`,将通过 `GET /search/commits?q=author:{user}` 发现用户曾参与提交的外部仓库。这些结果将与已拥有的仓库集合进行去重。
3. 对于每个仓库,`GET /repos/{owner}/{repo}/commits?author={user}` 会分页遍历该用户创作的每一个提交。空仓库会从 API 返回 HTTP 409 状态码,并会被静默视为零次提交。
4. 每个提交的 `commit.author.email` 和 `commit.author.date` 会被输入到一个聚合器中,该聚合器会记录每个电子邮件地址的最早和最晚日期。
5. 结果按 `start_date` 升序排序(以电子邮件地址作为平局决胜项),并以格式化的 JSON 数组形式打印输出。
### 仓库模式
1. `GET /repos/{owner}/{repo}/commits` 会分页遍历仓库中的每一个提交(没有 `?author=` 过滤条件)。
2. 每个提交都按其作者进行分组——优先使用 GitHub 登录名(`author.login`,位于负载的顶层),当电子邮件未绑定到 GitHub 账户时,则回退使用 Git 作者名(`commit.author.name`)。
3. 针对每位用户,收集不同的电子邮件地址(区分大小写进行去重)。
4. 用户列表以及每位用户下的电子邮件地址均按字母顺序排序。
在这两种模式下,只会收集 `commit.author.email`;`commit.committer.email` 会被故意忽略,因为 GitHub 上的 rebase/squash 流程会暴露 GitHub 自己的提交者身份。
## 身份验证和速率限制
该扩展使用 `gh` 已通过 [`go-gh`](https://github.com/cli/go-gh) 认证的凭据——无需配置单独的 token。在运行之前,请确保 `gh auth status` 执行成功。
经过身份验证的 REST 限制为 5000 次/小时,足以应对拥有数百个仓库和数千次提交的用户。`--contributions` 使用的 search/commits 端点限制为 30 次/分钟,因此非常活跃的用户可能会触及该上限。
## 输出约定
- **stdout**:仅限机器可读的格式化 JSON。适合通过管道传递给 `jq` 或其他工具。
- **stderr**:人类可读的进度消息、警告和错误。
如果某个提交的作者电子邮件为空或日期为零值,该提交将被跳过并在 stderr 上输出警告;这不会导致运行失败。
## 开发
从检出的代码构建并测试:
```
make build # produces ./gh-email-get
make test # go test ./...
make install # (re)install as a gh extension from this checkout
make help # list all targets
```
位于 `.github/workflows/ci.yml` 的 CI 工作流会在每次推送到 `main` 分支以及每次发起 pull request 时运行 `go vet`、`go test` 和 `go build`。
## 发布
发布版本由 `.github/workflows/release.yml` 使用 [`cli/gh-extension-precompile`](https://github.com/cli/gh-extension-precompile) action 构建。只需为提交打上标签并推送该标签——工作流将构建名为 `gh-email-get__` 的各平台二进制文件,并将它们附加到 GitHub Release 中。`gh extension install` 会自动选择匹配的资源。
```
git tag v0.1.0
git push origin v0.1.0
```
## 许可证
有关许可证的详细信息,请参阅仓库。
标签:CLI扩展, ESC4, EVTX分析, gh-email-get, Git, JSON, meg, OSINT, Tactics, URL抓取, 代码提交分析, 信息安全, 内存扫描绕过, 威胁情报, 实时处理, 开发者工具, 开源情报收集, 数据抓取, 日志审计, 网络安全, 贡献者分析, 邮箱提取, 隐私保护, 靶机侦察