Pular para o conteúdo

Referência do editor de widgets

Esta página lista o que o seu código pode usar em um widget do editor de widgets do KickBot: os eventos widgetEvent, o objeto globalValues, o objeto userVariables e as funções auxiliares em window.kickbotWidget. Todo widget é HTML, CSS e JavaScript puro, que roda como browser source no OBS. O KickBot se conecta à Kick por você e envia os eventos para o seu código.

Quando o OBS abre a URL do widget, o KickBot:

  1. Carrega a página do widget com fundo transparente.
  2. Coloca seu CSS em um elemento <style> e seu HTML na página.
  3. Carrega os dados do seu canal da Kick (número de seguidores, número de espectadores, status da live e chat recente) em globalValues.
  4. Roda seu JavaScript. Ele roda uma vez, depois do passo 3, então globalValues já está pronto quando seu código começa.
  5. Envia os eventos ao vivo para o seu código como eventos widgetEvent em document.

Seu JavaScript pode ler dois objetos sem importar nada: globalValues e userVariables. As funções auxiliares ficam em window.kickbotWidget.

Limites:

ItemLimite
Largura e alturaDefinidas em Configurações básicas. Um widget novo em branco tem 800 × 600. A janela Novo widget aceita até 7680 × 4320.
HTML, CSS e JavaScriptAté 2.000.000 de caracteres por arquivo
Nome do widgetAté 500 caracteres
Arquivos das variáveis do usuárioAté 25 MB por arquivo
Widgets do editor no plano Grátis10 (sem limite no Premium)

Adicione um listener para widgetEvent em document. Cada evento tem event.detail com três campos:

CampoTipoValor
event_namestringO evento, por exemplo followEvent
sourcestringSempre kick
dataobjectOs dados do evento (veja abaixo)
document.addEventListener('widgetEvent', (event) => {
const { event_name, data } = event.detail;
if (event_name === 'followEvent') {
showAlert(data.user.username + ' followed!');
}
if (event_name === 'subEvent') {
showAlert(data.username + ' subscribed for ' + data.months + ' months');
}
});
Nome do eventoQuando disparaBotão de teste
subEventUm espectador se inscreveSub
subGiftEventUm espectador presenteia subsSub presenteada
kicksEventUm espectador envia KICKsKICKs
followEventUm espectador segueFollow
unfollowEventUm espectador deixa de seguirUnfollow
chatMessageEventUma mensagem é enviada no chatMensagem
chatMessageDeletedEventUm moderador apaga uma mensagemMensagem excluída
chatMessagePinnedEventUma mensagem é fixadaMensagem fixada
chatMessageUnpinnedEventA mensagem fixada é removidaMensagem desafixada
chatClearedEventUm moderador limpa o chatChat limpo
followerCountUpdatedEventA Kick envia um novo número de seguidoresContagem de followers atualizada
subCountUpdatedEventO número de subs na Kick mudouContagem de subs atualizada
viewerCountUpdatedEventA Kick envia um novo número de espectadoresContagem de viewers atualizada
raidEventOutro canal faz raid (host) em vocêRaid
streamOnlineSua live começaStream ao vivo
streamOfflineSua live terminaStream offline

Não existe evento de gorjeta. Para alertas de gorjeta, use o widget de alerta de gorjeta.

Estes são os dados em event.detail.data. Eles são iguais aos dos eventos de teste no editor. Os eventos reais podem ter mais campos. Os nomes, números e IDs aqui são exemplos.

subEvent

{
months: 1,
username: 'viewer_one',
chatroom_id: 3847194
}

subGiftEvent

{
chatroom_id: 3847194,
gifted_usernames: ['viewer_one', 'viewer_two', 'viewer_three'],
gifter_username: 'big_gifter'
}

kicksEvent

{
message: 'Great stream!',
sender: { id: 12345678, username: 'viewer_one', username_color: '#93EBE0' },
gift: {
gift_id: 'full_send',
name: 'Full Send',
amount: 100,
type: 'BASIC',
tier: 'BASIC',
character_limit: 0,
pinned_time: 0
},
channel: 'channel_3984507'
}

followEvent e unfollowEvent (mesmo formato; followers_count é o novo número)

{
id: 'd4e5f6a7-89b0-12c3-d456-78901e2f3a4b',
channel: { id: 3984507, slug: 'kickbotdev' },
user: { id: 14873539, slug: 'viewer_one', username: 'viewer_one' },
followers_count: 36,
created_at: '2024-05-13T22:19:07+00:00'
}

chatMessageEvent

{
id: '85c884b3-7377-478c-b6aa-22b7db752b93',
chatroom_id: 3974112,
content: 'hello [emote:37226:KEKW]',
type: 'message',
created_at: '2024-05-13T22:29:52+00:00',
sender: {
id: 4063326,
username: 'viewer_one',
slug: 'viewer_one',
identity: {
color: '#72ACED',
badges: [{ type: 'subscriber', text: 'Subscriber', count: 3 }]
}
}
}

