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

Опубликовано Вадим В. Костерин

ст. преп. кафедры ЦЭиИТ. Автор более 130 научных и учебно-методических работ. Лауреат ВДНХ (серебряная медаль).

Оставьте комментарий

Ваш адрес email не будет опубликован.