01O que é uma fonte de dados
Uma fonte de dados é um endereço da web salvo uma única vez. Quando um espectador executa um comando que o cita, o bot chama esse endereço, extrai um valor da resposta e o diz no chat. O clima, uma estatística de jogo, o tamanho da fila no seu próprio servidor: se responde em https e devolve JSON ou texto, um comando pode lê-lo.
PrincessBarney !weather
ItsBagelBot Está fazendo 21°C em Montreal agora.
Por trás desta linha existe um comando personalizado comum. A resposta dele, como digitada no editor:
Está fazendo {urlfetch:weather}°C em Montreal agora.
O marcador nomeia a fonte, não o valor. O lugar de onde o bot tira esse valor
fica salvo na própria fonte, na forma de um caminho: um
endereço dentro da resposta. A resposta é o prédio, current
é o andar, temperature_2m é a porta. Escreva tudo com pontos e
você obtém current.temperature_2m. A seção três faz esses cliques
por você, e a analogia já pode ir para casa.
02Adicionar uma fonte pelo editor de comandos
Tudo acontece em Comandos, no editor que se encaixa ao lado da sua lista de comandos.
- Coloque o cursor onde vai o valor
Abra um comando, clique em Resposta, e deixe o cursor exatamente onde o valor deve aparecer na frase.
- Abra a paleta
Abaixo da resposta, ao lado dos marcadores
{user}e{args}, há um botão Fonte de dados. - Crie uma
+ Nova fonte abre a janela Adicionar uma fonte de dados: “Aponte para qualquer API da web, consulte uma resposta real e clique no valor que quer mostrar no chat.”
- Dê um nome e cole o endereço
Nome de exibição é para você. Ele vira automaticamente o Nome da fonte de dados, a palavra que entra no marcador: “Letras minúsculas, números e sublinhados. Usado em {urlfetch:name}.” Depois, Endereço da web, em https, até 512 caracteres.
- Consulte uma resposta real
Consultar uma amostra chama sua API de verdade, cerca de uma vez a cada 10 segundos. Se a resposta chegar em um formato que a janela não consegue ler, use o link ou cole uma resposta e cole uma à mão.
- Clique no valor e adicione a fonte
A resposta vira uma árvore sob “Clique no valor que quer mostrar no chat.” Clique em
temperature_2me a janela mostra Exibindo current.temperature_2m. Adicionar fonte salva tudo, e a linha da paleta insere{urlfetch:weather}no seu cursor.
Adicionar uma fonte de dados
Aponte para qualquer API da web, consulte uma resposta real e clique no valor que quer mostrar no chat.
Letras minúsculas, números e sublinhados. Usado em {urlfetch:name}.
Clique no valor que quer mostrar no chat.
- 01 O nome de exibição é o que você lê nas listas. Ele vira automaticamente o nome da fonte de dados abaixo.
- 02 O nome da fonte de dados é a palavra colocada no marcador: letras minúsculas, números e sublinhados, até 32 caracteres.
- 03 Endereço da web: https, absoluto, até 512 caracteres. O bot o envia exatamente assim, sempre.
- 04 Consultar uma amostra faz uma requisição real à sua API. Cerca de um teste a cada 10 segundos.
- 05 Clicar em um valor salva o caminho dele na fonte. “Usar a resposta inteira” muda para texto simples.
Depois que a fonte é criada, o mesmo botão a lista. Cada fonte salva mostra o seu caminho, o que permite distinguir dois feeds de clima de relance, e clicar em uma linha coloca o marcador onde estava o seu cursor.
Inserir variável
- 01 O botão Fonte de dados fica com as pastilhas de marcadores, abaixo de Resposta, ao lado de Contador.
- 02 Cada linha mostra o caminho salvo na fonte, ou “Texto simples” quando exibe a resposta inteira.
- 03 + Nova fonte abre a janela sem perder o comando que você está escrevendo.
03Escolher o valor
Esta é a mesma árvore do painel, com as mesmas regras. Só os
valores são clicáveis; um ramo como current contém outras coisas, então não pode terminar um caminho. Edite a resposta à esquerda e
a árvore acompanha, o que continua sendo a forma mais rápida de testar com a sua própria
API antes de salvar qualquer coisa.
Salvo na fonte
Marcador que você digita
Caminho escrito no marcador
O chat mostrariacortado aqui, 100 bytes
O modo texto simples não salva nenhum caminho. O bot limpa a resposta e mostra os seus primeiros 100 bytes.
| Regra | O que significa |
|---|---|
| Pontos entre as etapas | current.temperature_2m entra em current, depois sai com temperature_2m. |
| Listas usam números puros | items.0.name é a primeira entrada. Colchetes não fazem parte da gramática. |
| Profundidade | Até 8 etapas. Além disso, a árvore recusa o valor: “Mais profundo que 8 níveis. Escolha algo mais perto do topo.” |
| Cada etapa | Letras, números, sublinhado e hífen, até 64 caracteres cada uma. |
| O fim do caminho | Termina em um valor: texto, um número, true ou false. Parar em um objeto, uma lista ou um campo vazio conta como fonte de dados quebrada, e o chat mostra o seu |default, ou o marcador bruto se não houver um. |
| Um caminho no marcador | Tem prioridade sobre o salvo na fonte. {urlfetch:weather.current.wind_speed_10m} lê outro valor do mesmo endereço. |
| O nome | Sem diferenciar maiúsculas. {URLFETCH:Weather} e {urlfetch:weather} são a mesma fonte. |
| O valor | Limpo, aparado, depois cortado em 100 bytes antes de chegar ao chat. |
{urlfetch:weather} em current.temperature_2m para
!weather, depois escreva
{urlfetch:weather.current.wind_speed_10m} em !wind.
Mesma fonte, mesmo orçamento de 20 fontes de dados, duas respostas diferentes.04As APIs que exigem uma chave
Algumas APIs exigem uma chave antes de responder. Adicione-a uma vez em Configurações, no painel Chaves de API: um rótulo de até 32 caracteres para reconhecê-la depois, e o segredo em si, de até 512 caracteres, depois Adicionar chave. A indicação do painel diz melhor do que nós: “Chaves de API que suas fontes de dados enviam em cada requisição. Pessoas com acesso compartilhado podem usá-las, mas nunca vê-las.”
O segredo é selado antes de ser gravado e nunca mais é exibido. Você mantém
o rótulo e os últimos 4 caracteres, o suficiente para diferenciar duas chaves quando trocar
uma delas. Quando uma fonte de dados tem uma chave, o bot a envia em um
cabeçalho Authorization: Bearer a cada consulta, e o endereço continua
limpo.
Na janela “Adicionar uma fonte de dados”, escolha a chave no campo Chave da API. “Nenhuma chave necessária” é a resposta certa para a maioria das APIs públicas. Se nenhuma chave estiver salva, o campo indica “Ainda não há chaves de API. Adicione uma em Configurações, depois selecione-a aqui.” e um link Abrir chaves de API leva às Configurações.
05Limites e tempos limite
Os números abaixo são os que rodam em produção. O cache é o que você vai encontrar primeiro: uma resposta aceita é reutilizada por 30 segundos, então um comando executado 40 vezes em um minuto chama a sua API só duas vezes.
| Limite | O número |
|---|---|
| Fontes de dados por canal | 20. |
| Fontes de dados em uma resposta | 3. O editor recusa salvar uma quarta. |
| Endereço da web | Somente https, absoluto, até 512 caracteres. |
| Endereços recusados | Endereços IP literais, localhost, e qualquer coisa que termine em .local ou .internal. Verificado ao salvar e a cada consulta. |
| Tamanho da resposta | O bot lê até 1 MiB de uma resposta, medido após a descompressão. |
| Tamanho da amostra | O editor só mostra uma árvore para uma amostra de texto legível de no máximo 128 KB. Uma resposta maior ou ilegível dá “A API respondeu, mas a resposta não pôde ser lida automaticamente. Cole uma abaixo.” Uma amostra colada com mais de 128 KB dá “Esta amostra passa de 128 KB. Cole uma mais curta.” |
| Tipo de conteúdo | application/json ou text/*. |
| Tempos limite | A API tem 2,5 segundos, o serviço de consulta 3 segundos, e o bot para de esperar aos 3,5 segundos. |
| Cache | Uma boa resposta fica guardada por 30 segundos. Uma recusa, como um 404 ou um caminho que não encontra nada, fica guardada por 15 segundos. Uma falha não entra no cache. |
| Requisições por canal | 6 por minuto, somando todas as fontes de dados. |
| Requisições por fonte de dados | 30 por minuto. |
| Requisições por host de API | 120 por minuto, contadas em todos os canais que apontam para este host. |
| Redirecionamentos | Até 3 saltos, cada um permanecendo em https. |
| Um host que falha em sequência | Cinco falhas de transporte seguidas e este host fica em repouso por 60 segundos. |
| “Consultar uma amostra” | Cerca de um teste a cada 10 segundos: “Testes demais. Cada um chama a API de verdade. Aguarde cerca de 10 segundos e tente de novo.” |
- Requisições realmente recebidas pela sua API
- 2 por minuto
- Atendidas pelo cache de 30 segundos
- 10 por minuto
- Recusadas pelo teto de 6 por minuto
- 0 por minuto
Estas execuções não mostram nada no lugar do valor, ou a sua alternativa.
O cache existe por causa da sua cota de API. Sem ele, uma única raid gastaria um mês de chamadas em uma noite, e todos os outros canais apontando para o mesmo host também sentiriam.
06O que o chat mostra quando algo falha
Um comando nunca fica mudo por causa de uma fonte de dados. O resto da
frase sai mesmo assim e o valor fica vazio, a menos que você tenha escrito uma alternativa depois
de uma barra vertical: {urlfetch:weather|indisponível} diz
“indisponível” quando a consulta falha. Uma fonte pausada, ausente ou incapaz de produzir um valor
funciona do mesmo jeito: o chat e os temporizadores mostram o valor |default
do marcador. Sem |default, o chat mostra o marcador bruto, como digitado, e é
por isso que um {urlfetch:weather} cru no chat significa
“verifique esta fonte de dados”.
| O que aconteceu | O que o chat mostra |
|---|---|
| A API recusou, limitou, devolveu um erro, demorou mais do que o bot espera, o caminho não encontrou nada, ou a mensagem é a reprodução de uma antiga | Nada no lugar do valor, ou o texto da sua alternativa. |
| A fonte está pausada, ausente, nunca foi salva, ou não conseguiu produzir um valor | O texto da sua alternativa. Sem alternativa, o marcador aparece exatamente como digitado: {urlfetch:weather}. |
PrincessBarney!weather
ItsBagelBotEstá fazendo °C em Montreal agora.
Sua chave foi rejeitada, ou o endpoint recusou a requisição. Teste pelo painel e você recebe o mesmo veredito: “A API recusou a solicitação. Confira a URL e selecione a chave certa em Chave da API se esta API precisar de uma.”
Um teto foi atingido: 6 consultas por minuto para o canal, 30 para esta fonte de dados, ou 120 por minuto para esta API em todos os canais. Nada está quebrado e no minuto seguinte volta a funcionar.
O bot espera 3,5 segundos e depois fala sem o valor. Uma API lenta sob carga é o motivo mais comum.
O caminho estava certo, mas a resposta não tinha nada no fim, em geral porque a API renomeou um campo. Abra a fonte, consulte uma amostra e clique no valor de novo.
Uma fonte pausada ou ausente não tem o que expandir. Um marcador com |default mostra esse valor. Um marcador sem |default, como este, aparece do jeito que foi digitado. O painel avisa quando uma fonte não consegue produzir um valor: “Esta fonte de dados não conseguiu produzir um valor. Enquanto isso, o chat mostra o valor |default do marcador, se ele tiver um, senão {urlfetch:name} como foi digitado. Confira o endereço da web e a chave da API, depois clique em Consultar uma amostra novamente.”
Três fontes de dados por resposta é o limite do editor, e ele recusa salvar uma quarta. O bot mantém o próprio teto em oito e mostra exatamente como está cada marcador além disso, como este.
{urlfetch:weather|indisponível}. Assim, uma API lenta é lida
como “indisponível” em vez de um buraco na frase.Se algo der errado
| O que você vê | O que significa | O que fazer |
|---|---|---|
| A API recusou a solicitação. Confira a URL e selecione a chave certa em Chave da API se esta API precisar de uma. | A API descartou o teste: chave errada ou ausente, ou endereço errado. | Confira o endereço da web. Se a API exigir uma chave, adicione-a em Configurações, no painel Chaves de API, escolha-a no campo Chave da API e teste de novo. |
| Limite de solicitações atingido. Aguarde um instante e teste de novo. | Um teto de requisições foi atingido. | Aguarde um minuto e teste de novo. |
| A API devolveu um erro. O chat não mostra nada, a menos que o marcador tenha um |default: {urlfetch:nome|default}. | A API respondeu com um erro. | Confira o status da API, ou adicione uma alternativa depois de uma barra vertical. |
| O tempo limite da API se esgotou. O chat não mostra nada, a menos que o marcador tenha um |default: {urlfetch:nome|default}. | A API demorou mais do que o bot espera. | Tente de novo, e adicione uma alternativa depois de uma barra vertical. |
| Esta fonte de dados não conseguiu produzir um valor. Enquanto isso, o chat mostra o valor |default do marcador, se ele tiver um, senão {urlfetch:name} como foi digitado. Confira o endereço da web e a chave da API, depois clique em Consultar uma amostra novamente. | A fonte está pausada, ou o caminho ou o endereço não retorna nenhum valor. | Reative a fonte se estiver pausada. Caso contrário, corrija o endereço ou a chave, consulte uma amostra e clique no valor de novo. |
| O serviço de consulta não respondeu. Tente de novo em instantes. | O serviço que chama a sua API não respondeu a tempo. | Aguarde um instante e teste de novo. |
| A API respondeu, mas a resposta não pôde ser lida automaticamente. Cole uma abaixo. | A resposta não é texto legível, ou passa de 128 KB. | Clique em “ou cole uma resposta” e cole uma resposta real à mão. |
| Isto não é JSON válido. Corrija e a árvore aparecerá aqui. | A amostra colada não é JSON. | Cole a resposta de novo, da primeira chave até a última. |
| Esta amostra passa de 128 KB. Cole uma mais curta. | A amostra colada é grande demais para a árvore. | Cole um trecho menor da resposta. |
| Testes demais. Cada um chama a API de verdade. Aguarde cerca de 10 segundos e tente de novo. | Consultar uma amostra permite cerca de um teste a cada 10 segundos. | Aguarde 10 segundos. |
| Você atingiu o limite de 20 fontes de dados para o seu canal. Exclua uma para liberar espaço. | Um canal guarda 20 fontes de dados. | Exclua uma fonte que você não usa mais. |
| Já existe uma fonte de dados chamada “name”. | Outra fonte já usa este nome. | Escolha outro nome, ou edite a fonte existente. |
| Uma mensagem de temporizador pode referenciar no máximo 3 valores consultados diferentes ({urlfetch:…}). | As mensagens de temporizador são limitadas a 3 fontes de dados. | Cite menos fontes na mensagem do temporizador. |
| Um {urlfetch:name} bruto no chat | A fonte está pausada, ausente, ou não consegue produzir um valor, e o marcador não tem |default. Os marcadores além do teto por mensagem também continuam brutos. | Abra o comando, confira se o nome corresponde a uma fonte salva, e reative-a se estiver pausada. Adicione um |default para o chat mostrar uma alternativa. |
07O que uma fonte não faz
-
O endereço fica fixo ao ser salvo.
{args}e{user}permanecem intactos em um endereço da web, então um espectador não consegue direcionar a requisição enviada à sua API. -
As requisições são
GET, e os cabeçalhos não são seus para configurar. O único que o bot adiciona éAuthorization: Bearer, e só quando a fonte tem uma chave. - Os marcadores se expandem nas respostas de comandos personalizados, depois das verificações de permissão, de live e de tempo de espera, e nas mensagens de temporizador, a cada disparo. Uma mensagem de temporizador pode citar até 3 fontes de dados diferentes. Os contadores deixam o marcador em paz.
- Uma mensagem de chat reproduzida nunca consulta duas vezes. Se o bot reprocessar um evento antigo, o chat recebe um espaço vazio (ou a sua alternativa) em vez de uma segunda chamada à sua API.
- Endereços privados e locais são descartados nas duas pontas: ao salvar, e de novo no momento da consulta.
{urlfetch:weather} na frase e
{urlfetch:weather.current.wind_speed_10m} logo depois: dois
valores, uma requisição, uma linha da sua cota.