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:xxx、org:xxx、language: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 找可能泄露密钥的新仓库。
评论