
Como Mostrar Indicadores de Digitação no WhatsApp
Os indicadores de digitação do WhatsApp ("digitando..." e "gravando áudio...") fazem os bots parecerem mais naturais. whatsmeow-node dá controle total sobre esses indicadores com sendChatPresence().
Pré-requisitos
- Uma sessão pareada do whatsmeow-node (Como Parear)
Passo 1: Mostrar "digitando..."
await client.sendChatPresence(chatJid, "composing");
Isso mostra o indicador "digitando..." no chat especificado. O indicador é limpo automaticamente quando você envia uma mensagem.
Passo 2: Mostrar "gravando áudio..."
await client.sendChatPresence(chatJid, "composing", "audio");
O terceiro parâmetro "audio" muda o indicador de "digitando..." para "gravando áudio...".
Passo 3: Limpar o Indicador
await client.sendChatPresence(chatJid, "paused");
Use "paused" para limpar explicitamente o indicador sem enviar uma mensagem. Isso é útil quando o bot decide não responder.
O indicador é limpo automaticamente quando você envia uma mensagem. Você só precisa do "paused" para parar o indicador sem enviar nada.
Passo 4: Simular Digitação Realista
Indicadores instantâneos parecem robóticos. Adicione um delay proporcional ao tamanho da mensagem:
async function typeAndSend(
chatJid: string,
text: string,
): Promise<void> {
await client.sendChatPresence(chatJid, "composing");
// ~50ms per character, clamped between 500ms and 3s
const delay = Math.min(3000, Math.max(500, text.length * 50));
await new Promise((resolve) => setTimeout(resolve, delay));
await client.sendMessage(chatJid, { conversation: text });
}
Passo 5: Definir Status Online/Offline
Antes que os indicadores de digitação funcionem, seu bot precisa estar online:
// Set online — required for typing indicators to show
await client.sendPresence("available");
// Set offline when shutting down
await client.sendPresence("unavailable");
Passo 6: Inscrever-se na Digitação de Outros
Você também pode observar quando outros usuários estão digitando:
// Subscribe to a user's online/offline presence
await client.subscribePresence(userJid);
// Online/offline changes
client.on("presence", ({ jid, presence, lastSeen }) => {
console.log(`${jid}: ${presence}`);
});
// Typing/recording changes
client.on("chat_presence", ({ chat, sender, state, media }) => {
const action =
state === "composing"
? media === "audio" ? "recording audio" : "typing"
: "stopped typing";
console.log(`${sender} is ${action} in ${chat}`);
});
Exemplo Completo
Um bot que mostra digitação antes de cada resposta:
import { createClient } from "@whatsmeow-node/whatsmeow-node";
const client = createClient({ store: "session.db" });
client.on("message", async ({ info, message }) => {
if (info.isFromMe) return;
const text =
(message.conversation as string) ??
(message.extendedTextMessage as { text?: string } | undefined)?.text;
if (!text) return;
// Mark as read
await client.markRead([info.id], info.chat, info.sender);
// Show typing
await client.sendChatPresence(info.chat, "composing");
// Simulate typing delay based on reply length
const reply = `You said: ${text}`;
const delay = Math.min(3000, Math.max(500, reply.length * 50));
await new Promise((resolve) => setTimeout(resolve, delay));
// Send — indicator clears automatically
await client.sendMessage(info.chat, { conversation: reply });
});
async function main() {
const { jid } = await client.init();
if (!jid) {
console.error("Not paired! See: How to Pair WhatsApp");
process.exit(1);
}
await client.connect();
await client.sendPresence("available");
console.log("Bot is online with typing indicators!");
process.on("SIGINT", async () => {
await client.sendPresence("unavailable");
await client.disconnect();
client.close();
process.exit(0);
});
}
main().catch(console.error);
Erros Comuns
Os indicadores de digitação podem não aparecer se você não chamou sendPresence("available") antes. Sempre defina seu status online após conectar.
Mostrar "digitando..." e responder instantaneamente (em menos de 100ms) parece artificial. Adicione um delay curto proporcional ao tamanho da resposta para simular digitação real.
Próximos Passos
- Como Criar um Bot — adicione digitação a um bot completo
- Como Conectar ao Claude AI — indicadores de digitação enquanto aguarda respostas da IA
- Exemplos de Presença e Status — configurações de privacidade, mensagens temporárias e mais