Использование интерфейса программирования приложений 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
