如何通过github3.py更快遍历仓库中指定时间范围的Issue评论?
高效获取GitHub仓库特定时间范围的Issue评论
嘿,我太懂你这种遍历几千个Issue的痛苦了——耗时几小时完全是在浪费时间!咱们换个思路,利用GitHub API的原生能力来直接筛选评论,不用逐个Issue去查。
为什么你之前的代码效率低
你之前的写法是先拉所有Issue,再逐个调用comments(),本质上还是在遍历每个Issue,而且API调用次数会爆炸(几千个Issue就对应几千次调用),这才是耗时的根源。另外comments()方法的参数用法可能也不对,它没法帮你跨Issue批量筛选评论。
解决方案一:用REST API直接批量拉取评论(PyGitHub示例)
GitHub的REST API支持直接获取仓库所有Issue评论,还能用since参数过滤起始时间,之后咱们再本地过滤结束时间就行(API暂时没提供until参数,但本地过滤的成本很低)。
用PyGitHub的话,代码可以这么写:
from github import Github from datetime import datetime # 初始化GitHub客户端,替换成你的个人访问令牌 g = Github("your_personal_access_token") repo = g.get_repo("username/your-repo-name") # 定义你要筛选的时间范围 start_date = datetime(2023, 1, 1) # 起始时间 end_date = datetime(2023, 12, 31) # 结束时间 # 批量获取所有起始时间之后的评论,再过滤出结束时间之前的 filtered_comments = [] # get_issues_comments会自动处理分页,不用手动翻页 for comment in repo.get_issues_comments(since=start_date): if comment.created_at <= end_date: filtered_comments.append(comment) # 可以打印预览结果 print(f"Issue #{comment.issue.number}: {comment.body[:60]}...")
这种方法的优势是:直接拉取所有评论,API调用次数从几千次降到几次(取决于评论数量的分页),速度会快很多。
解决方案二:用GraphQL API精确筛选(更高效)
如果想要更精准的时间范围过滤,不用本地处理,GitHub的GraphQL API是更好的选择——它支持直接在查询里指定createdAt的起止时间,还能一次性获取你需要的所有字段,减少数据传输。
这里给一个用requests调用GraphQL的示例:
import requests import json token = "your_personal_access_token" graphql_url = "https://api.github.com/graphql" # 定义查询语句,支持分页和时间范围过滤 query = """ query FetchCommentsInRange($owner: String!, $repo: String!, $startDate: DateTime!, $endDate: DateTime!, $cursor: String) { repository(owner: $owner, name: $repo) { issueComments( first: 100, after: $cursor, filterBy: {createdAt: {since: $startDate, until: $endDate}} ) { pageInfo { hasNextPage endCursor } nodes { body createdAt issue { number title } author { login } } } } } """ # 替换成你的仓库信息和时间范围 variables = { "owner": "username", "repo": "your-repo-name", "startDate": "2023-01-01T00:00:00Z", "endDate": "2023-12-31T23:59:59Z", "cursor": None } all_comments = [] # 处理分页,获取所有符合条件的评论 while True: response = requests.post( graphql_url, headers={"Authorization": f"Bearer {token}"}, json={"query": query, "variables": variables} ) data = response.json() comments_page = data["data"]["repository"]["issueComments"] all_comments.extend(comments_page["nodes"]) if not comments_page["pageInfo"]["hasNextPage"]: break variables["cursor"] = comments_page["pageInfo"]["endCursor"] # 遍历结果 for comment in all_comments: print(f"Issue #{comment['issue']['number']} ({comment['issue']['title']}):") print(f"By {comment['author']['login']} on {comment['createdAt']}:") print(f"{comment['body'][:100]}...\n")
GraphQL的优势是完全不需要本地过滤,所有筛选在API端完成,而且可以自定义返回字段,避免获取不需要的数据,效率拉满。
总结
别再逐个遍历Issue了!直接调用仓库的Issue评论接口(REST或GraphQL),利用API的筛选能力,能把耗时从几小时压缩到几分钟甚至更短。
内容的提问来源于stack exchange,提问作者Muhammad Farhan
相关产品推荐
相关产品推荐

