Как новичок, изучающий Python 3 и как использовать API, я пытаюсь разработать простой скрипт, который принимает Github-репозиторий, а рекурсивно идентифицирует все вилки всех форков указанного репозитория. Идея состоит в том, чтобы получить переменную типа list
, содержащую вилки (и информацию о родителе этих вилок) (разве что другой тип переменной лучше?), Который я могу экспортировать в файл JSON в качестве дополнительного упражнения.
Сейчас я использую библиотеку Python 3 requests
и комбинацию циклов for
и while
(да, я знаю, что циклы while = True
опасны, дайте мне знать, если есть лучший способ).
Вот код с примером репозитория (OpenROV/openrov-software
) для поиска вилок, для которых скрыт маркер аутентификации Github:
import requests
#
# getting forks
#
# the starting repository to find forks for
username = "OpenROV"
repo = "openrov-software"
# fake Github auth token:
auth = ("ScroogeMcDuck", "fqo4p6xx6p2cgnwi3fakjotx7c46n5xcfzxpz3hz")
# initialise an empty list of forks
forks = list()
# Recursive function to find all forks of forks of a Github repository
def get_Github_forks(owner, repo, forks, auth=None, recurse=False):
page_counter = 1
request_output = list()
print("Finding forks for repository: {}/{}".format(owner, repo))
while True:
print("Retrieving forks page {}".format(page_counter))
request_string = "https://api.github.com/repos/{}/{}/forks?page={}".format(owner, repo, page_counter)
print("Request string:", request_string)
request_output = requests.get(request_string, auth = auth).json()
for item in request_output:
forks.append({"fork_owner": item["owner"]["login"], "fork_repo": item["name"], "created_at": item["created_at"], "forked_from_owner": owner, "forked_from_repo": repo})
# Stop going to the next page of results if the current result is 0,
# meaning we're already past the last page.
if len(request_output) == 0:
break
# Otherwise, move on to the next page of results
else:
page_counter = page_counter + 1
for fork in forks:
get_Github_forks(owner=fork["fork_owner"], repo=fork["fork_repo"], forks=forks, auth=auth, recurse=True)
# find forks
get_Github_forks(owner=username, repo=repo, forks=forks, auth=auth, recurse=True)
При запуске этого код, я вижу, что он успешно идентифицирует все вилки родительского / исходного репозитория (у него 179 вилок), но он застревает, повторяя получение первой страницы результатов для первого форка, а именно labimage/openrov-software
. Обратите внимание, что этот первый форк (labimage/openrov-software
) на самом деле не имеет вилок. Если я использую команду curl -i "https://api.github.com/repos/labimage/openrov-software/forks?page=1"
в терминале, она не даст результатов.
Вот верх бесконечного вывода при запуске этого скрипта, вы можете увидеть, где он застрял:
Finding forks for repository: OpenROV/openrov-software
Retrieving forks page 1
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=1
Retrieving forks page 2
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=2
Retrieving forks page 3
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=3
Retrieving forks page 4
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=4
Retrieving forks page 5
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=5
Retrieving forks page 6
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=6
Retrieving forks page 7
Request string: https://api.github.com/repos/OpenROV/openrov-software/forks?page=7
Finding forks for repository: labimage/openrov-software
Retrieving forks page 1
Request string: https://api.github.com/repos/labimage/openrov-software/forks?page=1
Finding forks for repository: labimage/openrov-software
Retrieving forks page 1
Request string: https://api.github.com/repos/labimage/openrov-software/forks?page=1
Finding forks for repository: labimage/openrov-software
Retrieving forks page 1
Request string: https://api.github.com/repos/labimage/openrov-software/forks?page=1
Finding forks for repository: labimage/openrov-software
Retrieving forks page 1
Request string: https://api.github.com/repos/labimage/openrov-software/forks?page=1
Finding forks for repository: labimage/openrov-software
Retrieving forks page 1
Request string: https://api.github.com/repos/labimage/openrov-software/forks?page=1
...
[goes on forever]
...
Что я сделал не так? Это мой первый Python вопрос, поэтому заранее благодарю за руководство. Дайте мне знать, если есть больше деталей, которые я могу предоставить.