В статье я расскажу, как мне удалось скачать базу 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).
Выполнив этот 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 и, чтобы не париться, сразу навайбкодил готовый скрипт.
-
При запуске он просит меня вставить cURL запроса страницы
index?колбаса, чтобы извлечь из него параметры действующей сессии. -
Выполняет этот запрос, получает нужные ID клиентов и проходит по страницам списка.
-
Для каждого ID выполняет найденные шаблонные Fetch/XHR-запросы, получая данные клиента. В зависимости от конкретного endpoint ответом может быть JSON или HTML-фрагмент.
-
Сохраняет сырые данные для последующей аналитики.
Самое приятное, что если мы до первого шага настроим фильтры — выберем менеджера или ещё что-то, — то скопированный cURL уже содержит параметры этой выборки, и скрипт будет обходить именно её. Дополнительно воспроизводить эти фильтры в программе не надо.
Это удобно, если вы хотите, например, посмотреть топ самых ценных клиентов, за которыми не закреплён менеджер.
Ну, вы поняли))
А зачем всё это?
Сама по себе польза от скачанной базы довольно абстрактна, но последующая аналитика этих данных даёт уже вполне прикладные и ценные результаты:
-
Кроме собственно базы, мне удалось построить граф переходов клиентов — от каких продуктов к каким они чаще всего переходят и через какое время. Это даёт понимание, какие продукты логичнее предлагать конкретному клиенту в зависимости от уже пройденного им пути. По наиболее частым маршрутам можно выделить несколько типовых групп клиентов.
-
Найдено, какие продукты в действительности приносят больше всего денег, и смогли сосредоточиться на них. Оказалось, что лидер — вовсе не самый дорогой продукт, а относительно недорогой, зато регулярно покупаемый.
-
Разумеется, получили скоринг клиентской базы по истории покупок, их давности, суммам, активности и другим доступным признакам. Например, из 800 клиентов система выделила 27 горячих и 70 тёплых. И это уже совсем другая отправная точка для работы менеджера вместо случайного тыканья по базе.
Вместо заключения
Кому лень всё это делать самому — обращайтесь к специалистам. Думаю, статья довольно понятно объяснила логику.
Разумеется, можно было сделать полноценный скрипт, который работает непосредственно с браузерной сессией, сам получает необходимые данные, управляет фильтрами и вообще более UX-ориентирован.
Но не надо забывать, что мы используем внутренние запросы веб-интерфейса, а не публичный API GetCourse. Их структура, URL и формат ответов могут измениться после очередного релиза платформы, поэтому такой инструмент требует сопровождения.
ссылка на оригинал статьи https://habr.com/ru/articles/1074998/