Github API获取指定日期之后Pull Requests的参数失效问题及PyGithub库适配咨询
解决GitHub PR过滤及PyGithub支持问题
一、API请求参数不生效的原因及修复
你踩了一个常见的API端点误用坑!/repos/{owner}/{repo}/pulls 这个端点不支持q参数做时间过滤——这个参数是GitHub搜索API(/search/issues)专属的,因为Pull Requests在GitHub的搜索体系里被归类为issues的子集。
正确的API请求方式
改用搜索API构造请求,格式如下:
GET /search/issues?q=repo:gooddata/gooddata-python-sdk+is:pr+updated:>=2022-06-01&per_page=10&page=1&sort=updated&direction=asc
查询条件拆解:
repo:gooddata/gooddata-python-sdk:锁定目标仓库is:pr:仅返回Pull Requests(排除普通issues)updated:>=2022-06-01:严格过滤2022年6月1日之后更新的PR- 其余参数
per_page、page等和你原需求保持一致
这样请求返回的结果就会完全符合你的时间过滤要求了。
二、PyGithub的解决方案
PyGithub确实没在get_pulls()方法里直接提供updated字段过滤的参数,但有两种实用的解决办法:
方法1:调用PyGithub的搜索API(推荐)
利用PyGithub封装的搜索功能,直接对接GitHub搜索API,效率更高:
from github import Github # 初始化客户端(传入个人访问令牌可提升速率限制) g = Github("your-github-token") # 构造搜索查询字符串 query = "repo:gooddata/gooddata-python-sdk is:pr updated:>=2022-06-01" # 执行搜索并指定排序规则 search_results = g.search_issues(query, sort="updated", order="asc") # 取前10条结果 for pr in search_results[:10]: print(f"PR #{pr.number}: {pr.title} | 更新时间: {pr.updated_at}")
注意:搜索API有速率限制(未认证用户每小时10次,认证用户每小时30次),高频请求建议使用令牌。
方法2:本地手动过滤PR
如果坚持用get_pulls()方法,可以先拉取PR列表,再在本地做时间过滤:
from github import Github from datetime import datetime g = Github("your-github-token") repo = g.get_repo("gooddata/gooddata-python-sdk") # 获取所有状态的PR,按更新时间升序排列 pulls = repo.get_pulls(state="all", sort="updated", direction="asc") # 定义时间阈值 threshold = datetime(2022, 6, 1) # 手动过滤符合条件的PR filtered_pulls = [] for pr in pulls: # 统一时区后比较时间 if pr.updated_at.replace(tzinfo=None) >= threshold: filtered_pulls.append(pr) if len(filtered_pulls) >= 10: break # 输出结果 for pr in filtered_pulls: print(f"PR #{pr.number}: {pr.title} | 更新时间: {pr.updated_at}")
这种方法适合PR数量较少的仓库,否则加载大量数据会影响效率。
总结
- 直接调用API时,必须用搜索API而非普通PR列表端点来实现时间过滤
- PyGithub优先推荐用搜索API方案,既符合GitHub设计规范,又能避免本地过滤的性能问题
内容的提问来源于stack exchange,提问作者Jan Soubusta
相关产品推荐
相关产品推荐

