---
title: "Como avisar no Discord quando um streamer entra ao vivo na Twitch ou no YouTube"
description: "Faça seu bot de Discord avisar no canal quando um streamer abre live na Twitch ou posta vídeo novo no YouTube, sem repetir o mesmo aviso duas vezes."
url: "https://streethosting.com.br/guias/bots-discord/bot-discord-notificacao-live-twitch-youtube"
category: "bots-discord"
slug: "bot-discord-notificacao-live-twitch-youtube"
datePublished: "2026-11-13"
dateModified: "2026-11-13"
author: "Equipe StreetHosting"
difficulty: "intermediario"
language: "pt-BR"
keywords:
  - "bot discord notificação live twitch youtube"
  - "bot discord avisar live twitch"
  - "api helix twitch streams discord.js"
  - "notificação youtube discord rss"
  - "bot discord streamer ao vivo"
---

# Bot Discord avisando live da Twitch e vídeo novo do YouTube

Veja como consultar a API Helix da Twitch e o feed RSS do YouTube, montar o embed do aviso e guardar o que já foi anunciado para o bot nunca repetir a mensagem.

> **Resposta rápida**
>
> Para avisar live da Twitch, crie um aplicativo no console de desenvolvedores, pegue um token de aplicativo e consulte o endpoint `/helix/streams` a cada minuto. Guarde o id da transmissão já anunciada para não repetir. No YouTube, leia o feed RSS do canal para vídeos novos, sabendo que lives não aparecem de forma confiável sem a Data API.

## Como o aviso funciona

O Discord não sabe nada sobre Twitch ou YouTube. Quem descobre que o canal entrou ao vivo é o seu bot, perguntando para a plataforma de tempos em tempos. Quando a resposta mostra uma live que ainda não foi anunciada, o bot manda uma mensagem com embed no canal escolhido. É um laço simples de consultar, comparar e avisar.

Existem dois jeitos de saber da live na Twitch. O primeiro é a consulta periódica, que vamos montar aqui: a cada minuto o bot chama a API Helix e vê quem está transmitindo. O segundo é o EventSub, em que a Twitch avisa o seu bot assim que o evento `stream.online` acontece. O EventSub é mais rápido e não gasta chamadas à toa, mas exige uma conexão WebSocket ou um endereço público com HTTPS, além de mais código. Para um servidor com meia dúzia de streamers, a consulta a cada minuto entrega o mesmo resultado com muito menos trabalho.

O exemplo usa discord.js v14 e Node 20 ou mais novo, que já traz `fetch` embutido. Se você ainda não tem o bot de pé, comece pelo guia de [criar o primeiro bot Discord do zero](https://streethosting.com.br/guias/bots-discord/criar-primeiro-bot-discord-do-zero). Este bot só envia mensagens, então a intent Guilds basta.

## Twitch: criar o app e pegar o token

A API da Twitch exige que toda chamada diga quem você é. Como o bot só lê dados públicos de streams, você usa o token de aplicativo, que não depende de login de ninguém.

1. Entre no console de desenvolvedores da Twitch com a sua conta e abra a aba de aplicativos.
2. Registre um aplicativo novo. Como URL de redirecionamento do OAuth, pode usar `http://localhost`, que não será usada.
3. Copie o Client ID e gere um Client Secret.
4. Coloque os dois em variáveis de ambiente do bot, nunca dentro do código.

Com isso, o token sai de uma chamada POST para o servidor de autenticação da Twitch. Ele dura bastante tempo, mas expira, então o código abaixo guarda a validade e pede outro quando preciso.

```
let token = null;
let tokenExpira = 0;

async function obterToken() {
  if (token && Date.now() < tokenExpira) return token;

  const resp = await fetch('https://id.twitch.tv/oauth2/token', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: new URLSearchParams({
      client_id: process.env.TWITCH_CLIENT_ID,
      client_secret: process.env.TWITCH_CLIENT_SECRET,
      grant_type: 'client_credentials',
    }),
  });
  if (!resp.ok) throw new Error(`Token da Twitch falhou: ${resp.status}`);

  const dados = await resp.json();
  token = dados.access_token;
  // renova 5 minutos antes de vencer
  tokenExpira = Date.now() + (dados.expires_in - 300) * 1000;
  return token;
}
```

> **Atenção**
>
> O Client Secret é uma senha. Se ele vazar em um repositório público, gere outro no console da Twitch na hora. O guia de [token seguro com variáveis de ambiente](https://streethosting.com.br/guias/bots-discord/bot-discord-token-seguro-variaveis-ambiente) mostra como manter esses valores fora do código.

## Twitch: consultar quem está ao vivo

O endpoint `GET https://api.twitch.tv/helix/streams` devolve só as transmissões que estão no ar agora. Você repete o parâmetro `user_login` para cada canal, em uma única chamada. Quem está offline simplesmente não aparece na lista, então uma resposta vazia significa que ninguém está ao vivo.

```
const CANAIS_TWITCH = ['streamer_um', 'streamer_dois'];

async function buscarLives() {
  const params = new URLSearchParams();
  for (const login of CANAIS_TWITCH) params.append('user_login', login);

  const resp = await fetch(`https://api.twitch.tv/helix/streams?${params}`, {
    headers: {
      'Client-Id': process.env.TWITCH_CLIENT_ID,
      Authorization: `Bearer ${await obterToken()}`,
    },
  });

  if (resp.status === 401) {
    token = null; // força um token novo na próxima rodada
    throw new Error('Token da Twitch recusado');
  }
  if (!resp.ok) throw new Error(`Helix respondeu ${resp.status}`);

  const { data } = await resp.json();
  return data;
}
```

Cada item de `data` traz `id` (o id da transmissão), `user_login`, `user_name`, `title`, `game_name` e `thumbnail_url`. A miniatura vem com os marcadores de largura e altura que você precisa trocar por números.

> **Dica**
>
> O limite de chamadas da Twitch é folgado para esse uso. Uma consulta por minuto com todos os canais na mesma chamada é pouquíssimo. Não faça uma chamada por canal em laço, porque isso multiplica o consumo sem ganho nenhum.

## Evitar aviso duplicado

Se o bot só avisasse sempre que visse alguém ao vivo, mandaria uma mensagem nova a cada minuto. A solução é lembrar o que já foi anunciado. Na Twitch cada transmissão tem um id próprio, que muda quando o streamer encerra e abre outra live. Guardar o último id por canal resolve: se o id da live atual for igual ao salvo, o bot fica quieto.

Um objeto na memória não basta, porque ele some quando o bot reinicia e o aviso sai de novo. Salve em um arquivo JSON simples.

```
const fs = require('node:fs');
const { Client, Events, GatewayIntentBits, EmbedBuilder } = require('discord.js');

const ARQUIVO_ESTADO = './estado-avisos.json';

function lerEstado() {
  try {
    return JSON.parse(fs.readFileSync(ARQUIVO_ESTADO, 'utf8'));
  } catch {
    return { twitch: {}, youtube: {} };
  }
}

function salvarEstado(estado) {
  fs.writeFileSync(ARQUIVO_ESTADO, JSON.stringify(estado, null, 2));
}

const client = new Client({ intents: [GatewayIntentBits.Guilds] });

async function checarTwitch(canal) {
  const lives = await buscarLives();
  const estado = lerEstado();

  for (const live of lives) {
    if (estado.twitch[live.user_login] === live.id) continue;

    const miniatura = live.thumbnail_url
      .replace('{width}', '1280')
      .replace('{height}', '720');

    const embed = new EmbedBuilder()
      .setColor(0x9146ff)
      .setTitle(live.title || 'Ao vivo agora')
      .setURL(`https://twitch.tv/${live.user_login}`)
      .setAuthor({ name: `${live.user_name} está ao vivo` })
      .addFields({ name: 'Jogando', value: live.game_name || 'Sem categoria' })
      .setImage(`${miniatura}?t=${Date.now()}`);

    await canal.send({
      content: `${live.user_name} entrou ao vivo! https://twitch.tv/${live.user_login}`,
      embeds: [embed],
    });

    // salva só depois de enviar, para um erro de envio não perder o aviso
    estado.twitch[live.user_login] = live.id;
    salvarEstado(estado);
  }
}
```

O `?t=` no fim da miniatura engana o cache do Discord, que senão pode mostrar uma imagem antiga da live anterior. Para ligar tudo, chame as checagens em um intervalo quando o bot ficar pronto:

```
client.once(Events.ClientReady, async () => {
  const canal = await client.channels.fetch(process.env.CANAL_AVISOS_ID);
  if (!canal || !canal.isTextBased()) {
    console.error('Canal de avisos não encontrado');
    return;
  }

  const rodar = async () => {
    try {
      await checarTwitch(canal);
      await checarYoutube(canal);
    } catch (err) {
      console.error('Falha na checagem:', err.message);
    }
  };

  rodar();
  setInterval(rodar, 60 * 1000);
});

client.login(process.env.DISCORD_TOKEN);
```

O `try/catch` em volta de tudo é importante: uma queda de rede ou uma resposta ruim da Twitch não pode derrubar o bot, só pular aquela rodada. Se alguma chamada começar a falhar com muitas respostas 429, veja o guia sobre [rate limit do Discord](https://streethosting.com.br/guias/bots-discord/corrigir-rate-limit-discord-429).

## YouTube: vídeos novos pelo feed RSS

Todo canal do YouTube tem um feed público em `https://www.youtube.com/feeds/videos.xml?channel_id=ID_DO_CANAL`. Ele lista os vídeos mais recentes, não pede chave de API e não tem cota. O ID do canal começa com `UC` e costuma aparecer na página do canal, nas informações avançadas. Uma URL com arroba não serve para este feed.

