You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:41:17