我使用Github API V3获取一个仓库的fork数量,代码如下:
GET /repos/:owner/:repo/forks
即使一个仓库包含更多的结果,该请求也只会给我带来30个结果。我查了一下谷歌发现,由于内存限制,API每页只返回30个结果,如果我想要下一页的结果,我必须指定页数。
只有我不需要所有这些信息,我只需要收藏的数量。
有没有办法只获取收藏的数量?
因为如果我开始循环每一页,我的脚本可能会在一个包含数千个结果的仓库中崩溃。
我使用Github API V3获取一个仓库的fork数量,代码如下:
GET /repos/:owner/:repo/forks
即使一个仓库包含更多的结果,该请求也只会给我带来30个结果。我查了一下谷歌发现,由于内存限制,API每页只返回30个结果,如果我想要下一页的结果,我必须指定页数。
只有我不需要所有这些信息,我只需要收藏的数量。
有没有办法只获取收藏的数量?
因为如果我开始循环每一页,我的脚本可能会在一个包含数千个结果的仓库中崩溃。
您可以尝试使用搜索查询。
例如,对于我的存储库VonC/b2d,我会使用:
https://api.github.com/search/repositories?q=user%3AVonC+repo%3Ab2d+b2d
这个json回答给了我一个"forks_count": 5
这里有一个拥有超过4000个fork的(只考虑第一个结果,也就是"full_name
"实际上是"strongloop/express
"的那个)
https://api.github.com/search/repositories?q=user%3Astrongloop+repo%3Aexpress+express
"forks_count": 4114,
?page=1
的增量和添加对来自服务器的空响应的检查来解决了这个问题。def get_fork(username, repo, forks, auth=None):
page = 1
while 1:
r = None
request = "https://api.github.com/repos/{}/{}/forks?page={}".format(username, repo, page)
if auth is None: r = requests.get(request)
else: r = requests.get(request, auth=(auth['login'], auth['secret']))
j = r.json()
r.close()
if 'message' in j:
print("username: {}, repo: {}".format(username, repo))
print(j['message'] + " " + j['documentation_url'])
if str(j['message']) == "Not Found": break
else: exit(1)
if len(j) == 0: break
else: page += 1
for item in j:
forks.append({'user': item['owner']['login'], 'repo': item['name']})
if auth is None:
get_fork(item['owner']['login'], item['name'], forks)
else:
get_fork(item['owner']['login'], item['name'], forks, auth)