Concertos e eventos KudaGo no seu espelho

Vou falar sobre como possibilitei o recebimento e a exibição de informações da API pública do KudaGo no seu espelho. Obviamente, não se trata de um simples, mas de um espelho "inteligente".

O que é um espelho inteligente?


Provavelmente, muitos já ouviram falar da plataforma modular MagicMirror² , que permite implantar um aplicativo no Raspberry Pi que pode transformar seu espelho em um hall de entrada ou banheiro em seu assistente pessoal. Você pode implementar isso ou aquilo usando o chamado espelho "bidirecional", monitor, braços retos e o microcomputador mencionado acima.

Magia no MagicMirror está apenas no nome. Se bem entendi, tudo isso foi desenvolvido no Electron , o que significa que o Node.js. está envolvido no assunto. O "Aplicativo" cria uma página html que, quando iniciada, abre em uma janela do navegador e os chamados módulos já são exibidos lá, ambos pré-instalados (Relógio, Calendário, Tempo Atual, Previsão do Tempo, Feed de Notícias.) E Desenvolvidos pela comunidade . E há bastante interessante (incomum útil e teimoso ), por exemplo, aqui estão apenas alguns dos mais de cem módulos:

Útil



Fantasia



Antecedentes


Sobre como colecionei meu espelho, não pintarei em detalhes. Se alguém se interessar, você pode ler aqui . Se você deseja criar o seu próprio, uma simples pesquisa no Google retornará dezenas de exemplos \ guias \ manuais. Eu quero mostrar como fazer um módulo para esse espelho.

Eu sou um grande fã de assistir a vários concertos e eventos de São Petersburgo. Mas às vezes acontece que (mesmo levando em consideração a abundância de publicidade contextual, spam e pôsteres) eu aprendo sobre alguns eventos quase um dia ou dois antes deles. Portanto, eu sempre procurei uma maneira de filtrar de maneira otimizada o fluxo de informações sobre eles. Os aplicativos em um smartphone com funcionalidade semelhante não se prolongaram por muito tempo (mais precisamente, eu esqueci deles). Todos os pôsteres exigiam tempo e passagem constante da missão "escolha 10 filtros e adivinhe qual deles está certo". Os feeds das mídias sociais geralmente se transformam em spam de publicidade. E, em seguida, surgiu a idéia de implementar um "analisador" que selecionava periodicamente as informações em seus próprios critérios e as exibia em algum lugar.

Desenvolvimento do seu módulo


Se alguém quiser ver o resultado imediatamente ou instalar o módulo em um "espelho", aqui está o link para o repositório . Há também instruções de instalação.

Como fonte de informação, o serviço kudago acabou sendo o mais adequado. Não é necessário registro. Métodos sãos. Dados concisos na resposta. Não é uma cobertura estranha, inclui não apenas "meio-fio da cidade" e "não borracha", mas também 9 grandes cidades russas.

Nosso módulo desenvolvido deve ser armazenado na pasta modules / modulename . Para criar um módulo simples (como o meu), precisamos criar dois arquivos nesta pasta:

  • modulename / modulename.js é o script do módulo principal.
  • modulename / node_helper.js é o "auxiliar opcional" que será carregado pelo script. O auxiliar e o script do módulo podem se comunicar usando um sistema de soquete integrado.

Depois de mexer com um guia do desenvolvedor do MagicMirror , além de analisar as soluções de outras pessoas, enviei um script para obter entradas da API do kudago usando XMLHttpRequest. E encontrou o problema de consultas entre domínios. Eu não sou um especialista em javascript (e nem mesmo um desenvolvedor). Tudo o que entendi foi enviar uma solicitação "executando um script em um navegador" e obter uma resposta do kudago, não consegui. Aqui está o que o learn.javascript me explicou

As solicitações entre domínios passam por um controle de segurança especial, cujo objetivo é impedir que hackers maus conquistem a Internet.

Sério. Os desenvolvedores do padrão forneceram todas as barreiras para que o "hacker maligno" não pudesse, usando o novo padrão, fazer algo fundamentalmente diferente do que ele poderia ter feito antes e, assim, "quebrar" algum servidor executando o padrão antigo e não esperando nada fundamentalmente novo.

Bem, não era exatamente o que eu queria. Eu não queria entender problemas de javascript. Afinal, estava à mão o Python familiar e previsível. Vou apenas obter informações da biblioteca de solicitações , escrevendo o resultado em json. Resta apenas resolver a questão de como executar o código Python a partir de js.

Acontece que o node_helper.js é útil para mim! Ao iniciar nosso módulo, você pode usar os recursos do python-shell . Basta especificar o caminho para o intérprete Python, o caminho para o script, os argumentos e seus valores. Nesta forma, o kudago gentilmente me devolveu uma resposta bem-sucedida.

Código de chamada de script 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; }); } 


Além disso, apenas o node_helper.js é capaz de ler informações do arquivo json (por padrão, o arquivo estará no caminho kudago / events.json ) com os dados baixados do kudago. Implementamos nele a mesma leitura do arquivo.

Código para ler informações de um arquivo
 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); }); } 


Como já escrevi, no MagicMirror todos os módulos se comunicam através do sistema de soquete. Portanto, para que nosso script Python seja executado na inicialização, adicione o código apropriado ao node_helper.js

Código para iniciar o módulo na inicialização
 socketNotificationReceived: function (notification, payload) { if (notification === "START") { this.config = payload; this.kudagoGetData(); setInterval(() => { this.kudagoGetData(); }, this.config.updateInterval); } } 


Todos os parâmetros obtidos com this.config são as variáveis ​​predefinidas no arquivo do módulo principal ou aquelas especificadas em config.js - o arquivo de configuração geral de todos os módulos do MagicMirror.

Exemplo de configuração para o módulo criado
 { module: 'MMM-KudaGo', disabled: false, position: 'bottom_bar', config: { location: "spb", categories: "concert", tags: "  --,", days: 7 } } 


Bem, no arquivo principal do nosso módulo MMM-KudaGo.js , existem parâmetros padrão, funções para manipular dados de eventos (extraídos de um arquivo json), sinais para desenhar uma placa (da qual pessoas que sabem sangrarão sangue dos meus olhos, mas eu estou em um tanque, a principal coisa para mim é trabalhou). Devido ao fato de eu ter trabalhado com a API em arquivos python, os arquivos .js não são sobrecarregados com código (diferente da maioria dos outros módulos), aninhados (ou como são chamados aqui?) Funções, loops e outros macarrão.

Resultado


Captura de tela do próprio módulo
imagem

Captura de tela do espelho
imagem

Acabou implementando uma pesquisa por uma ou várias categorias de eventos, pesquisa por tags, pesquisa por um determinado intervalo de dias, com atualização em intervalos especificados (para obter uma lista mais detalhada de categorias e tags, consulte o leia-me ). E exiba tudo na tela, indicando o local, nome, data e preço, de forma legível e sem perder tempo em uma pesquisa independente.

Obviamente, você precisa observar cuidadosamente várias vezes o que o applet retorna para entender quais tags você precisa colocar para que ele não mostre concertos ou apresentações de teatro, mas, por exemplo, cursos de ioga ou festivais gratuitos em sua cidade. Mas, pessoalmente, minhas necessidades estão totalmente satisfeitas!

Espero que você também crie um módulo útil para a comunidade, que você compartilhe com outras pessoas em uma página especial do projeto. A propósito, se você tem boas idéias ou precisa de algo, escreva nos comentários. Talvez empurre alguém para o criativo!

Source: https://habr.com/ru/post/pt473344/


All Articles