我想检索包含README文件的存储库的用户,该文件包含与查询中传递的字符串匹配的文本。这可能是使用GitHub API吗?
此外,我想在查询中包含位置和语言。
感谢。
答案 0 :(得分:4)
现在使用可用的API并不简单。但是,您可以使用API来获得所需内容。
请注意,Github上有超过1000万个存储库 - 这需要很长时间。由于每个查询只能检索100个存储库的列表,因此需要使用分页 - >超过100000个请求获取所有存储库。用户每小时限制为5000个请求,然后您被禁止"再过一个小时。如果您只使用一个用户凭据,则需要40多个小时。
步骤:
获取包含所有存储库的JSON(https://developer.github.com/v3/repos/#list-all-public-repositories)
使用分页每个查询获取100个对象(https://developer.github.com/v3/#link-header)
解码json并检索存储库列表
对于每个存储库,您需要从JSON获取存储库URL对象,该对象为您提供存储库的链接。
现在您需要获取README内容。有两种方法: a)您使用Github API,使用repo url并发送:https://api.github.com/repos/:owner/:repo/readme(https://developer.github.com/v3/repos/contents/#get-the-readme)的GET请求,然后解码文件(使用Base64编码)或者您遵循html JSON的属性,例如" html":" https://github.com/pengwynn/octokit/blob/master/README.md"。如果没有README,您将获得404 Not found代码,因此您可以轻松前往下一个存储库。
b)您只需使用步骤4为README创建URL,例如https://api.github.com/repos/octocat/Hello-World;并解析它并将其转换为https://github.com/octocat/Hello-World/README.MD;但是如果没有自述文件,这将会更复杂。
在文件中搜索您的特定文字,如果找到了文字,则记录与否。
迭代直到您浏览完所有存储库。
高级内容 - 如果您打算更频繁地运行此操作,我强烈建议您使用缓存https://developer.github.com/v3/#conditional-requests;您基本上存储了完成查询的日期+时间,并在以后使用它来查看存储库中是否有任何更改。如果您需要获取最新信息,这将消除您的许多后续查询。您仍然需要检索整个存储库列表。 (但之后你只搜索更新的存储库)
当然为了加快速度,您可以改进此算法以使其并行 - 您检索100个存储库,然后继续检索下一个100,同时您搜索前100个存储库是否包含README文件,如果自述文件包含您要搜索的内容,等等。这将使事情更快,更肯定。您将需要使用某种缓冲区,因为您不知道哪个终止更快(获取存储库列表或搜索它们)
希望它有所帮助。