В этом кейсе вы узнаете, как IT-рекрутеры могут автоматизировать поиск кандидатов по никнеймам в Telegram и перевести его из ручного процесса в почти промышленный.

Мы будем использовать информацию об участниках чата в Telegram в качестве базы никнеймов, но вы можете применить любой другой альтернативный источник данных и начинать с 4-го шага.

Шаг 1. Регистрация аккаунта в Telegram через виртуальный номер

Не будем вдаваться в подробности на этом этапе. Вы можете арендовать виртуальный номер через сервисы вроде sms-activate.io, 5sim.biz или onlinesim.io и зарегистрировать новый аккаунт, чтобы не использовать свой личный или рабочий номер. Если Telegram не присылает вам проверочный код при регистрации, просто купите готовый аккаунт на таких площадках, как Plati.Market, lzt.market или funpay.com.

Шаг 2. Регистрация нового приложения в Telegram

  • Перейдите на страницу Telegram для разработчиков:

    • Перейдите в браузере по следующей ссылке: my.telegram.org.

    • Войдите в свой Telegram аккаунт, используя номер телефона, который вы используете в приложении Telegram.

  • Создайте новое приложение:

    • После входа вы попадете на страницу "App Configuration".

    • Нажмите на кнопку "API Development Tools" или "Создать приложение".

    • Заполните форму с информацией о вашем новом приложении:

      • App title: Название вашего приложения (например, MyParserApp).

      • Short name: Краткое имя для вашего приложения (например, parser).

      • Platform: Выберите платформу, на которой будет работать приложение (например, Desktop).

      • Description: Можете оставить описание (например, Application for Telegram data parsing).

    • Нажмите "Create" или "Создать".

  • Получите API ID и API Hash:

    • После создания приложения вы увидите свой API ID и API Hash.

    • Сохраните эти значения — они потребуются для работы с библиотекой Telethon.


    Здесь сторонний гайд с картинками

    Если при регистрации приложения у вас вылезет ошибка, то попробуйте обновить страницу, использовать латинские буквы и цифры без пробелов или поменять\выключить VPN

Шаг 3. Парсинг участников Telegram чата

Для примера я буду использовать чат DevOps специалистов (или около того) "@kubernetes_ru". Ваш новый аккаунт должен состоять в данном чате.

Я запускаю код в PyCharm, а моя основная среда разработки - ChatGPT. Претензий к качеству кода не принимаю.

Установите библиотеку telethon -- pip instal thelethon
Скопируйте код ниже и укажите собственные значения в блоке с учетными данными**

from telethon import TelegramClient
from telethon.tl.types import User

# Учетные данные для авторизации
api_id = 'ЗАПОЛНИТЬ'  # Ваш api_id
api_hash = 'ЗАПОЛНИТЬ'  # Ваш api_hash
phone_number = 'ЗАПОЛНИТЬ'  # Ваш номер телефона
channel = '@kubernetes_ru'  # Название или ID канала/чата

# Автоматическое создание имени файла на основе имени канала
output_file = f"{channel.replace('@', '')}_users.txt"

# Создаем клиент Telegram с сохранением сессии
client = TelegramClient('session_name', api_id, api_hash)

async def main():
    # Авторизация
    await client.start(phone=phone_number)
    if not await client.is_user_authorized():
        print("Не удалось авторизоваться.")
        return

    print(f"Сбор участников из чата: {channel}")

    # Получаем всех участников чата
    participants = await client.get_participants(channel)

    # Создаем список юзернеймов без @ в начале
    usernames = [user.username for user in participants if isinstance(user, User) and user.username]

    # Сохранение юзернеймов в файл
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write('\n'.join(usernames))

    print(f"Сохранено {len(usernames)} юзернеймов в файл '{output_file}'.")

# Запуск программы
with client:
    client.loop.run_until_complete(main())

В первый раз программа попросит вас ввести номер телефона и код авторизации в Telegram, который поступит через уведомления в приложении. В дальнейшем вводить его не потребуется.

По результатам работы скрипта данные будут сохранены в txt файл.

Наша база никнеймов
Наша база никнеймов

