You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过GitHub GraphQL API获取热门仓库中评论数超过阈值的Issue?

解决GitHub GraphQL API筛选高评论数Issue的问题

你没漏掉什么关键功能——GitHub GraphQL API目前确实不支持在查询阶段直接过滤评论数超过特定阈值的Issue,不管是通过仓库搜索还是Issue的filterBy参数都做不到这一点。下面具体说下原因和可行的解决办法:

为什么当前方式无法实现?

  • 仓库搜索的局限性:你用的search(type: REPOSITORY)查询只能基于仓库本身的属性过滤(比如stars、fork状态、推送时间等),没有任何参数能关联到仓库内Issue的评论数,也没法直接排除没有Issue的仓库。
  • Issue filterBy的限制:Issue的filterBy参数确实不支持按评论数过滤,官方提供的过滤选项只有状态、创建/更新时间、作者、经办人这些维度,完全没有涉及评论数量的条件。

可行的解决方案

目前最稳妥的方式就是先通过API获取符合条件的仓库及对应Issue,再在本地做筛选。不过可以通过一些优化减少不必要的请求和数据处理:

1. 先排除无Issue的仓库

在查询仓库时先获取issues.totalCount,如果这个值为0,直接跳过该仓库,不用再请求具体的Issue列表:

search(query: "stars:>10000 fork:false pushed:>2020-01-01 is:public mirror:false archived:false", type: REPOSITORY) {
  repositoryCount
  nodes {
    ... on Repository {
      nameWithOwner
      # 先获取仓库Issue总数,提前排除空仓库
      issues {
        totalCount
      }
      # 按评论数倒序排列,优先获取评论多的Issue
      issues(first: 100, orderBy: {field: COMMENTS, direction: DESC}) {
        edges {
          node {
            title
            comments { totalCount }
            id
            number
          }
        }
        pageInfo {
          endCursor
          hasNextPage
        }
      }
    }
  }
}

2. 本地筛选高评论数Issue

拿到Issue列表后,在客户端逻辑里过滤出comments.totalCount > 100的条目即可。另外,因为first:100最多返回100个Issue,如果仓库有更多Issue,需要利用pageInfo里的endCursorhasNextPage进行分页请求,直到拿到所有符合条件的Issue或者遍历完所有Issue。

3. 备选:尝试GitHub REST API

如果GraphQL的方式太繁琐,也可以试试GitHub REST API的Issue搜索功能——它支持用comments:>100这样的查询参数直接过滤Issue评论数。不过要结合仓库的stars条件,你可能需要先获取符合stars要求的仓库列表,再逐个构造repo:owner/repo comments:>100的搜索请求,本质上和GraphQL的思路类似,但REST的搜索语法可能更直观一些。

总结

目前GitHub的API不管是GraphQL还是REST,都没办法一步到位直接筛选出“热门仓库中评论数>100的Issue”,必须分两步:先获取符合条件的仓库,再拉取Issue并本地过滤。你之前的思路是对的,没有忽略任何关键功能~

内容的提问来源于stack exchange,提问作者Jura Gorohovsky

火山引擎 最新活动