首页 > 解决方案 > Github API 获取 repo 的自述文件,不管它是如何命名的

问题描述

我试图在一堆 repos(我不拥有)中获取自述文件,我遇到的问题是有时人们以不同的方式命名自述文件(例如 README.md、README.MD、 Readme.md 或 readme.md)

我现在在做什么

GET https://api.github.com/repos/REPO_NAME/contents/README.md

问题是如果它以不同的方式命名,它不会返回自述文件。

也尝试使用

GET https://api.github.com/search/code?q=repo:REPO_NAME+filename:readme

但是我一直在达到搜索的 API 限制(因为我有很多我正在使用的存储库)

标签: node.jsgithubgithub-api

解决方案


您可以使用Github GraphQL API并为每个可能的文件名使用别名,例如:

readme1: object(expression: "master:README.md") {
   ...
}
readme2: object(expression: "master:README.MD") {
   ...
}

这个想法是您只对搜索和内容执行一个请求。您还可以添加更多repository别名,并且每个请求的成本保持在 1 点,这大大降低了达到速率限制的机会。

例如,以下将获得 2 个存储库的 5 个文件名可能性的自述文件,此请求仅花费 1 分:

{
  repo1: repository(name: "material-ui", owner: "mui-org") {
    ...RepoFragment
  }
  repo2: repository(name: "linux", owner: "torvalds") {
    ...RepoFragment
  }
  rateLimit {
    cost
    remaining
    limit
  }
}

fragment RepoFragment on Repository {
  readme1: object(expression: "master:README.md") {
    ...ReadmeText
  }
  readme2: object(expression: "master:README.MD") {
    ...ReadmeText
  }
  readme3: object(expression: "master:readme.md") {
    ...ReadmeText
  }
  readme4: object(expression: "master:Readme.md") {
    ...ReadmeText
  }
  readme5: object(expression: "master:README") {
    ...ReadmeText
  }
}

fragment ReadmeText on GitObject {
  ... on Blob {
    text
  }
}

在资源管理器中试试这个

在输出中:

"rateLimit": {
   "cost": 1,
   "remaining": 4977,
   "limit": 5000
}

这意味着您可以通过动态构建请求,利用别名将存储库数组分割成上面的 graphql 别名。您只受到处理查询所需时间的限制,因此您必须拥有每个请求的最大存储库数。有关动态构建查询的示例,请参见这篇文章。另一个可能更简单的帖子

另外,请参阅graphql 资源限制文档


推荐阅读