
Этот пост будет полезен двум категориям людей: IT-рекрутерам и начинающим разработчикам, которые хотят научиться писать простенькие программы для решения практических задач.
Задача: известен профиль пользователя на GitHub, необходимо найти email этого пользователя
Идея написать бота пришла ко мне после того, как коллега поделилась со мной способом, которым эту задачу решают IT-рекрутеры:
1. Нужно ввести в адресную строку https://api.github.com/users/ник жертвы/events/public и открыть страницу
2. Нажать Ctrl+F и найти все символы "@"
3. Отсмотреть результаты и найти всё, что похоже на адрес электронной почты

На тот момент я ещё не знал о существовании EmailOnGitHub в Chrome Store и принялся писать бота на Python:
import requests, telebot, time tkn = 'ваш_токен_телеграм_бота' bot = telebot.TeleBot(tkn) # Обработчик сообщения /start @bot.message_handler(commands=['start']) def start_message(message): bot.send_message(message.chat.id, 'Привет, я помогу тебе найти email пользователя гитхаб по его нику. Отправь мне ник пользователя и, если он существует, я найду его почту') # Любое сообщение боту - это запрос на поиск по нику на гитхаб # В качестве ответа отправляется результат выполнения функции email_finder @bot.message_handler(content_types=['text']) def send_text(message): bot.send_message(message.chat.id, email_finder(message.text))
Предполагается, что пользователь будет отправлять боту только ники людей на гитхаб, а наш бот, в свою очередь, отправляет любое входящее сообщение в функцию email_finder.
Эта функция должна возвращать либо электронную почту цели, либо ошибку. Приступим к написанию функции:
# Функция осуществляет запрос к апи гитхаб, на выходе отображает список публичных действий юзера # Нас интересуют только коммиты, в них есть email автора коммита def email_finder(nick): rawlist, newlist = [], [] # Делаем запрос на гитхаб, в запрос подставляем ник из входящего сообщения url = f'https://api.github.com/users/{nick}/events/public' r = requests.get(url) # Проверка существования адреса # Если пользователь найден - идем дальше по циклу, иначе выходим if r.status_code == 200: print('status 200 - OK') # Если пользователь найден, но возвращается пустой массив, то у юзера нет коммитов # Выходим из цикла с сообщением "Невозможно найти почту" if not r.json(): return 'Пользователь найден. Невозможно найти email.' elif url_status == 404: return 'Юзер с таким ником не найден' else: return 'Неизвестная ошибка' # Поиск и выгрузка коммитов for element in r.json(): if element['type'] == 'PushEvent': for commit in element['payload']['commits']: # Наполняем список всеми почтами из коммитов пользователя email = commit['author']['email'] rawlist.append(email) f_list = 'Найдены электронные ящики: \n' # Удаляем повторы из списка и форматируем новый список for i in rawlist: if i not in newlist: newlist.append(i) for element in newlist: f_list = f_list + element + '\n' return f_list
Основная часть готова. Остаётся добавить следующие строки:
# Чтобы бот не падал while True: try: print('Слушаю сообщения...') bot.infinity_polling(True) except Exception as e: print('Я упал') time.sleep(15)
Наш бот для поиска почты готов, можно запускать и пользоваться. Пробная версия доступна по адресу @GitSorcerBot
Если пользователь публиковал коммиты и оставлял свою почту, бот выведет результат:

