Na última semana, sofrendo da “Síndrome da Quarentena”, resolvi aprender como desenvolver Skills para a Alexa, mas pensando na utilização prática no meu dia-a-dia profissional.
No começo, devido ao material disponível, imaginei a complicação que seria, até achar um link que me “abriu a mente”: Como direcionar as requisições da Alexa para seu próprio servidor.
O processo é simples:
Primeiro, você cria o Skill da Alexa, com as palavras chaves (Intents);
Segundo, você configura seu skill para passar estes intents para o seu servidor https;
Terceiro, você codifica (na sua linguagem preferida) o que deve ser feito em cada situação.
Com isto em mente, vamos às dicas (no meu caso, estão em python usando Flask-Ask, uma biblioteca para interagir com os intents):
Dica 01: Use o NGROK para testar sua aplicação. o NGROK cria um tuneo entre a internet e seu localhost, facilitando os testes antes de subir para a produção:
Dica 02: Todo o trabalho “pesado” de tratamento da voz é feito pela AWS. Você somente se preocupa com as mensagens que devem ser apresentadas.
Dica 03: Os skills já possuem alguns intents próprios, como @stop, @cancel, @help. Você só precisa tratar em sua aplicação:
@ask.intent('AMAZON.StopIntent')
def stop():
return statement("Até a próxima!")
@ask.intent('AMAZON.CancelIntent')
def cancel():
return statement("Até a próxima!")
@ask.session_ended
def session_ended():
return "{}", 200
Dica 04: Programe do seu jeito. Não se preocupe (ainda) com otimização do código.
Dica 05: Em respostas longas, use templates com jinja2. Veja o código abaixo (estou pedindo para a Alexa me dar um resumo dos serviços em todos os meus servidores Nagios:
@ask.intent("resumoIntent")
def get_resumo():
should_end_session = False
data_alexa = []
ambientes = get_user_confs(context.System.user.userId)
json_data = ambientes.to_json()
servers = json.loads(json_data)
for server in servers:
WARNING = get_service_status(server['nag_url'], "warning", server['nag_user'], server['nag_pass'])
CRITICAL = get_service_status(server['nag_url'], "critical", server['nag_user'], server['nag_pass'])
UNKNOWN = get_service_status(server['nag_url'], "unknown", server['nag_user'], server['nag_pass'])
PENDING = get_service_status(server['nag_url'], "pending", server['nag_user'], server['nag_pass'])
TOTAL = WARNING + CRITICAL + UNKNOWN + PENDING
reg_template = {"ambiente": server['ambiente'], "total": str(TOTAL), "warning": str(WARNING), "critical": str(CRITICAL), "unknown": str(UNKNOWN), "pending": str(PENDING)}
data_alexa.append(reg_template)
resumo_out = render_template('resumo', data=data_alexa)
return question(resumo_out).reprompt(" ")
Perceba que eu possuo uma chamada para o render_template, passa as informações do resumo como data_alexa. O render_template vai passar as informações para o meu template em jinja2 (onde eu trato se é singular ou plural, entre outras coisas):
resumo: |
{% for s in data %}
{% set total = s['total']|int() %}
{% set warning = s['warning']|int() %}
{% set critical = s['critical']|int() %}
{% set unknown = s['unknown']|int() %}
{% set pending = s['pending']|int() %}
{% if total > 1 %}
{% set servico = "serviços" %}
{% set alarme = "alarmes" %}
{% else %}
{% set servico = "serviço" %}
{% set alarme = "alarme" %}
{% endif %}
{% if total == 0 %}
No ambiente {{ s['ambiente'] }} não há {{ servico }} com {{ alarme }}.
{% else %}
No ambiente {{ s['ambiente'] }} há {{ s['total'] }} {{ servico }} com {{ alarme }}.
{% endif %}
{% if total > 1 %}
{% set servico = "serviços" %}
{% set alarme = "alarmes" %}
{% else %}
{% set servico = "serviço" %}
{% set alarme = "alarme" %}
{% endif %}
{% if total > 0 %}
Sendo:
{% endif %}
{% if warning > 1 %}
{% set alerta = "warnings" %}
{% else %}
{% set alerta = "warning" %}
{% endif %}
{% if warning > 0 %}
{{ warning }} {{ alerta }}.
{% endif %}
{% if critical > 1 %}
{% set critico = "críticos" %}
{% else %}
{% set critico = "crítico" %}
{% endif %}
{% if critical > 0 %}
{{ critical }} {{ critico }}.
{% endif %}
{% if unknown > 1 %}
{% set desconhecido = "desconhecidos" %}
{% else %}
{% set desconhecido = "desconhecido" %}
{% endif %}
{% if unknown > 0 %}
{{ unknown }} {{ desconhecido }}.
{% endif %}
{% if pending > 1 %}
{% set pendente = "pendentes" %}
{% else %}
{% set pendente = "pendente" %}
{% endif %}
{% if pending > 0 %}
{{ pending }} {{ pendente }}.
{% endif %}
{% endfor %}
Mais alguma informação?
Por hoje é só, “velhinhos”…. Qualquer coisa, dúvida ou info, use o form de contato ou o whatsapp 🙂