Вводные данные

Клиенту требуется автоматически экспортировать данные с сайта Seamless.ai

К сожалению, у данного сервиса не реализован доступ через API, только интеграция с Zapier, но он в разы дороже Make.

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

Untitled

Предположение заключается в том, что если мы можем скачать файл, то существует некий запрос, который можно отправить на сервер и получить этот файл.

Решение

Начинаем искать нужный запрос:

Screenshot 2021-09-05 at 13.30.00.png

  1. Открываем консоль разработчика в браузере (F12 или ПКМ+Исследовать элемент)

  2. Заходим в вкладку Network - отображает список активностей (запросы, выполнение скриптов и тп)

    1. Красная кнопка - кнопка включени/выключения записи событий.
    2. Кнопка удаления - очищает лог
    3. Preverse log - (не)сохраняет данные при переадресации на другую страницу
    4. Поиск - ищет внутри загруженных данных
  3. Скачиваем вручную файл и находим в списке событий нужное событие - contacts.csv

  4. Если заглянуть внутрь, то мы увидим, что это обычный запрос, в query string которого передается токен и параметры выгрузки.

    Возникает вопрос - этот токен генерируется под каждую загрузку или он статический?

    Делаем еще одну выгрузку с теми же параметрами для чистоты эксперимента и видим, что токен поменялся - значит нам нужно найти, как он генерируется.

  5. Смотрим на предыдущий запрос csv и видим, что в ответе на этот запрос мы получаем тот самый токен.

    Значит нам нужно сделать такой же запрос и получить этот токен, чтобы скачать файл.

    Мы видим, что в запросе не используются query string, значит этот запрос уникален чем-то другим.

    Обычно для авторизации используются заголовки - в них передаются токены клиента. В этом запросе находим заголовок Authorization. В нем находится JWT token, который по своей сути является кодированной информацией о пользователе.

  6. Пробуем собрать HTTP запрос с полученными данными.

    На выходе получаем ошибку 400, которая говорит об отсутствии в запросе данных о fingerprint пользователя. Fingerprint - цифровой отпечаток устройства, который состоит из данных об устройстве пользователя и используется для его идентификации. Со слов клиента компания не любит и отслеживает заход в аккаунт с различных устройств/IP-адресов.

  7. Возвращаемся назад к запросу и ниже находим нужный нам параметр.

  8. Добавляем найденный параметр к запросу и получаем на выходе токен для загрузки файла.

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