** Этот скрипт может собирать никнеймы только из чатов с видимыми участниками. Что делать, если участники чата скрыты, я напишу в следующих статьях на своем канале.

участники в чате видимы
участники в чате видимы

Шаг 4. Работа со Snoop

Snoop — это мощный OSINT-инструмент для поиска профилей по никнейму на более чем 4400 различных площадках. Это отечественный проект, который включает в себя поиск по популярным в СНГ ресурсам, а также предлагает удобные настройки, такие как управление регионом поиска. Snoop позволяет искать информацию как точечно по одному никнейму, так и по целым спискам.

Кроме того, Snoop предоставляет ряд опций для настройки поиска:

  • Вы можете управлять временем ожидания ответа от серверов, чтобы избегать ошибок, вызванных медленным интернет соединением.

  • Инструмент поддерживает исключение или включение регионов поиска. Можно выбрать поиск только по русскоязычным ресурсам.

  • Snoop также предлагает возможность поиска по конкретным сайтам из базы данных или использовать динамически обновляемую web-базу из более чем 4000 сайтов .

Будем исходить из того, что вы работаете на Windows.
Как все это делать на MacOS я без понятия :) Смотрите документацию в репрозитории.
Если вы работаете на Linux, то вы и так со всем разберетесь без моих советов.

Демонстрация работы программы выполнена в demo доступе, поиск в котором урезан до 290 площадок, но даже их вполне себе хватает для работы рекрутера. Годовая лицензия с полным доступом стоит 20$ и включает в себя >4400 площадок. Цена очень бюджетная.

Инструкция:

  1. Скачайте архив с github по этой ссылке Snoop_for_Windows.rar

  2. Распакуйте архив и откройте командную строку (Win+R ---> cmd)

  3. Чтобы искать информацию по точечно по 1 никнейму перетащите exe-файл в командную строку и добавьте параметры -f ВАШ_ЮЗЕРНЕЙМ -t 9

    Запуск программы
    Запуск программы
    Результаты поиска
    Результаты поиска

    Далее вы можете просто скопировать все ссылки в карточку с информацией о кандидате прямо из терминала программы. Открывшееся окно в браузере можете закрыть.

  4. Если вы хотите обработать список никнеймов, то скопируйте путь к вашему файлу с никнеймами через left shift + right click

    Он будет как-то так "C:\Users\Пользователь\PycharmProjects\pythonProject1\kubernetes_ru_users.txt"
    Он будет как-то так "C:\Users\Пользователь\PycharmProjects\pythonProject1\kubernetes_ru_users.txt"
  5. Перетащите exe файл в терминал как в пункте 3 и добавьте к нему параметры --userlist "ПУТЬ_К ВАШЕМУ_ФАЙЛУ_СО_СПИСКОМ" -t 9

    Вы увидите что-то подобное
    Вы увидите что-то подобное
  6. Запустите программу и дождитесь ее выполнения.

    Закрасил некоторые запрещенные и нежелательные ссылки. Уменьшил базу до 20 значений (см. примечание)
    Закрасил некоторые запрещенные и нежелательные ссылки. Уменьшил базу до 20 значений (см. примечание)

    В результате выполнения вы получите набор отдельных файлов в нескольких форматах: html, txt и csv.

    Вы можете посмотреть их, скопировав путь из браузера в explorer.

    намекает, что надо бы купить лицензию
    намекает, что надо бы купить лицензию

    Откроем какой-нибудь из них. Например в txt формате.

    Видим, что такой формат данных не подходит для дальнейшей работы с ними, поэтому сделаем ряд процедур, чтобы сформировать более удобную базу данных в виде csv таблицы.

  7. Откроем командную строку прямо из папки. Для этого введите cmd в адресную строку.

  8. В открывшемся терминале напишем copy *.txt all_results.txt

  9. В результате получим один общий файл с данными для всех наших никнеймов.

    С таким документом по прежнему нельзя работать
    С таким документом по прежнему нельзя работать
  10. Скопируем в нашу IDE следующий код, который почистит данные и отформатирует их в более удобный вид.

    import pandas as pd
    import re
    
    
    def parse_data(filename):
        data = []
        current_username = None
        current_links = []
    
        with open(filename, 'r', encoding='utf-8') as file:
            for line in file:
                line = line.strip()
    
                # Пропускаем пустые строки
                if not line:
                    continue
    
                # Поиск юзернейма
                username_match = re.match(r"Запрашиваемый объект: <(.+?)>", line)
                if username_match:
                    # Если есть предыдущие ссылки, сохраняем их с текущим юзернеймом
                    if current_username and current_links:
                        data.append({"Username": current_username, "Links": "\n".join(current_links)})
    
                    # Обновляем текущий юзернейм и сбрасываем список ссылок
                    current_username = username_match.group(1)
                    current_links = []
                    continue
    
                # Пропускаем строки с "©2020-2024 «Snoop Project» (demo version).Адрес | ресурс"
                if line.startswith("©2020-2024"):
                    continue
    
                # Поиск строк с URL и ресурсами (содержат " | ")
                if "|" in line:
                    url, _ = line.split(" | ")
                    current_links.append(url.strip())
    
            # Добавляем последние накопленные данные
            if current_username and current_links:
                data.append({"Username": current_username, "Links": "\n".join(current_links)})
    
        return data
    
    
    # Имя вашего входного текстового файла
    input_filename = r'ПУТЬ_К_ВАШЕМУ ФАЙЛУ'  # Укажите путь к вашему файлу
    
    # Парсинг данных из файла
    parsed_data = parse_data(input_filename)
    
    # Преобразование данных в DataFrame
    df = pd.DataFrame(parsed_data)
    
    # Сохранение данных в Excel
    output_filename = 'НАЗВАНИЕ_ТАБЛИЦЫ.xlsx'
    df.to_excel(output_filename, index=False)
    
    print(f"Данные успешно сохранены в {output_filename}!")
  11. Копируем путь новому файлу со всеми никнеймами через left shift+right click. И вставляем его в новый код. Строчка №47.


  12. Запускаем скрипт, получаем сообщение, что таблица успешно сформирована.

  13. Открываем новую таблицу и видим, что теперь данные преобразовались в удобный для работы формат.

  14. Если все получилось, то я вас поздравляю. Теперь вы профессиональный сорсер. Можете написать слово OSINT в резюме и просить прибавку к зарплате.

