14 行 Python 监控 GitHub 全站新建仓库

结论

用 GitHub Search API,14 行 Python,零依赖,5 秒检出新建仓库。Events API 不行。

Events API 为什么不行

直觉:GitHub 的 /events 端点就是全站事件流,过滤 CreateEvent + ref_type=repository 就是新仓库。

实测:不行。

我们创建了一个测试仓库,然后翻遍了 500 条事件——4 个 CreateEvent,全是 ref_type=branch,新建仓库事件影子都没见着。API 创建的仓库事件要么延迟严重,要么直接不出现。

退一步想,就算它工作:/events 只保留最近 300 条(约 5 分钟),新仓库事件比重极低,轮询窗口内大概率漏掉。而且没有过滤参数,你只能把所有事件拉下来自己筛。

换 Search API

/search/repositories 支持 created 时间排序,精确到秒:

GET /search/repositories?q=created:>={timestamp}&sort=created&order=asc&per_page=30

优点:

  • 索引延迟 < 1 分钟,比 Events API 靠谱
  • 支持过滤:user:xxxorg:xxxlanguage:python
  • 30 req/min(带 token),10 req/min(不带)

脚本

14 行,stdlib only,无需安装任何依赖:

#!/usr/bin/env python3
import json, time
from urllib.request import Request, urlopen

seen = set()
req = Request("https://api.github.com/users/ipv0cn/repos?sort=created&per_page=100",
              headers={"User-Agent": "gh-watch"})
with urlopen(req, timeout=15) as r:
    seen = {item["full_name"] for item in json.load(r)}

while True:
    req = Request("https://api.github.com/users/ipv0cn/repos?sort=created&per_page=30",
                  headers={"User-Agent": "gh-watch"})
    with urlopen(req, timeout=15) as r:
        for item in json.load(r):
            name = item["full_name"]
            if name not in seen:
                print(f"[{item[created_at]}] {name}")
                raise SystemExit(0)
    time.sleep(5)

先 seed 现有仓库做去重基线,然后每 5 秒轮询,出现新名字即退出。

验证

创建 test-gh-watch-deleteme3 后,脚本 5 秒检出。

如果要监控全站而非单个用户

把 URL 换成全局搜索:

t = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
url = f"https://api.github.com/search/repositories?q=created:>={t}&sort=created&order=asc&per_page=30"

加上关键词过滤就能做更精准的监控,比如 ?q=secret+created:>={t}+language:python 找可能泄露密钥的新仓库。

评论