Использование интерфейса программирования приложений Github v3 для поиска репозиториев, пользователей, совершения фиксации, удаления файла и многого другого в Python с помощью запросов и библиотек PyGithub.
Github — это служба хостинга репозиториев Git, в которую он добавляет множество собственных функций, таких как графический веб-интерфейс для управления репозиториями, контроль доступа и некоторые другие функции, такие как вики, организации, сущности и многое другое.
Как вы, возможно, уже знаете, есть масса данных, которые нужно захватить. В этом руководствевы узнаете, как использовать Github API v3 в Python, используя как запросы, так и библиотеки PyGithub.
Для начала установим зависимости:
pip3 install PyGithub requests
Получение данных пользователя
Поскольку использовать Github API v3 довольно просто, вы можете сделать простой запрос GET на определенный URL-адрес и получить результаты:
import requests from pprint import pprint # Имя пользователя github username = "x4nth055" # url для запроса url = f"https://api.github.com/users/{username}" # делаем запрос и возвращаем json user_data = requests.get(url).json() # довольно распечатать данные JSON pprint(user_data)
Здесь я использовал свою учетную запись, вот часть возвращенного JSON (вы также можете увидеть его в браузере):
{'avatar_url': 'https://avatars3.githubusercontent.com/u/37851086?v=4', 'bio': None, 'blog': 'https://www.thepythoncode.com', 'company': None, 'created_at': '2018-03-27T21:49:04Z', 'email': None, 'events_url': 'https://api.github.com/users/x4nth055/events{/privacy}', 'followers': 93, 'followers_url': 'https://api.github.com/users/x4nth055/followers', 'following': 41, 'following_url': 'https://api.github.com/users/x4nth055/following{/other_user}', 'gists_url': 'https://api.github.com/users/x4nth055/gists{/gist_id}', 'gravatar_id': '', 'hireable': True, 'html_url': 'https://github.com/x4nth055', 'id': 37851086, 'login': 'x4nth055', 'name': 'Rockikz', <..SNIPPED..>
Много данных, поэтому использование одной только библиотеки запросов не поможет извлечь эту тонну данных вручную, в результате на помощь приходит PyGithub.
Получение публичных репозиториев пользователя
Давайте получим все общедоступные репозитории пользователя с помощью только что установленной библиотеки PyGithub:
import base64 from github import Github from pprint import pprint # Github username username = "x4nth055" # pygithub object g = Github() # get that user by username user = g.get_user(username) for repo in user.get_repos(): print(repo)
Вот мой результат:
Repository(full_name="x4nth055/aind2-rnn") Repository(full_name="x4nth055/awesome-algeria") Repository(full_name="x4nth055/emotion-recognition-using-speech") Repository(full_name="x4nth055/emotion-recognition-using-text") Repository(full_name="x4nth055/food-reviews-sentiment-analysis") Repository(full_name="x4nth055/hrk") Repository(full_name="x4nth055/lp_simplex") Repository(full_name="x4nth055/price-prediction") Repository(full_name="x4nth055/product_recommendation") Repository(full_name="x4nth055/pythoncode-tutorials") Repository(full_name="x4nth055/sentiment_analysis_naive_bayes")
Хорошо, поэтому я сделал простую функцию для извлечения полезной информации из этого объекта репозитория:
def print_repo(repo): # repository full name print("Full name:", repo.full_name) # repository description print("Description:", repo.description) # the date of when the repo was created print("Date created:", repo.created_at) # the date of the last git push print("Date of last push:", repo.pushed_at) # home website (if available) print("Home Page:", repo.homepage) # programming language print("Language:", repo.language) # number of forks print("Number of forks:", repo.forks) # number of stars print("Number of stars:", repo.stargazers_count) print("-"*50) # repository content (files & directories) print("Contents:") for content in repo.get_contents(""): print(content) try: # repo license print("License:", base64.b64decode(repo.get_license().content.encode()).decode()) except: pass
Объект репозитория имеет много других полей, я предлагаю вам использовать dir(repo)
, чтобы получить поля, которые вы хотите распечатать. Давайте снова переберем репозитории и воспользуемся только что написанной функцией:
# перебрать все публичные репозитории for repo in user.get_repos(): print_repo(repo) print("="*100)
Это напечатает некоторую информацию о каждом публичном репозитории этого пользователя:
==================================================================================================== Full name: x4nth055/pythoncode-tutorials Description: The Python Code Tutorials Date created: 2019-07-29 12:35:40 Date of last push: 2020-04-02 15:12:38 Home Page: https://www.thepythoncode.com Language: Python Number of forks: 154 Number of stars: 150 -------------------------------------------------- Contents: ContentFile(path="LICENSE") ContentFile(path="README.md") ContentFile(path="ethical-hacking") ContentFile(path="general") ContentFile(path="images") ContentFile(path="machine-learning") ContentFile(path="python-standard-library") ContentFile(path="scapy") ContentFile(path="web-scraping") License: MIT License <..SNIPPED..>
Я усек весь вывод, так как он вернет все репозитории и их информацию, вы можете видеть, что мы использовали метод repo.get_contents("")
для получения всех файлов и папок этого репозитория, PyGithub анализирует его в объект ContentFile
, используйте dir(content)
, чтобы увидеть другие полезные поля.
Кроме того, если у вас есть частные репозитории,вы можете получить к ним доступ, аутентифицировав свою учетную запись (используя правильные учетные данные) с помощью PyGithub следующим образом:
username = "username" password = "password" # authenticate to github g = Github(username, password) # get the authenticated user user = g.get_user() for repo in user.get_repos(): print_repo(repo)
Github также предлагает использовать запросы с аутентификацией, так как это вызовет исключение RateLimitExceededException, если вы используете общедоступный (без аутентификации) и превысите небольшое количество запросов.
Поиск репозиториев
Github API довольно богат, вы можете искать репозитории по определенному запросу, как и на веб-сайте:
# поиск репозиториев по имени for repo in g.search_repositories("pythoncode tutorials"): # распечатать сведения о репозитории print_repo(repo)
Это вернет 9 репозиториев и их информацию.
Вы также можете искать по языку программирования или теме:
# поиск по языку программирования for i, repo in enumerate(g.search_repositories("language:python")): print_repo(repo) print("="*100) if i == 9: break
Чтобы выполнить поиск по определенной теме, вы просто указываете что-то вроде topic:machine-learning
в методе search_repositories()
.
Управление файлами в воём репозитории
Если вы используете версию с аутентификацией, вы также можете очень легко создавать, обновлять и удалять файлы с помощью API:
# поиск моего репозитория repo = g.search_repositories("pythoncode tutorials")[0] # создать файл и зафиксировать n push repo.create_file("test.txt", "commit message", "content of the file") # удалить созданный файл contents = repo.get_contents("test.txt") repo.delete_file(contents.path, "remove test.txt", contents.sha)
Приведенный выше код представляет собой простой вариант использования, я искал конкретный репозиторий, я добавил новый файл и назвал его test.txt, я поместил в него некоторый контент и сделал фиксацию. После этого я взял содержимое этого нового файла и удалил его (и он также будет считаться фиксацией git).
И действительно, после выполнения вышеуказанных строк кода,коммиты были созданы и отправлены:
Заключение
Мы только поцарапали поверхность в Github API, есть много других функций и методов, которые вы можете использовать, и, очевидно, мы не можем охватить их все, вот некоторые полезные из них, которые вы можете протестировать самостоятельно:
g.get_organization(login)
: возвращает объект Organization, который представляет организацию Github.g.get_gist(id)
: возвращает объект Gist, который представляет суть в Github.g.search_code(query)
: возвращает разбитый на страницы список объектов ContentFile, в которых он представляет совпадающие файлы в нескольких репозиториях.g.search_topics(query)
: возвращает разбитый на страницы список объектов Topic, в которых он представляет тему Github.g.search_commits(query)
: возвращает разбитый на страницы список объектов фиксации, в которых он представляет фиксацию в Github.
Их гораздо больше, используйте dir(g)
, чтобы получить другие методы, проверьте документацию PyGithub или API Github для получения подробной информации.
По мотивам How to Use Github API in Python