Примечание:
В данном примере я сократил список никнеймов с 8 тысяч до 20 штук для демонстрации. Можно проверить все 8 тысяч, но потребуется значительно больше времени.

Также, помните, что найденные вами ссыли на ресурсы не обязательно связаны с никнеймом целевого кандидата. Чем популярнее ник, тем чаще его используют разные люди.

Заключение

Как вы видите, даже минимальные навыки работы с Python и доступ к любой современной LLM открывает перед IT рекрутером довольно нетривиальные способы поиска кандидатов, а это значит, что вы можете собирать свои почти уникальные базы данных и работать с ними.

Если вас интересует продвинутый сорсинг, подписывайтесь на мою группу "Сорсинг для извращенцев". В ней мы разберем, как извлекать участников из чатов, даже если администратор скрыл их с помощью настроек приватности. Также, если вам нужен внутренний или внешний IT-рекрутер, вы всегда можете связаться со мной в Telegram: @rudenko_telegram.

Комментарии (21)


  1. Hitriy_Zhuk
    08.09.2024 11:34

    помните, что найденные вами ссыли на ресурсы не обязательно связаны с никнеймом целевого кандидата

    Так без ссылки на телегу в ресурсе по ссылке - это вообще гадание на кофейной гущще.


    1. rudix0 Автор
      08.09.2024 11:34

      Часто совпадают ник+фотография или ник+должность/технологии


  1. Olegbashilov
    08.09.2024 11:34

    Илья, статья хорошая, но хотелось бы каких-то кейсов с практической пользой.
    Чем этот подход лучше, чем Amazinghiring и Podbor.io?
    Вижу, что сильно больше источников, но поиск идет только по никнейму из телеграма и многие источники кажутся бесполезными (типа яндекс.музыки и тиктока). Плюс, никнейм в тг может не совпадать с никнеймами в других сервисах (как, например, у меня).


    1. rudix0 Автор
      08.09.2024 11:34

      Ты можешь на коленке сформировать себе базу кандидатов за 2 тысячи рублей (цена лицензии). Это займет много времени, но зато почти бесплатно. Я не уверен, что AH и подбор используют такой же движок поиска как snoop, поэтому собранная тобой база может быть относительно уникальной. У данной базы будет много промахов, но ее можно будет использовать для дальнейшего расширения и валидизации профилей и собрать себе сервис вроде potok.io или AH (если они действительно собираются агрегированием информации в интернете).


  1. behemoth23
    08.09.2024 11:34

    Ну и бред. Расскажите уже челу про ГлазБога.


  1. ky0
    08.09.2024 11:34
    +8

    Рекрутёр, который придёт ко мне в личку из "какого-то ТГ-канала", а не из контактов моего резюме - то есть не зная моего опыта, стека, пожеланий по условиям труда и зарплате, обречён на очень быстрый провал.


    1. himch
      08.09.2024 11:34
      +1

      Пускай ко мне придёт хоть какой-то рекрутер, молю


    1. rudix0 Автор
      08.09.2024 11:34
      +1

      Стоит только указать в вакансии вилку х2 от текущей и все подобные сердитые дяди и тети, которые ругаются, что их достали рекрутеры, сразу же становятся вежливыми и охотно идут на контакт)


      1. ky0
        08.09.2024 11:34

        Меня не достали, честно говоря, даже наоборот - за последнее время стало существенно лучше. Да, поток предложений "у нас вилка до стольки, от скольки у вас в резюме и ещё удалёнка из РФ" стабилен, но сами предлагаемые вакансии по техническим критериям почти всегда релевантные.

        Предложения "х2 от текущей" были - но с элементами или полностью менеджерские. Ну или нормальная работа руками - но криптоскам, казино или прочие интересные сферы деятельности :)


      1. Areso
        08.09.2024 11:34

        а как вы узнаете текущую, чтобы "х2" указывать?

        Просто, мне кажется, что если вы опубликуете вакансию на лям (после НДФЛ, без учета премий) здесь и сейчас на любой площадке, уже завтра она будет у всех причастных и непричастных.


        1. rudix0 Автор
          08.09.2024 11:34

          а смысл предлагать человеку x2? Это уже постфактум узнается


  1. panzerfaust
    08.09.2024 11:34
    +6

    Спасибо за лишнее напоминание, что нужно обязательно завязывать с публичностью в сети. Рекрутеры даже с настоящим резюме на руках умудряются составить совершенно искаженное мнение о кандидате. Страшно представить, что будет, если они еще в осинтеров играть начнут.


    1. rudix0 Автор
      08.09.2024 11:34

      Ну это база. Есть крупные системы, которые не просто деанонят, но и проводят контент анализ всех комментариев в сети. Те рекрутеры, которые не понимают, что написано в резюме у кандидатов в осинтеров играть не начнут, т.к они любят играть в "профайлеров"


    1. ialexander
      08.09.2024 11:34

      Я использую генераторов ников, чтобы обеспечить уникальные ники на каждом сервисе. Но есть проблема - когда я делюсь именем ника по каким-либо причинам, часто следует вопрос, а что он означает. На что приходится отвечать, что просто рандомная последовательность букв.


  1. 40kTons
    08.09.2024 11:34

    У данного сорсинга есть недостаток - вы исходите из предположения, что у человека на всех сервисах ники одинаковые


    1. rudix0 Автор
      08.09.2024 11:34

      Нет, я про это специально, отдельно написал, что чем более популярный никнейм, тем более часто он будет встречаться. Надо в любом случае обрабатывать базу вручную


  1. kinall
    08.09.2024 11:34

    Даже на скрине видно, что итоговые данные "съехали" по строкам. Что-то тут не то)


    1. rudix0 Автор
      08.09.2024 11:34

      Где что сьехало?)


      1. kinall
        08.09.2024 11:34


        1. rudix0 Автор
          08.09.2024 11:34

          Действительно. Спасибо, что заметили


        1. rudix0 Автор
          08.09.2024 11:34

          Поспешил, не проверил. У себя в тг выложу новую версию скрипта