Расскажу вам про то, как я сделал возможным получать и отображать информацию из публичного API KudaGo на вашем зеркале. Само собой, речь не о простом, а об «умном» зеркале.
Вероятно многие слышали про модульную платформу MagicMirror², которая позволяет развернуть на Raspberry Pi приложение, способное превратить зеркало для прихожей или ванной комнаты в вашего личного помощника. Можно реализовать такое или вот такое используя так называемое «двустороннее» зеркало, монитор, прямые руки, и упомянутый микрокомпьютер.
Магия у MagicMirror только в названии. Если я правильно понял, все это разработано на Electron, а значит в деле участвует Node.js. «Приложение» создает html страничку, которую при запуске открывает в окне браузера, и уже там отображаются так называемые модули, как предустановленные (Часы, Календарь, Текущая погода, Прогноз погоды, Новостная лента. ), так и разработанные сообществом. А интересного там достаточно (как полезного, так иупоротого необычного), вот вам для примера всего лишь несколько из более чем сотни модулей:
Про то как я собирал свое зеркало подробно расписывать не буду. Если кому то станет интересно то можно почитать тут. Если захотите собрать свое, то простой поиск в гугл выдаст десятки примеров\гайдов\руководств. Я же хочу показать как делать именно модуль для такого зеркала.
Я большой любитель посещать разнообразные концерты и события Санкт-Петербурга. Но порой случается так, что (даже с учетом обилия контекстной рекламы, спама и афиш) про некоторые ивенты узнаю чуть ли не за день-два до них. Поэтому всегда искал способ оптимально фильтровать поток информации о них. Приложения на смартфон с подобным функционалом надолго у меня не задерживались (точнее я про них забывал). Всякие афиши требовали времени и постоянного прохождения квеста «выбери 10 фильтров, и угадай какой правильный». Ленты в соцсетях вообще превратились в рекламный спам. И тут подвернулась идея реализовать некий «парсер» который будет периодически сам выбирать информацию по заданным критериям и где-то ее отображать.
Если кому то сразу хочется посмотреть результат, или установить модуль себе на «зеркало», то вот ссылка на репозиторий. Там же инструкция по установке.
В качестве источника информации самым адекватным оказался сервис kudago. Не требует регистрации. Вменяемые методы. Лаконичные данные в ответе. Покрытие у него, как не странно, включает не только «поребрик сити» и «нерезиновую», но еще 9 крупных городов России впридачу.
Наш разработанный модуль должен храниться в папке modules/modulename. Для создания простого модуля (как мой) нам понадобится создать два файла в этой папке:
Повозившись с гайдом от разработчика MagicMirror, а так же посмотрев на чужие решения, я накидал скрипт для получения записей из API kudago, используя XMLHttpRequest. И столкнулся с проблемой кросс-доменных запросов. Я вообще не знаток javascript (и даже не разработчик). Все что я понял — отправить запрос «выполняя скрипт в браузере» и получить ответ от kudago у меня не получиться. Вот что мне объяснил learn.javascript
Ну не очень то и хотелось. Разбираться в проблемах javascript у меня не было никакого желания. Ведь под рукой был знакомый и предсказуемый Python. Буду просто получать информацию библиотекой requests, записывая результат в json. Осталось только решить вопрос с тем, как заставить выполняться код на Python из js.
Оказывается для этого мне и пригодится node_helper.js! При запуске нашего модуля можно использовать возможности python-shell. Просто указать путь к интерпретатору Python, путь к скрипту, аргументы и их значения. Вот в таком виде kudago любезно вернуло мне успешный ответ.
Кроме этого, только node_helper.js способен прочитать информацию из json файла (по умолчанию файл будет лежать по пути kudago/events.json) с выгруженными данными из kudago. Реализуем в нем же чтение из файла.
Как я уже писал, в MagicMirror все модули общаются через систему сокетов, поэтому для того чтобы наш пайтон скрипт запустился при запуске, добавляем в node_helper.js соответствующий код
Все те параметры, которые получаются из this.config — это либо предустановленные нами переменные в основном файле модуля, либо те что указаны в config.js — общем конфигурационном файле для всех модулей MagicMirror.
Ну а в основном файле нашего модуля MMM-KudaGo.js расположены дефолтные параметры, функции оперирования данными о событиях (взятые из json файла), функции отрисовки таблички (от которых наверняка у знающих потечет кровь из глаз, но я в танке, мне главное чтоб работало). Благодаря тому, что я вынес работу с API в python файлы, .js файлы не перегружены кодом (в отличие от большинства других модулей), вложенными (или как они тут называются?) функциями, циклами и прочей лапшой.
Получилось реализовать поиск по одной или нескольким категориям событий, поиск по тэгам, поиск на заданный интервал дней, с обновлением через заданные промежутки времени (Подробнее список категорий и тэгов можно посмотреть в readme). И отображать это все на экране, указывая место проведения, название, дату и цену, в читабельном виде, и не тратя при этом время на самостоятельный поиск.
Конечно нужно несколько раз внимательно посмотреть что же там возвращает апишка, чтобы понять какие тэги нужно поставить, чтобы он не концерты или театральные спектакли показывал, а например курсы йоги или бесплатные фестивали в вашем городе. Но лично мои потребности удовлетворены сполна!
Надеюсь и вы тоже придумаете и создадите полезный для сообщества модуль, которым поделитесь с остальными на специальной страничке проекта. Кстати, если у вас есть хорошие идеи, или потребность в чем то, то пишите в комментарии. Возможно сподвигнете кого то на креатив!
Что такое «умное зеркало»?
Вероятно многие слышали про модульную платформу MagicMirror², которая позволяет развернуть на Raspberry Pi приложение, способное превратить зеркало для прихожей или ванной комнаты в вашего личного помощника. Можно реализовать такое или вот такое используя так называемое «двустороннее» зеркало, монитор, прямые руки, и упомянутый микрокомпьютер.
Магия у MagicMirror только в названии. Если я правильно понял, все это разработано на Electron, а значит в деле участвует Node.js. «Приложение» создает html страничку, которую при запуске открывает в окне браузера, и уже там отображаются так называемые модули, как предустановленные (Часы, Календарь, Текущая погода, Прогноз погоды, Новостная лента. ), так и разработанные сообществом. А интересного там достаточно (как полезного, так и
Полезные
- Интеграция гугл ассистента
- Голосовое управление
- Распознавание лиц
- YouTube
- Отслеживание результатов спортивных соревнований
- Instagram лента
Необычные
- Статистика в FortNite
- Отслеживание курсов криптовалют
- Live видео Земли с Международной космической станции.
- Статус docker swarm
Предыстория
Про то как я собирал свое зеркало подробно расписывать не буду. Если кому то станет интересно то можно почитать тут. Если захотите собрать свое, то простой поиск в гугл выдаст десятки примеров\гайдов\руководств. Я же хочу показать как делать именно модуль для такого зеркала.
Я большой любитель посещать разнообразные концерты и события Санкт-Петербурга. Но порой случается так, что (даже с учетом обилия контекстной рекламы, спама и афиш) про некоторые ивенты узнаю чуть ли не за день-два до них. Поэтому всегда искал способ оптимально фильтровать поток информации о них. Приложения на смартфон с подобным функционалом надолго у меня не задерживались (точнее я про них забывал). Всякие афиши требовали времени и постоянного прохождения квеста «выбери 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 файлы не перегружены кодом (в отличие от большинства других модулей), вложенными (или как они тут называются?) функциями, циклами и прочей лапшой.
Результат
Скриншот самого модуля
Скриншот зеркала
Получилось реализовать поиск по одной или нескольким категориям событий, поиск по тэгам, поиск на заданный интервал дней, с обновлением через заданные промежутки времени (Подробнее список категорий и тэгов можно посмотреть в readme). И отображать это все на экране, указывая место проведения, название, дату и цену, в читабельном виде, и не тратя при этом время на самостоятельный поиск.
Конечно нужно несколько раз внимательно посмотреть что же там возвращает апишка, чтобы понять какие тэги нужно поставить, чтобы он не концерты или театральные спектакли показывал, а например курсы йоги или бесплатные фестивали в вашем городе. Но лично мои потребности удовлетворены сполна!
Надеюсь и вы тоже придумаете и создадите полезный для сообщества модуль, которым поделитесь с остальными на специальной страничке проекта. Кстати, если у вас есть хорошие идеи, или потребность в чем то, то пишите в комментарии. Возможно сподвигнете кого то на креатив!