Как я улучшил своё взаимодействие с фитнес-клубом World Class, найдя и используя их API

Уже полгода хожу в фитнес клуб World Class или как пишут в самом клубе - являюсь его резидентом. Выбрал этот клуб в основном из-за наличия в нём бассейна. Потом заинтересовался групповыми программами и частенько хожу на сайкл тренировки - это тренировки на специальном велотренажере.

И единственное меня раздражает, что для просмотра расписания занятий на следующую неделю каждый раз приходилось идти на сайт сети Ворд Класс, переходить в мой клуб, отбиваться от нескольких назойливых баннеров которые предлагают перезвонить через 3 секунды для того чтобы стать их клиентом. И только после этого найти в огромном расписании несколько строчек которые я ищу. На неделе таких занятий может проходить несколько и я вносил их в свой календарь, чтобы сходить хотя бы на одно в неделю. Вся это операция с поиском и занесением в календарь занимала минут 15. И так каждую неделю.

Автоматически созданное при помощи скрипта событие в моём гугл календаре
Автоматически созданное при помощи скрипта событие в моём гугл календаре

В какой-то момент мне это надоело и я подумал, а не написать ли скрипт, который раз в неделю будет ходить на их сайт с расписанием и добавлять в мой календарь занятия на сайкле автоматически?

Некоторым препятствием стало то, что сайт World Class динамически загружает контент с помощью JavaScript после начальной загрузки страницы. Зато нашлась конечная точка API и теперь занятия по сайклу каждый понедельник ночью добавляются в мой календарь за 3 секунды работы скрипта вместо 15 минут моей жизни каждую неделю.

Веб-сайт с общедоступным расписанием клуба World Class

Обычно расписание приветствует вот так:

Как я улучшил своё взаимодействие с фитнес-клубом World Class, найдя и используя их API

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

Конечная точка API - это определенный URL-адрес, который позволяет внешним приложениям взаимодействовать с ним. API позволяют различным программным системам взаимодействовать друг с другом, отправляя запросы и получая ответы.

Когда взаимодействую с сайтом, который динамически загружает контент, то сайт часто запрашивает данные со своего сервера с помощью API. Сервер обрабатывает запрос и возвращает необходимые данные, которые затем отображаются на веб-странице. В контексте фитнес-клуба World Class конечной точкой API будет определенный URL-адрес, который предоставляет данные о расписании занятий. Отправив запрос на эту конечную точку, можно получить данные о расписании напрямую, минуя необходимость вручную перемещаться по сайту.

Поворотный момент и техническая проблема

В какой-то момент я наткнулся на чистую ссылку, которая ведёт только на само расписание фитнес-клуба World Class без любой рекламы. Ссылка выглядит следующим образом:

Где вместо d35ba5fc-1f7e-11ec-b664-50e548298f06 должен стоять идентификатор вашего клуба. Выше это идентификатор клуба в городе Перми.

Все доступные идентификаторы других клубов можно посмотреть прямо в браузере в режиме просмотра страницы:

Список доступных клубов
Список доступных клубов

Поскольку World Class динамически загружает расписание с помощью JavaScript после начальной загрузки страницы, то стало некоторой проблемой найти конечную точка API и обратиться к ней за этим общедоступным и свободно опубликованным в интернете расписанием.

ICG Color Cycle (сайкл)

В пермском клубе World Class не обязательно записываться на занятия по сайклу заранее - достаточно прийти примерно за полчаса до занятия и взять на входе черную карточку для участия - места есть до тех пор пока карточки не закончатся. Правда бывают приходят и те кто записались онлайн, но карточку не взяли - просто не знали про это и мест не хватает. Это некоторая путаница.

Примерно так выглядят занятия по сайклу
Примерно так выглядят занятия по сайклу

Создание решения

Поскольку я использую Гугл календарь, то написал Google Apps скрипт. Apps Script - платформа на основе JavaScript для быстрой и простой разработки решений.

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

