Скачать базу GetCourse без API? Пожалуйста

от автора

В статье я расскажу, как мне удалось скачать базу GetCourse с одним только логином и паролем обычного менеджера. Разумеется, скачать можно только то, что доступно самому менеджеру. Но эти данные могут быть очень полезны для аналитики, если хочется видеть картину целиком из сотен и тысяч клиентов.

Начнём с API

Как человек, ничего не понимающий в GetCourse, но понимающий в технике, первым делом я попытался приконнектиться к API GetCourse с логином и паролем.

curl "https://имя.getcourse.ru/pl/api/account/users?key=***&email=***"

Получаем:

{"success":false,"info":[],"error_message":"Неавторизованное API-обращение","error":true,"error_code":901}

Что это значит на практике

Ошибка 901 в GetCourse — неавторизованное API-обращение. Среди причин — неверное имя аккаунта или некорректный API-ключ. В моём случае всё проще: API-ключа у менеджера вообще не было.

Тут респект разработчикам — штатный доступ к API возможен только с секретным API-ключом, который генерирует владелец аккаунта или администратор с соответствующими правами. У моего клиента таких прав не было, а светиться и просить ключ — не очень хорошая идея. К тому же всё равно его не дали бы — просто из… недалёкого соображения.

Грусть-печаль, идём дальше.

Смотрим, что делает браузер

Открываем инструменты разработчика (DevTools) в браузере — клавиша F12. Переходим на вкладку Network (1), в ней пока оставляем All (2). Там находим запрос index?длинная_колбаса (3) и копируем его как cURL в буфер обмена (4).

скрин DevTools

скрин DevTools

Выполнив этот cURL в консоли, вы, разумеется, увидите сырой ответ в виде HTML. А всё потому, что в браузере мы уже авторизованы в GetCourse и при запросе передаём серверу cookies действующей сессии.

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

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

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

Ищем ID клиентов

Смотрим ещё раз внимательно полученный HTML и обнаруживаем, что у каждого клиента есть уникальный ID типа такого:

<a href="/../user/control/user/update/id/230281593">Вася Пупкин</a>

Запоминаем его и идём на страницу этого клиента.

При этом DevTools по-прежнему перед нами, но уже переходим на вкладку Fetch/XHR. Тут обнаруживаем запросы, которые выполняет интерфейс при загрузке карточки. Можете потыкать их и посмотреть ответы.

Среди них находим запрос, содержащий основной массив информации, которую мы видим в карточке. Но ещё не всю, которую хотим!

Пока копируем себе в блокнот эту ссылку и убеждаемся, что ID соответствует нашему дорогому Васе.

Ищем остальные данные клиента

Далее аккуратно протыкиваем все нужные вкладки клиента, например «Заказы пользователя», и видим, как в DevTools появляются новые запросы. Нетрудно будет найти нужные и тоже скопировать себе.

Так аккуратно получаем все нужные нам источники данных.

Заметьте, запросы к данным конкретного клиента используют его ID. а дальше для остальных пользователей всё работает по тому же шаблону — меняй ID, которые мы пачкой получаем с первой страницы.

Вот тут ручная работа, собственно, и заканчивается.

Автоматизируем

Дальше дело разработки. Язык можно использовать любой. Я взял Python и, чтобы не париться, сразу навайбкодил готовый скрипт.

  1. При запуске он просит меня вставить cURL запроса страницы index?колбаса, чтобы извлечь из него параметры действующей сессии.

  2. Выполняет этот запрос, получает нужные ID клиентов и проходит по страницам списка.

  3. Для каждого ID выполняет найденные шаблонные Fetch/XHR-запросы, получая данные клиента. В зависимости от конкретного endpoint ответом может быть JSON или HTML-фрагмент.

  4. Сохраняет сырые данные для последующей аналитики.

Самое приятное, что если мы до первого шага настроим фильтры — выберем менеджера или ещё что-то, — то скопированный cURL уже содержит параметры этой выборки, и скрипт будет обходить именно её. Дополнительно воспроизводить эти фильтры в программе не надо.

Это удобно, если вы хотите, например, посмотреть топ самых ценных клиентов, за которыми не закреплён менеджер.

Ну, вы поняли))

А зачем всё это?

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

  • Кроме собственно базы, мне удалось построить граф переходов клиентов — от каких продуктов к каким они чаще всего переходят и через какое время. Это даёт понимание, какие продукты логичнее предлагать конкретному клиенту в зависимости от уже пройденного им пути. По наиболее частым маршрутам можно выделить несколько типовых групп клиентов.

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

  • Разумеется, получили скоринг клиентской базы по истории покупок, их давности, суммам, активности и другим доступным признакам. Например, из 800 клиентов система выделила 27 горячих и 70 тёплых. И это уже совсем другая отправная точка для работы менеджера вместо случайного тыканья по базе.

Вместо заключения

Кому лень всё это делать самому — обращайтесь к специалистам. Думаю, статья довольно понятно объяснила логику.

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

Но не надо забывать, что мы используем внутренние запросы веб-интерфейса, а не публичный API GetCourse. Их структура, URL и формат ответов могут измениться после очередного релиза платформы, поэтому такой инструмент требует сопровождения.

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