Os emotes da Kick ficam em content como [emote:ID:NAME]. Use createChatMessageFragment (veja Mostre o texto do chat com segurança) para transformar os emotes em imagens.

chatMessageDeletedEvent

{
id: '9cd3788a-ecd2-4051-a162-a7ea9be8ce7a',
message: { id: '89d6be86-63db-4581-922e-14a6c4a9c2e6' }
}

Use data.message.id para encontrar e remover a mensagem que você mostrou.

chatMessagePinnedEvent (data.message tem o mesmo formato dos dados de um chatMessageEvent)

{
message: {
id: '5d798a38-ad17-45e4-8169-bda2faa85b79',
chatroom_id: 3974112,
content: 'This is a pinned message!',
type: 'message',
created_at: '2024-05-13T22:30:41+00:00',
sender: { id: 4063326, username: 'kickbotdev', slug: 'kickbotdev', identity: { color: '#72ACED', badges: [] } }
}
}

chatMessageUnpinnedEvent: data é um array vazio ([]).

chatClearedEvent

{ id: '47e3596f-0274-46e0-85b1-029fa3bfc5ea' }

followerCountUpdatedEvent (atenção ao camelCase em followersCount)

{ followersCount: 1532, channel_id: 4599, created_at: 1715639984 }

subCountUpdatedEvent

{ subscriber_count: 184, channel_id: 4599 }

viewerCountUpdatedEvent

{ viewer_count: 320, channel_id: 5937485 }

raidEvent

{
chatroom_id: 839485,
optional_message: 'gg stream',
number_viewers: 150,
host_username: 'raiding_channel'
}

streamOnline

{
livestream: {
id: 3984507,
channel_id: 3984507,
session_title: 'Test stream!',
created_at: '2024-05-13T22:30:41+00:00'
}
}

streamOffline

{
livestream: {
id: 3984507,
channel: { id: 3984507, is_banned: false }
}
}

globalValues guarda o estado atual do seu canal. O KickBot preenche o objeto antes de o seu código rodar e mantém tudo atualizado conforme os eventos chegam. Use esses valores para desenhar o widget no início, antes de chegar qualquer evento.

globalValues = {
subCount: 184,
followerCount: 1532,
viewerCount: 320,
lastFollower: { /* the last follow */ },
lastSub: { /* the last sub, for example { username, months } */ },
lastGiftedSub: { /* the last gift, for example { gifter_username, gifted_usernames } */ },
chatMessages: [ /* chatMessageEvent payloads */ ],
streamerInfo: {
kick: {
username: 'KickBotDev',
slug: 'kickbotdev',
profile_picture: 'https://files.kick.com/images/user/.../fullsize.webp',
user_id: '4063326',
channel_id: '3984507',
chatroom_id: '3974112',
bio: 'Channel bio',
subscriber_badges: [ /* your channel's sub badges from Kick */ ]
}
},
currentStream: {
is_live: true,
title: 'Stream title',
started_at: '2026-10-24 18:00:00'
}
}
ValorComo atualiza
subCountCarregado da Kick. Sobe 1 a cada subEvent e 1 a cada sub presenteado, e é definido de novo por subCountUpdatedEvent.
followerCountCarregado da Kick. Definido por followEvent, unfollowEvent e followerCountUpdatedEvent.
viewerCountCarregado da Kick (0 quando você está offline). Definido por viewerCountUpdatedEvent.
lastFollower, lastSub, lastGiftedSubO último que o KickBot viu no seu canal, ou null. Atualizado pelo evento correspondente.
chatMessagesO chat recente da Kick quando o widget carrega e depois cada mensagem nova. Guarda as 100 mais novas. chatClearedEvent esvazia a lista. Para esconder mensagens apagadas, trate chatMessageDeletedEvent no seu próprio código.
streamerInfo.kickSeu perfil da Kick. Não muda enquanto o widget roda.
currentStreamCarregado da Kick quando o widget carrega. Não é atualizado por streamOnline nem por streamOffline. Ouça esses eventos se você precisa saber se está ao vivo.

As variáveis do usuário são as configurações que os streamers veem quando abrem o seu widget em Widgets salvos. Você adiciona as variáveis em Variáveis do usuário no editor. No código, leia o valor com userVariables.<variable name>.value.

const goal = Number(userVariables.follower_goal.value);
document.body.style.color = userVariables.text_color.value;

Campos de uma variável:

CampoO que é
TítuloO nome que os streamers veem.
Nome da variávelO nome no seu código. Só letras, números e _. Você não pode mudar depois de criar a variável.
TooltipTexto extra de ajuda abaixo do título.
Tipo de variávelVeja a tabela abaixo.
Valor padrãoO valor antes de o streamer mudar. Pode ficar vazio.
ObrigatóriaOs streamers precisam preencher um valor antes de salvar.
TipoO que o streamer vêvalue no seu código
TextoUma caixa de textoUma string
NúmeroUma caixa de númeroUm número ou uma string numérica. Use Number() para garantir.
CorUm seletor de corUma string com a cor em hex, por exemplo #ffffff
DropdownUm menu com as suas opçõesA opção escolhida, como string. O padrão é a primeira opção.
ToggleUma chave de ligar e desligartrue ou false
Imagem/GIFUma caixa de URL e um botão de envioUma URL para o arquivo
VídeoUma caixa de URL e um botão de envioUma URL para o arquivo
ÁudioUma caixa de URL e um botão de envioUma URL para o arquivo