Скрипт работает следующим образом:

  • Получение расписания: скрипт отправляет запрос в API World Class с идентификатором определенного спортзала. Далее извлекает расписание на следующие семь дней.
  • Фильтрация соответствующих занятий: после извлечения расписания скрипт отфильтровывает занятия «ICG Color Cycle» и «CORE», которые я хочу посещать. Все дальнейшие действия происходят только для отобранной выборки.
  • Создание событий календаря: для каждой отфильтрованной тренировки скрипт автоматически создает событие в Google календарь по умолчанию. Каждое событие включает:
  • Название: название тренировки (в моём случае либо «ICG Color Cycle», либо «CORE»).
  • Продолжительность: каждое событие запланировано на один час.
  • Описание: подробное объяснение зачем нужна эта тренировка.
  • Расположение: конкретный адрес клуба World Class, где проходит занятие.
  • Ведение журнала и обработка ошибок: скрипт регистрирует свой ход выполнения, указывая, когда он начинается и заканчивается, и предоставляя подробную информацию о каждом созданном событии. Если запрос API не выполняется или возвращает ошибку, скрипт регистрирует сообщение об ошибке для устранения неполадок.
Файл где можно посмотреть токен, который понадобится для обращения к API
Файл где можно посмотреть токен, который понадобится для обращения к API

По сути, этот скрипт - инструмент экономии времени для резидентов клуба World Class, которые могут быть уверены, что всегда будут знать когда проходят их любимые занятия.

Версия скрипта полного дня:

