Le contaré cómo hice posible recibir y mostrar información de la API pública de
KudaGo en su espejo. Por supuesto, no se trata de un simple, sino de un espejo "inteligente".
¿Qué es un espejo inteligente?
Lo más probable es que muchos hayan oído hablar de la plataforma modular
MagicMirror² , que le permite implementar una aplicación en Raspberry Pi que puede convertir un espejo para un hall de entrada o un baño en su asistente personal. Puede implementar
esto o
esto usando el llamado espejo "bidireccional", monitor, brazos rectos y el microordenador mencionado anteriormente.
Magia en MagicMirror solo está en el nombre. Si entendí correctamente, todo esto se desarrolló en
Electron , lo que significa que Node.js. está involucrado en el asunto. La "Aplicación" crea una página html que, cuando se inicia, se abre en una ventana del navegador, y los llamados módulos ya se muestran allí, ambos preinstalados (Reloj, Calendario, Clima actual, Pronóstico del tiempo, Noticias) y
desarrollados por la comunidad . Y hay bastante interesante (tanto útil como
terco inusual), por ejemplo, aquí hay solo algunos de más de cien módulos:
Útil
Fantasía
Antecedentes
Sobre cómo recogí mi espejo no pintaré en detalle. Si alguien se interesa
, puede leer aquí . Si desea crear el suyo, una simple búsqueda en Google le devolverá docenas de ejemplos \ guías \ manuales. Quiero mostrar cómo hacer un módulo para tal espejo.
Soy un gran admirador de asistir a varios conciertos y eventos de San Petersburgo. Pero a veces sucede que (incluso teniendo en cuenta la abundancia de publicidad contextual, spam y carteles) me entero de algunos eventos casi uno o dos días antes. Por lo tanto, siempre busqué una manera de filtrar de manera óptima el flujo de información sobre ellos. Las aplicaciones en un teléfono inteligente con una funcionalidad similar no duraron mucho tiempo (más precisamente, me olvidé de ellas). Todos los carteles requirieron tiempo y un paso constante de la búsqueda "elige 10 filtros y adivina cuál es el correcto". Las redes sociales generalmente se convierten en spam publicitario. Y luego surgió la idea de implementar un "analizador" que seleccionara periódicamente la información según sus propios criterios y la mostrara en alguna parte.
Desarrollo de tu modulo
Si alguien quiere ver el resultado de inmediato o instalar el módulo en un "espejo", entonces aquí está el
enlace al repositorio . También hay instrucciones de instalación.
Como fuente de información, el servicio de
kudago resultó ser el más adecuado. No se requiere registro. Métodos sanos. Datos concisos en la respuesta. No es una cobertura extraña, incluye no solo "bordillo de la ciudad" y "sin caucho", sino también 9 ciudades rusas principales.
Nuestro módulo desarrollado debe almacenarse en la
carpeta modules / modulename . Para crear un módulo simple (como el mío) necesitamos crear dos archivos en esta carpeta:
- modulename / modulename.js es el script del módulo principal.
- modulename / node_helper.js es el "ayudante opcional" que cargará el script. El asistente y el script del módulo pueden comunicarse entre sí mediante un sistema de socket integrado.
Después de jugar con una
guía del desarrollador de MagicMirror , además de mirar las soluciones de otras personas, cargué un script para obtener entradas de la API de kudago usando XMLHttpRequest. Y se topó con el problema de las consultas entre dominios. No soy un experto en JavaScript en absoluto (y ni siquiera un desarrollador). Todo lo que entendí fue enviar una solicitud "ejecutando un script en un navegador" y obtener una respuesta de kudago, no pude tener éxito.
Esto es lo que
learn.javascript me explicó
Las solicitudes de dominio cruzado se someten a un control de seguridad especial, cuyo propósito es evitar que los hackers malvados conquisten Internet.
En serio Los desarrolladores del estándar han proporcionado todas las barreras para que el "malvado pirata informático" no pueda, usando el nuevo estándar, hacer algo fundamentalmente diferente de lo que pudo haber hecho antes y, por lo tanto, "romper" algún servidor que ejecuta el viejo estándar y sin esperar nada fundamentalmente nuevo.
Bueno, en realidad no es lo que quería. No tenía ganas de entender los problemas de JavaScript. Después de todo, a mano estaba el Python familiar y predecible. Solo obtendré información de la biblioteca de
solicitudes , escribiendo el resultado en json. Solo queda resolver la cuestión de cómo ejecutar el código Python desde js.
¡Resulta que node_helper.js es útil para mí! Al iniciar nuestro módulo, puede usar las capacidades de
python-shell . Simplemente especifique la ruta al intérprete de Python, la ruta al script, los argumentos y sus valores. De esta forma, Kudago amablemente me devolvió una respuesta exitosa.
Código de llamada de script PythonkudagoGetData: function () {
Además, solo node_helper.js puede leer información del archivo json (de forma predeterminada, el archivo se ubicará en la ruta
kudago / events.json ) con los datos descargados de kudago. Implementamos en él la misma lectura del archivo.
Código para leer información de un archivo Como ya escribí, en MagicMirror todos los módulos se comunican a través del sistema de socket, por lo que para que nuestro script Python se ejecute al inicio, agregue el código apropiado a node_helper.js
Código para iniciar el módulo al inicio socketNotificationReceived: function (notification, payload) { if (notification === "START") { this.config = payload; this.kudagoGetData(); setInterval(() => { this.kudagoGetData(); }, this.config.updateInterval); } }
Todos los parámetros que se obtienen de
this.config son las variables predefinidas en el archivo del módulo principal o las especificadas en config.js, el archivo de configuración general para todos los módulos MagicMirror.
Ejemplo de configuración para el módulo creado { module: 'MMM-KudaGo', disabled: false, position: 'bottom_bar', config: { location: "spb", categories: "concert", tags: " --,", days: 7 } }
Bueno, en el archivo principal de nuestro módulo
MMM-KudaGo.js hay parámetros predeterminados, funciones para manejar datos de eventos (tomados de un archivo json), signos para dibujar una placa (de la cual las personas que saben sangrarán sangre de mis ojos, pero estoy en un tanque, lo principal para mí es trabajado). Debido al hecho de que saqué el trabajo con la API en archivos python, los archivos .js no están sobrecargados con código (a diferencia de la mayoría de los otros módulos), anidados (¿o cómo se llaman aquí?) Funciones, bucles y otros fideos.
Resultado
Captura de pantalla del módulo en sí Captura de pantalla espejo Resultó implementar una búsqueda de una o varias categorías de eventos, buscar por etiquetas, buscar un intervalo de días determinado, con actualizaciones a intervalos específicos (para obtener una lista más detallada de categorías y etiquetas, consulte el
archivo Léame ). Y muéstrelo todo en la pantalla, indicando el lugar, el nombre, la fecha y el precio, en forma legible y sin perder tiempo en una búsqueda independiente.
Por supuesto, debe mirar cuidadosamente varias veces lo que el applet devuelve allí para comprender qué etiquetas debe poner para que no muestre conciertos o representaciones teatrales, sino, por ejemplo, cursos de yoga o festivales gratuitos en su ciudad. ¡Pero personalmente, mis necesidades están completamente satisfechas!
Espero que también se te ocurra y crees un módulo útil para la comunidad, que compartas con otros en una página especial del proyecto. Por cierto, si tienes buenas ideas o necesitas algo, escribe los comentarios. ¡Quizás empujar a alguien a lo creativo!