Para ler o XML sem escrever um parser, instale o `rss-parser` com `npm install rss-parser`. Ele devolve cada vídeo como um item com título, link e data. O guia de [feed RSS de notícias no Discord](https://streethosting.com.br/guias/bots-discord/bot-discord-feed-rss-noticias) aprofunda essa biblioteca. Aqui a lógica de duplicado muda um pouco: em vez de um id só, guardamos a lista dos últimos vídeos vistos, para um vídeo apagado não bagunçar o controle.

```
const Parser = require('rss-parser');
const parser = new Parser();

const CANAIS_YOUTUBE = {
  'Nome do canal': 'UCxxxxxxxxxxxxxxxxxxxxxx',
};

async function checarYoutube(canal) {
  const estado = lerEstado();

  for (const [nome, channelId] of Object.entries(CANAIS_YOUTUBE)) {
    const feed = await parser.parseURL(
      `https://www.youtube.com/feeds/videos.xml?channel_id=${channelId}`
    );

    const primeiraVez = !estado.youtube[channelId];
    const vistos = estado.youtube[channelId] || [];
    const novos = feed.items.filter((item) => !vistos.includes(item.id));

    // na primeira execução só memoriza, para não anunciar o canal inteiro
    if (!primeiraVez) {
      for (const video of novos.reverse()) {
        await canal.send(`${nome} publicou um vídeo novo: ${video.title}\n${video.link}`);
      }
    }

    estado.youtube[channelId] = feed.items.map((item) => item.id).slice(0, 30);
    salvarEstado(estado);
  }
}
```

Dois detalhes. O `novos.reverse()` faz o bot anunciar do mais antigo para o mais novo, na ordem em que os vídeos saíram. E a checagem da primeira vez evita o susto de o bot despejar os últimos vídeos do canal assim que você o liga. Colando o link puro na mensagem, o Discord já monta a prévia do vídeo sozinho.

## O limite do YouTube com lives

O feed RSS foi pensado para vídeos publicados. Uma live pode aparecer nele quando é criada ou agendada, mas o feed não informa se ela está ao vivo neste momento nem avisa quando ela termina. Um bot baseado só no RSS vai anunciar a live como se fosse um vídeo comum, e às vezes nem isso. Não dá para tratar isso como detecção confiável.

Para saber de verdade se um canal está ao vivo, o caminho é a YouTube Data API v3, que exige criar um projeto no Google Cloud e gerar uma chave de API. A busca de vídeos com o tipo de evento ao vivo consome bastante da cota diária, por isso o ideal é consultar poucas vezes por hora, ou usar a lista de vídeos do canal e conferir o estado de cada vídeo, que sai mais barato. Confira os números de cota atuais na documentação do Google antes de escolher o intervalo.

Na prática, muita comunidade faz o seguinte: Twitch por consulta periódica, YouTube só para vídeos novos pelo RSS e, se o canal faz live no YouTube, a Data API com intervalo maior. Se o aviso de live no YouTube não for essencial, o RSS já cobre o que importa.

## Onde rodar na StreetHosting

Esse bot só funciona se o processo ficar ligado, porque é ele que pergunta para a Twitch e para o YouTube. Rodando no seu computador, o aviso some quando você desliga a máquina. Na [hospedagem de bots da StreetHosting](https://streethosting.com.br/bots) o bot roda em um container com painel, em Node.js, e fica no ar o tempo todo. O plano Discord Essential, por R$ 9,99/mês, com 1 GB de RAM, atende com folga um bot de avisos, que consome pouquíssimo.

Mantenha o arquivo de estado dentro da pasta do bot, para ele continuar lá entre reinícios, e cadastre as variáveis de ambiente pelo painel. Se preferir configurar o processo por conta própria, o guia de [hospedagem de bot Discord 24/7](https://streethosting.com.br/guias/bots-discord/hospedagem-bot-discord-24-7) explica as opções.

## Perguntas frequentes

### Preciso pagar alguma coisa para usar a API da Twitch?

Não. Criar um aplicativo no console de desenvolvedores da Twitch é grátis e você recebe um Client ID e um Client Secret. A consulta de streams usa só o token de aplicativo, sem login de nenhum usuário.

### Qual a diferença entre consultar a cada minuto e usar EventSub?

Na consulta periódica o bot pergunta de tempos em tempos quem está ao vivo, então o aviso chega com até um intervalo de atraso. No EventSub a Twitch avisa o seu bot na hora em que o canal entra ao vivo, mas você precisa de uma conexão WebSocket ou de um endereço público com HTTPS para receber o webhook. Para poucos canais, a consulta resolve bem.

### O feed RSS do YouTube avisa quando o canal abre uma live?

Não de forma confiável. O feed foi feito para vídeos publicados e pode listar uma live só depois de criada, sem dizer se ela está ao vivo agora. Para detectar live de verdade, o caminho é a YouTube Data API com chave própria.

### Como evitar que o bot avise a mesma live várias vezes?

Guarde o id do último aviso. Na Twitch, cada transmissão tem um id próprio, então basta comparar com o que foi salvo. No YouTube, guarde os ids dos vídeos já vistos. Salve em arquivo para o controle sobreviver a um reinício do bot.

### O bot precisa ficar ligado o tempo todo?

Sim. Quem consulta a API é o próprio processo do bot, então se ele estiver desligado no momento em que o canal abre a live, o aviso só sai quando ele voltar. Por isso vale hospedar em um lugar que mantenha o bot rodando 24 horas.

## Guias relacionados

- [Como publicar notícias de um feed RSS em um canal do Discord](https://streethosting.com.br/guias/bots-discord/bot-discord-feed-rss-noticias.md)
- [Como usar webhook do Discord para alertas de servidor](https://streethosting.com.br/guias/bots-discord/webhook-discord-alertas-servidor.md)
- [Embeds no Discord com discord.js: como montar mensagens formatadas](https://streethosting.com.br/guias/bots-discord/bot-discord-embeds-mensagens-formatadas.md)
- [Hospedagem de bot Discord 24/7 no Brasil](https://streethosting.com.br/guias/bots-discord/hospedagem-bot-discord-24-7.md)

## Produtos citados

- https://streethosting.com.br/bots

## Dados estruturados

```json
[
  {
    "@context": "https://schema.org",
    "@type": [
      "Article",
      "TechArticle"
    ],
    "headline": "Bot Discord avisando live da Twitch e vídeo novo do YouTube",
    "name": "Como avisar no Discord quando um streamer entra ao vivo na Twitch ou no YouTube",
    "abstract": "Veja como consultar a API Helix da Twitch e o feed RSS do YouTube, montar o embed do aviso e guardar o que já foi anunciado para o bot nunca repetir a mensagem.",
    "description": "Faça seu bot de Discord avisar no canal quando um streamer abre live na Twitch ou posta vídeo novo no YouTube, sem repetir o mesmo aviso duas vezes.",
    "datePublished": "2026-11-13",
    "dateModified": "2026-11-13",
    "author": {
      "@type": "Organization",
      "name": "Equipe StreetHosting"
    },
    "publisher": {
      "@type": "Organization",
      "name": "StreetHosting",
      "url": "https://streethosting.com.br"
    },
    "inLanguage": "pt-BR",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://streethosting.com.br/guias/bots-discord/bot-discord-notificacao-live-twitch-youtube"
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "Preciso pagar alguma coisa para usar a API da Twitch?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Não. Criar um aplicativo no console de desenvolvedores da Twitch é grátis e você recebe um Client ID e um Client Secret. A consulta de streams usa só o token de aplicativo, sem login de nenhum usuário."
        }
      },
      {
        "@type": "Question",
        "name": "Qual a diferença entre consultar a cada minuto e usar EventSub?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Na consulta periódica o bot pergunta de tempos em tempos quem está ao vivo, então o aviso chega com até um intervalo de atraso. No EventSub a Twitch avisa o seu bot na hora em que o canal entra ao vivo, mas você precisa de uma conexão WebSocket ou de um endereço público com HTTPS para receber o webhook. Para poucos canais, a consulta resolve bem."
        }
      },
      {
        "@type": "Question",
        "name": "O feed RSS do YouTube avisa quando o canal abre uma live?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Não de forma confiável. O feed foi feito para vídeos publicados e pode listar uma live só depois de criada, sem dizer se ela está ao vivo agora. Para detectar live de verdade, o caminho é a YouTube Data API com chave própria."
        }
      },
      {
        "@type": "Question",
        "name": "Como evitar que o bot avise a mesma live várias vezes?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Guarde o id do último aviso. Na Twitch, cada transmissão tem um id próprio, então basta comparar com o que foi salvo. No YouTube, guarde os ids dos vídeos já vistos. Salve em arquivo para o controle sobreviver a um reinício do bot."
        }
      },
      {
        "@type": "Question",
        "name": "O bot precisa ficar ligado o tempo todo?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Sim. Quem consulta a API é o próprio processo do bot, então se ele estiver desligado no momento em que o canal abre a live, o aviso só sai quando ele voltar. Por isso vale hospedar em um lugar que mantenha o bot rodando 24 horas."
        }
      }
    ]
  }
]
```