function WorldclassAPISchedulingPerm() { console.log(`Функция WorldclassAPISchedulingPerm начала работу в ${(new Date()).toLocaleString("ru-RU")}`); const url = 'https://my.worldclass.ru/api/v1/clubs/scheduling'; const currentDate = new Date(); const endDate = new Date(currentDate); endDate.setDate(currentDate.getDate() + 7); // Подробное описание: https://vc .ru/life/1487408-kak-ya-uluchshil-svoe-vzaimodeistvie-s-fitnes-klubom-world-class-naidya-i-ispolzuya-ih-api // Версия скрипта полного дня const payload = { "gymList": [ "d35ba5fc-1f7e-11ec-b664-50e548298f06" // это World Class в Перми ], "startDate": currentDate.toISOString().split('.')[0], "endDate": endDate.toISOString().split('.')[0], "chain": 1, "token": "70a69ca6-XXXX-XXXX-a975-005056b1372d" }; const options = { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload), muteHttpExceptions: true, headers: { 'brand': 'WorldClass', 'language': 'Ru', 'chain': '1', 'Accept': '*/*', 'Origin': 'https://my.worldclass.ru', 'Referer': 'https://my.worldclass.ru/scheduling?clubs=' }, timeoutSeconds: 30 }; try { const response = UrlFetchApp.fetch(url, options); const responseCode = response.getResponseCode(); console.log(`Код ответа: ${responseCode}`); const responseText = response.getContentText(); const responseData = JSON.parse(responseText); // Разбираем JSON-строку if (responseCode === 200) { // Фильтрация для "ICG Color Cycle (сайкл)" и "CORE" const filteredDates = responseData.data .filter(item => item.service.name === "ICG Color Cycle (сайкл)" || item.service.name === "CORE") .map(item => ({ name: item.service.name, startDate: item.startDate, employee: item.employee.firstName + " " + item.employee.lastName, shortDescription: item.service.shortDescription })); console.log('Отфильтрованные даты:', filteredDates); // Создаем события в календаре для каждой отфильтрованной даты filteredDates.forEach(eventData => { const startTime = new Date(eventData.startDate); const endTime = new Date(startTime); endTime.setHours(startTime.getHours() + 1); // Устанавливаем продолжительность события на 1 час let eventTitle = `${eventData.name} - ${eventData.employee}`; let eventDescription = ''; eventDescription = eventData.shortDescription + '\n\nhttps://my.worldclass.ru/scheduling?clubs=d35ba5fc-1f7e-11ec-b664-50e548298f06\n' + '\nСоздано автоматически ' + (new Date()).toLocaleString("ru-RU"); CalendarApp.getDefaultCalendar().createEvent( eventTitle, startTime, endTime, { description: eventDescription, location: 'Фитнес клуб World Class, Пермская ул., 33, Пермь, Пермский край, Россия, 614045' } ); console.log(`Событие создано для: ${startTime} - ${eventTitle}`); }); } else { console.error(`Ошибка: получен статус ${responseCode} с ответом: ${responseText}`); } } catch (error) { console.error('Ошибка запроса:', error.message); } console.log(`Функция WorldclassAPISchedulingPerm закончила работу в ${(new Date()).toLocaleString("ru-RU")}`); }
Результат выполнения скрипта
Результат выполнения скрипта

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

Ниже версия скрипта для дневного браслета, когда обязательный выход из зала до 17:00:

// Фильтрация для "ICG Color Cycle (сайкл)" и "CORE", а также по времени начала (до 17:00) const filteredDates = responseData.data .filter(item => (item.service.name === "ICG Color Cycle (сайкл)" || item.service.name === "CORE") && new Date(item.startDate).getHours() < 17) .map(item => ({ name: item.service.name, startDate: item.startDate, employee: item.employee.firstName + " " + item.employee.lastName, shortDescription: item.service.shortDescription })); console.log('Отфильтрованные даты:', filteredDates);

Как Вы можете воспользоваться этим скриптом?

Если вы новичок и хотите тоже автоматизировать получение определенных занятий, то скрипт Google Apps это мощный инструмент, который может вам помочь:

Шаг 1: Доступ к скрипту Google Apps

  • Откройте Google Drive: начните с перехода на Google Drive.
  • Создайте новый скрипт:
  • Нажмите кнопку Создать в верхнем левом углу.
  • Выберите Еще в раскрывающемся меню.
  • Нажмите Скрипт Google Apps. Откроется редактор скриптов Google Apps на новой вкладке.

Шаг 2: Назовите свой проект

  • Назовите свой скрипт: как только откроется редактор скриптов приложений, вы увидите проект без названия. Нажмите на заголовок (обычно это «Проект без названия») и дайте ему осмысленное имя, например «Расписание World Class».

Шаг 3: Скопируйте код

  • Удалите код по умолчанию: в редакторе вы увидите код по умолчанию (function myFunction() {}). Вы можете удалить его, чтобы освободить место для нового скрипта.
  • Скопируйте и вставьте код:
  • Перейдите к статье с кодом скрипта Google Apps.
  • Скопируйте весь скрипт, предоставленный в статье.
  • Вернитесь в редактор скриптов приложений и вставьте код в пустое место.

Шаг 4: Сохраните свой скрипт

  • Сохраните свою работу: Щелкните значок дискеты или нажмите Ctrl + S (или Cmd + S на Mac), чтобы сохранить свой скрипт.

Шаг 5: Запустите скрипт

  • Запустите свой скрипт: Чтобы протестировать скрипт, щелкните значок воспроизведения (▶) в верхней части редактора. Если вы запускаете скрипт впервые, Google запросит авторизацию.
  • Авторизуйте свой скрипт: Следуйте инструкциям, чтобы разрешить скрипту доступ к вашему Google Calendar и другим необходимым службам.

Шаг 6: Проверьте вывод

  • Проверьте журналы: После запуска скрипта вы можете проверить сообщения журнала, чтобы убедиться, что он работает правильно. Перейдите в Просмотр > Журналы в редакторе скриптов приложений, чтобы увидеть вывод.

Шаг 7: Автоматизируйте его

  • Установите триггер: если вы хотите, чтобы этот скрипт запускался автоматически через регулярные интервалы, вы можете настроить триггер:
  • Нажмите на значок часов на панели инструментов (Триггеры).
  • Нажмите + Добавить триггер в правом нижнем углу.
  • Установите запуск скрипта еженедельно, например на ночь между понедельником и вторником.

И это все! Вы успешно создали скрипт Google Apps, который автоматизирует добавление расписания в ваш календарь Google.

Результаты

При использовании гугл календаря этот скрипт представляет удобный инструмент который ищет интересующие групповые события и добавляет их автоматически в Ваш собственный Гугл Календарь.

11
Начать дискуссию