Клиенту требуется автоматически экспортировать данные с сайта Seamless.ai
К сожалению, у данного сервиса не реализован доступ через API, только интеграция с Zapier, но он в разы дороже Make.
Ручная выгрузка данных осуществляется через нажатие кнопки экспорта с выбором типа данных и временного диапазона. Далее происходит некоторый процесс и в результате начинается загрузка CSV файла.
Предположение заключается в том, что если мы можем скачать файл, то существует некий запрос, который можно отправить на сервер и получить этот файл.
Начинаем искать нужный запрос:
Открываем консоль разработчика в браузере (F12 или ПКМ+Исследовать элемент)
Заходим в вкладку Network - отображает список активностей (запросы, выполнение скриптов и тп)
Скачиваем вручную файл и находим в списке событий нужное событие - contacts.csv
Если заглянуть внутрь, то мы увидим, что это обычный запрос, в query string которого передается токен и параметры выгрузки.
Возникает вопрос - этот токен генерируется под каждую загрузку или он статический?
Делаем еще одну выгрузку с теми же параметрами для чистоты эксперимента и видим, что токен поменялся - значит нам нужно найти, как он генерируется.
Смотрим на предыдущий запрос csv и видим, что в ответе на этот запрос мы получаем тот самый токен.
Значит нам нужно сделать такой же запрос и получить этот токен, чтобы скачать файл.
Мы видим, что в запросе не используются query string, значит этот запрос уникален чем-то другим.
Обычно для авторизации используются заголовки - в них передаются токены клиента. В этом запросе находим заголовок Authorization. В нем находится JWT token, который по своей сути является кодированной информацией о пользователе.
Пробуем собрать HTTP запрос с полученными данными.
На выходе получаем ошибку 400, которая говорит об отсутствии в запросе данных о fingerprint пользователя. Fingerprint - цифровой отпечаток устройства, который состоит из данных об устройстве пользователя и используется для его идентификации. Со слов клиента компания не любит и отслеживает заход в аккаунт с различных устройств/IP-адресов.
Возвращаемся назад к запросу и ниже находим нужный нам параметр.
Добавляем найденный параметр к запросу и получаем на выходе токен для загрузки файла.