Как найти email пользователя GitHub и написать Telegram бота для решения этой задачи?

от автора

Мем с просторов интернета
Мем с просторов интернета

Этот пост будет полезен двум категориям людей: 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
Если пользователь публиковал коммиты и оставлял свою почту, бот выведет результат:

ссылка на оригинал статьи https://habr.com/ru/post/538404/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *