Как стать автором
Обновить

Концерты и события KudaGo у вас на зеркале

Время на прочтение5 мин
Количество просмотров3.8K
Расскажу вам про то, как я сделал возможным получать и отображать информацию из публичного API KudaGo на вашем зеркале. Само собой, речь не о простом, а об «умном» зеркале.

Что такое «умное зеркало»?


Вероятно многие слышали про модульную платформу MagicMirror², которая позволяет развернуть на Raspberry Pi приложение, способное превратить зеркало для прихожей или ванной комнаты в вашего личного помощника. Можно реализовать такое или вот такое используя так называемое «двустороннее» зеркало, монитор, прямые руки, и упомянутый микрокомпьютер.

Магия у MagicMirror только в названии. Если я правильно понял, все это разработано на Electron, а значит в деле участвует Node.js. «Приложение» создает html страничку, которую при запуске открывает в окне браузера, и уже там отображаются так называемые модули, как предустановленные (Часы, Календарь, Текущая погода, Прогноз погоды, Новостная лента. ), так и разработанные сообществом. А интересного там достаточно (как полезного, так и упоротого необычного), вот вам для примера всего лишь несколько из более чем сотни модулей:

Полезные



Необычные



Предыстория


Про то как я собирал свое зеркало подробно расписывать не буду. Если кому то станет интересно то можно почитать тут. Если захотите собрать свое, то простой поиск в гугл выдаст десятки примеров\гайдов\руководств. Я же хочу показать как делать именно модуль для такого зеркала.

Я большой любитель посещать разнообразные концерты и события Санкт-Петербурга. Но порой случается так, что (даже с учетом обилия контекстной рекламы, спама и афиш) про некоторые ивенты узнаю чуть ли не за день-два до них. Поэтому всегда искал способ оптимально фильтровать поток информации о них. Приложения на смартфон с подобным функционалом надолго у меня не задерживались (точнее я про них забывал). Всякие афиши требовали времени и постоянного прохождения квеста «выбери 10 фильтров, и угадай какой правильный». Ленты в соцсетях вообще превратились в рекламный спам. И тут подвернулась идея реализовать некий «парсер» который будет периодически сам выбирать информацию по заданным критериям и где-то ее отображать.

Разработка своего модуля


Если кому то сразу хочется посмотреть результат, или установить модуль себе на «зеркало», то вот ссылка на репозиторий. Там же инструкция по установке.

В качестве источника информации самым адекватным оказался сервис kudago. Не требует регистрации. Вменяемые методы. Лаконичные данные в ответе. Покрытие у него, как не странно, включает не только «поребрик сити» и «нерезиновую», но еще 9 крупных городов России впридачу.

Наш разработанный модуль должен храниться в папке modules/modulename. Для создания простого модуля (как мой) нам понадобится создать два файла в этой папке:

  • modulename / modulename.js — это скрипт основного модуля.
  • modulename / node_helper.js — это «необязательный помощник», который будет загружен скриптом. Помощник и скрипт модуля могут связываться друг с другом, используя интегрированную систему сокетов.

Повозившись с гайдом от разработчика MagicMirror, а так же посмотрев на чужие решения, я накидал скрипт для получения записей из API kudago, используя XMLHttpRequest. И столкнулся с проблемой кросс-доменных запросов. Я вообще не знаток javascript (и даже не разработчик). Все что я понял — отправить запрос «выполняя скрипт в браузере» и получить ответ от kudago у меня не получиться. Вот что мне объяснил learn.javascript

Кросс-доменные запросы проходят специальный контроль безопасности, цель которого – не дать злым хакерам завоевать интернет.

Серьёзно. Разработчики стандарта предусмотрели все заслоны, чтобы «злой хакер» не смог, воспользовавшись новым стандартом, сделать что-то принципиально отличное от того, что и так мог раньше и, таким образом, «сломать» какой-нибудь сервер, работающий по-старому стандарту и не ожидающий ничего принципиально нового.

Ну не очень то и хотелось. Разбираться в проблемах javascript у меня не было никакого желания. Ведь под рукой был знакомый и предсказуемый Python. Буду просто получать информацию библиотекой requests, записывая результат в json. Осталось только решить вопрос с тем, как заставить выполняться код на Python из js.

Оказывается для этого мне и пригодится node_helper.js! При запуске нашего модуля можно использовать возможности python-shell. Просто указать путь к интерпретатору Python, путь к скрипту, аргументы и их значения. Вот в таком виде kudago любезно вернуло мне успешный ответ.

Код вызова скрипта python
kudagoGetData: function () {
    //call python script for collecting events from KudaGo api
    self = this;
    var options = {
      pythonPath: this.config.pythonPath,
      scriptPath: './modules/MMM-KudaGo',
      mode: 'json',
      args: [
        "--location", this.config.location,
        "--days", this.config.days,
        "--categories", this.config.categories,
        "--tags", this.config.tags,
      ]
    };

    pyshell.PythonShell.run('KudaGo.py', options, function (err) {
      if (err) throw err;
    });
  }


Кроме этого, только node_helper.js способен прочитать информацию из json файла (по умолчанию файл будет лежать по пути kudago/events.json) с выгруженными данными из kudago. Реализуем в нем же чтение из файла.

Код чтения информации из файла
readData: function () {
    //read a file with events
    fs.readFile("./modules/MMM-KudaGo/kudago/events.json", "utf8", (err, data) => {
      if (err) throw err;
      this.sendSocketNotification("DATA", data);
    });
  }


Как я уже писал, в MagicMirror все модули общаются через систему сокетов, поэтому для того чтобы наш пайтон скрипт запустился при запуске, добавляем в node_helper.js соответствующий код

Код для старта модуля при запуске
socketNotificationReceived: function (notification, payload) {
    if (notification === "START") {
      this.config = payload;
      this.kudagoGetData();
      setInterval(() => {
        this.kudagoGetData();
      }, this.config.updateInterval);
    }
  }


Все те параметры, которые получаются из this.config — это либо предустановленные нами переменные в основном файле модуля, либо те что указаны в config.js — общем конфигурационном файле для всех модулей MagicMirror.

Пример конфига для созданного модуля
{
    module: 'MMM-KudaGo', 
    disabled: false,
    position: 'bottom_bar',
    config: {
                location: "spb",
                categories: "concert",
                tags: "рок и рок-н-ролл,метал",
                days: 7
            }
}


Ну а в основном файле нашего модуля MMM-KudaGo.js расположены дефолтные параметры, функции оперирования данными о событиях (взятые из json файла), функции отрисовки таблички (от которых наверняка у знающих потечет кровь из глаз, но я в танке, мне главное чтоб работало). Благодаря тому, что я вынес работу с API в python файлы, .js файлы не перегружены кодом (в отличие от большинства других модулей), вложенными (или как они тут называются?) функциями, циклами и прочей лапшой.

Результат


Скриншот самого модуля
image

Скриншот зеркала
image

Получилось реализовать поиск по одной или нескольким категориям событий, поиск по тэгам, поиск на заданный интервал дней, с обновлением через заданные промежутки времени (Подробнее список категорий и тэгов можно посмотреть в readme). И отображать это все на экране, указывая место проведения, название, дату и цену, в читабельном виде, и не тратя при этом время на самостоятельный поиск.

Конечно нужно несколько раз внимательно посмотреть что же там возвращает апишка, чтобы понять какие тэги нужно поставить, чтобы он не концерты или театральные спектакли показывал, а например курсы йоги или бесплатные фестивали в вашем городе. Но лично мои потребности удовлетворены сполна!

Надеюсь и вы тоже придумаете и создадите полезный для сообщества модуль, которым поделитесь с остальными на специальной страничке проекта. Кстати, если у вас есть хорошие идеи, или потребность в чем то, то пишите в комментарии. Возможно сподвигнете кого то на креатив!
Теги:
Хабы:
Всего голосов 10: ↑8 и ↓2+6
Комментарии6

Публикации

Истории

Работа

Python разработчик
199 вакансий
Data Scientist
94 вакансии

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн