Как мы делали уведомление о коммитах
Предыстория…
Не знаю как у других, но мне с другом очень нравится видеть всю активность друг друга, логи и статистику своих проектов. Обычно для этого используем телеграм чат с топиками.
Но вот незадача, часть репозиториев на гитхабе приватны, а видеть прогресс в любое время хочется… Почему то, что репозитории приватны — проблема? Потому что в телеграме давно есть бот, который уведомляет о различных ивентах в репозиториях:
Но он отказывается работать с приватными репозиториями, т.к. токен создаваемый им не запрашивает на это разрешение.
Тогда было придумано 2 варианта решения проблемы (спойлер, оба в итоге провальны):
Создать через Github Actions уведомление
Создать скрипт, который будет проверять последний коммит раз в время
Первый вариант сразу был отброшен, а второй побежал реализовать мой друг.
Он реализовал это очень быстро используя REST API Github, но упёрся в ограничение по запросам в час:
~ 83 запроса в минуту, или чуть больше одного запроса в секунду.
Для одного репозитория хватило бы легко, но у нас 3 репозитория, которые активно изменяются. Тогда я нашёл человека, у которого был свой бот для уведомлений, и узнал что всё донельзя просто, и надо было… надо было просто прочитать документацию.
Кто-то читает документации?
вот этот добрый человек, подсказавший мне о вебхуках
https://docs.github.com/en/webhooks
И следующим моим шагом было создание наброска кода, который повесит на репозиторий вебхук и поднимет API, ожидающий запрос от гитхаба:
https://gist.github.com/vsecoder/8b8a6e5eed301b81ff1cb79df71e00f1
Код всего 82 строчки, и состоит из аунтефикации, создания вебхука, и запуска API.
from github import Auth, Github
auth = Auth.Token(GH_TOKEN)
g = Github(auth=auth)
repo = g.get_repo("vsecoder/fun") # приватный репозиторий
repo.create_hook("web", config, EVENTS, active=True)
Код был взят из примера документации к модулю PyGithub, отлично решал нашу задачу, но меня уже было не остановить, захотелось большего, а точнее open source бота, что бы он мог конкурировать с ботом, речь о котором шла выше.
Создать самого бота было не тяжело, но возникло 2 проблемы:
Сложно тестировать, я повторил ошибку с тем, что не прочитал документацию, в которой был указан сайт https://smee.io/ для удобного тестирования веб перехватчиков
Пришлось для каждого ивента писать своё сообщение (заняло наибольший промежуток времени)
По итогу вышел достаточно рабочий бот:
https://github.com/vsecoder/github-notifi-bot
Но бот однозначно нуждается в огромном количестве доработок, от создания сообщений с другими ивентами (forks, pull requests и др.), оптимизации кода и банальной проверки на подлинность запроса от гитхаба.
Буду очень рад предложениям по улучшению, знаю что код мягко говоря плохой, но писался на чистом энузиазме.