Os arquivos enviados ficam guardados no KickBot, e value é a URL do arquivo. Use o menu ao lado de uma variável para mover para cima ou para baixo, editar ou excluir. A ordem no editor é a ordem que os streamers veem.

Trate todo campo de evento e toda variável do usuário como texto de um desconhecido. O KickBot limpa o texto do chat e dos eventos antes de ele chegar ao seu código, então ele é seguro como texto HTML, mas não como URL, CSS ou script. Não coloque campos de evento crus em innerHTML. Use estas funções auxiliares:

Função auxiliarO que faz
window.kickbotWidget.createChatMessageFragment(content, font_size)Retorna um DocumentFragment com nós de texto e imagens dos emotes da Kick. Os emotes têm font_size + 3 pixels. font_size é 20 por padrão.
window.kickbotWidget.createTextNode(value)Retorna um nó de texto para qualquer valor.
window.kickbotWidget.escapeHtmlText(value)Escapa o texto para usar entre tags HTML quando você precisa montar uma string HTML. Não use para URLs, CSS ou script.
document.addEventListener('widgetEvent', (event) => {
if (event.detail.event_name !== 'chatMessageEvent') return;
const data = event.detail.data;
const line = document.createElement('div');
line.id = 'msg-' + data.id;
const name = document.createElement('strong');
name.style.color = data.sender.identity.color;
name.append(window.kickbotWidget.createTextNode(data.sender.username + ': '));
line.append(name);
line.append(window.kickbotWidget.createChatMessageFragment(data.content, 20));
document.getElementById('chat').append(line);
});

Para outros textos, use textContent ou createTextNode.

A prévia no editor funciona como o OBS, com algumas diferenças para testes:

  • Quando você muda o código ou uma variável do usuário, a prévia roda seu JavaScript de novo. Antes, o KickBot remove os listeners de widgetEvent da execução anterior. Os timers de setInterval e setTimeout não são removidos, então clique no botão de recarregar se eles se acumularem.
  • Quando você muda a largura ou a altura, a prévia recarrega.
  • Os eventos de teste vão só para a prévia. Um Follow de teste soma 1 em globalValues.followerCount, e Unfollow tira 1. Contagem de viewers atualizada envia um número de exemplo. Mensagem excluída remove uma mensagem aleatória do chat da prévia.
  • Se o seu canal ainda não tem último seguidor, sub ou sub presenteado, a prévia usa dados de exemplo para lastFollower, lastSub e lastGiftedSub.
  • Para ver a saída de console.log e os erros, clique no botão de abrir em janela separada e abra as ferramentas de desenvolvedor nessa janela.

Esta é uma meta de seguidores curta. Ela usa um listener de evento, globalValues e duas variáveis do usuário: follower_goal (Número) e bar_color (Cor).

HTML:

<div class="goal">
<span id="count"></span> / <span id="target"></span>
<div class="bar"><div class="fill"></div></div>
</div>

CSS:

body { margin: 0; font-family: Arial, sans-serif; color: #fff; }
.goal { padding: 12px; background: #100c28; border-radius: 16px; font-size: 32px; font-weight: bold; }
.bar { height: 24px; margin-top: 8px; background: #3d3957; border-radius: 12px; overflow: hidden; }
.fill { height: 100%; width: 0; transition: width 0.3s ease; }

JavaScript:

const target = Number(userVariables.follower_goal.value) || 100;
document.getElementById('target').textContent = target;
document.querySelector('.fill').style.background = userVariables.bar_color.value;
function update(count) {
document.getElementById('count').textContent = count;
document.querySelector('.fill').style.width = Math.min((count / target) * 100, 100) + '%';
}
document.addEventListener('widgetEvent', (event) => {
const { event_name, data } = event.detail;
if (event_name === 'followEvent' || event_name === 'unfollowEvent') update(data.followers_count);
if (event_name === 'followerCountUpdatedEvent') update(data.followersCount);
});
update(globalValues.followerCount);

Para uma versão completa com mais configurações, comece um widget novo pelo template Simple Follower Goal.

  • Desenhe o primeiro estado a partir de globalValues e depois mude com os eventos. Um widget que espera um evento fica vazio até alguma coisa acontecer.
  • Widgets salvos só mostra botões de teste para os nomes de evento que aparecem no seu JavaScript. Escreva o nome completo do evento (por exemplo 'followEvent') no código para os streamers poderem testar seu widget.
  • Deixe o fundo transparente, a não ser que um fundo faça parte do design, para o widget ficar por cima da cena.
  • Você também pode gerenciar os widgets do editor com a API do KickBot. Veja a referência da API de widgets (em inglês).