Executando verificação de segurança...
34

🥱💀 Como criar um BOT que inventa desculpas para não sair com os amigos

Ontem eu estava atoa em casa e pensei numa maneira de tornar o grupo que eu tenho com meus amigos um pouco mais divertido.

A ideia inicial era de que o BOT pudesse xingar alguns deles, fazer uma lista de membros inativos conforme um número determinado de dias e também fazer uma espécie de leaderboard de quem mais interage no grupo.

No final, eu tinha também uma função que gerava uma desculpa esfarrapada e exagerada pra não sair com eles que competia diretamente com as desculpas que alguns membros usavam pra não sair.

Vou mostrar agora como você pode fazer algo parecido em NodeJS

Preparando o ambiente

Antes de mais nada, é interessante que você crie uma pasta pro seu projeto e inicie um projeto com npm init -y

mkdir whatsapp-bot npm init -y

Estou assumindo que voce tenha o Node instalado no seu sistema, mas caso não tenha, entre nesse link aqui e instale a versão 20.

https://nodejs.org/en

Agora, precisamos instalar algumas bibliotecas que nosso bot vai usar

npm install whatsapp-web.js qrcode-terminal openai puppeteer

Como o WhatsApp não tem uma API que permita bots, nós vamos usar da seguinte artimanha: vamos 'emular' um navegador web no nosso terminal, mas não se preocupe que quem vai cuidar dos detalhes disso é a api whatsapp-web.js

A única coisa que teremos que fazer é gerar o qr-code, scannear pelo celular e pronto! Nosso BOT estará rodando no nosso perfil do WhatsApp.

Outra coisa, por estar rodando uma instância real do whatsapp web, não corremos o risco de ser banido e nem nada do tipo.

Não garanto nada, mas se até agora eu não fui banido, ta de boa.

Recebendo as primeiras mensagens

Vamos separar nosso código em alguns arquivos por questão de organização.

Crie um arquivo chamado client.js e coloque o seguinte código nele.

const qrcode = require("qrcode-terminal");
const { Client } = require("whatsapp-web.js");

const client = new Client();

client.on("qr", (qr) => {
  qrcode.generate(qr, { small: true });
});

client.initialize();
module.exports = { client };

Esse arquivo vai ser responsável por criar a instância do whatsapp web e o qr-code que será scanneado.

Agora em outro arquivo chamado index.js, coloque o seguinte código:

const { client } = require("./client");

client.on("ready", () => {
  console.log("Bot rodando!");
});

client.on("message", (message) => {
  console.log(message);
});

Com isso você já vai conseguir ser capaz de gerar um QR-CODE e ao abrir pelo celular, você já vai ser capaz de enxergar as mensagens que chegam pra você através do terminal.

A partir de agora, se você quiser que o bot responda apenas a certos grupos específicos, precisamos filtrar as mensagens e direcionar respostas apenas aquelas que possuem o campo from desejado.

Observe as mensagens e selecione o atributo from do grupo dos seus amigos e armazene numa variável, nesse caso eu chamei de groupIdRemote.

Quando os campos baterem, ele vai chamar uma função main passando o objeto message como parametro.

Veja como vai ficar nosso index.js agora:

const { client } = require("./client");

const groupIdRemote = "[email protected]";

client.on("ready", () => {
  console.log("Bot rodando!");
});

client.on("message", (message) => {
  if (message.from === groupIdRemote) main(message);
});

function main(message) {
  console.log("Mensagem Vinda do Grupo de Amigos");

  const { body } = message;

  switch (body) {
    case "/menu":
      sendMenu(message.from);
      break;
  }
}

const sendMenu = (messageFrom) => {
  const menu = `BOT Complementamente Malandro!\n
  Comandos disponíveis:\n
  /gpt [pergunta] -> Faz uma pergunta diretamente por chat GPT\n
  /cantada -> Gera uma cantada enfadonha\n
  /surpresa -> Diz uma curiosidade\n`;

  client.sendMessage(messageFrom, menu);
};

Não vou mostrar como implementar todos esses comandos, vou implementar o passo a passo do /gpt, que na minha opinião é o mais complicado deles e o resto você descobre por contra própria.

Então vamos lá.

Você vai precisar de $5 dólares.

Sério, para você acessar a api do ChatGPT você vai precisar gastar no mínimo $5 dólares.

Mas, relaxa que você vai ter mais tokens pro uso da api depois.

Clique nesse Link, faça login e depois vá para a parte de APIs: https://openai.com/blog/introducing-chatgpt-and-whisper-apis

Crie uma nova chave API aqui: https://platform.openai.com/api-keys

Você vai conseguir qual é o seu plano atual e seus limites de uso da API nesse link aqui: https://platform.openai.com/account/limits

Agora só precisamos conectar na api através dessa chave, no arquivo de index.js, adicione:

const { OpenAI } = require("openai");

// O correto é setar a api key nas variaveis do sistema, mas aqui é apenas um exemplo, então vai aqui mesmo
const openIA_apiKey = "sua-chave-api-aqui";

const openai = new OpenAI({
  apiKey: openIA_apiKey,
});

Assim como fizemos com config.js podemos criar um arquivo separado para fazer todo setup de configuração da api e exportar o módulo depois, mas não vou fazer isso aqui agora para que o post fique mais conciso.

E a função sendGPT vai ficar assim:

// Precisa ser async porque vamos receber uma promise
const sendGPT = async (messageFrom, prompt) => {
  console.log("Prompt: ", prompt);
  try {
    const completion = await openai.chat.completions.create({
      messages: [
        {
          role: "system",
          content:
            "Imagine que você é um personagem conhecido por seu sarcasmo e humor ácido em um mundo fictício. Responda às seguintes perguntas com seu característico toque de sarcasmo e inteligência afiada, sem ser ofensivo ou prejudicial.",
        },
        { role: "user", content: prompt },
      ],
      model: "gpt-3.5-turbo",
      max_tokens: 100,
    });

    if (completion && completion.choices && completion.choices.length > 0) {
      console.log("Chat GPT", completion.choices[0]);
      client.sendMessage(messageFrom, completion.choices[0].message.content);
    } else {
      console.log("Nenhuma resposta foi recebida da API");
    }
  } catch (error) {
    console.error("Erro ao chamar a API da OpenAI:", error);
  }
};

Veja passamos o contexto para o qual queremos que o chatGPT devolva as respostas.

Nesse caso, pedimos para que ele seja um personagem totalmente desgraçado e sarcástico.

No início eu disse que fiz o bot gerar uma desculpa esfarrapada e para fazer isso, basta apenas alterar o contexto:

"Você é um ser humano que adora dar desculpas mentirosas e esfarrapadas para não encontrar seus amigos, você é bem criativo e bem humorado nas histórias que inventa"

Passamos também na nossa request, o atributo max_tokens que é nada mais do que uma estimativa de resposta, assim limitamos o tamanho da resposta que será devolvida e economizamos tokens (dinheiro).

O arquivo final de index.js ficará assim:

const { client } = require("./client");
const { OpenAI } = require("openai");

// O correto é setar a api key nas variaveis do sistema, mas aqui é apenas um exemplo, então vai aqui mesmo
const openIA_apiKey = "sua-chave-api-aqui";

const openai = new OpenAI({
  apiKey: openIA_apiKey,
});

client.on("ready", () => {
  console.log("Bot rodando!");
});

client.on("message", (message) => {
  main(message);
});

function main(message) {
  console.log("message ", message);
  const { body } = message;

  if (body.startsWith("/gpt ")) {
    // Pega a partir do quinto caractere, que na teoria é o prompt
    sendGPT(message.from, body.substring(5));
    return;
  }
  switch (body) {
    case "/menu":
      sendMenu(message.from);
      break;
  }
}

const sendMenu = (messageFrom) => {
  const menu = `BOT Complementamente Malandro!\n
  Comandos disponíveis:\n
  /gpt [pergunta] -> Faz uma pergunta diretamente por chat GPT\n
  /cantada -> Gera uma cantada enfadonha\n
  /surpresa -> Diz uma curiosidade\n`;

  client.sendMessage(messageFrom, menu);
};

// Precisa ser async porque vamos receber uma promise
const sendGPT = async (messageFrom, prompt) => {
  console.log("Prompt: ", prompt);
  try {
    const completion = await openai.chat.completions.create({
      messages: [
        {
          role: "system",
          content:
            "Imagine que você é um personagem conhecido por seu sarcasmo e humor ácido em um mundo fictício. Responda às seguintes perguntas com seu característico toque de sarcasmo e inteligência afiada, sem ser ofensivo ou prejudicial.",
        },
        { role: "user", content: prompt },
      ],
      model: "gpt-3.5-turbo",
      max_tokens: 100,
    });

    if (completion && completion.choices && completion.choices.length > 0) {
      console.log("Chat GPT", completion.choices[0]);
      client.sendMessage(messageFrom, completion.choices[0].message.content);
    } else {
      console.log("Nenhuma resposta foi recebida da API");
    }
  } catch (error) {
    console.error("Erro ao chamar a API da OpenAI:", error);
  }
};

A função cantada e surpresa devem ser mais fáceis de implementar por conta própria, afinal até a mais dificil foi fácil.

Eu disse que era a mais difícil porque precisamos lidar com argumentos já que você precisa passar o prompt que o usuário vai digitar.

Peça pra alguém te mandar mensagem usando:

/gpt Vale a pena ter um copo stanley?

Esse texto foi apenas uma apresentação da biblioteca whatsapp-web.js e da api da openai.

Tem muita coisa que pode ser melhorada e muita função divertida que pode ser implementada.

Qualquer coisa, dá uma olhada na documentação aqui e veja quais recursos estão disponíveis:

https://docs.wwebjs.dev/index.html

https://wwebjs.dev/

Espero que tenham te agradado pelo menos um pouco,

PS: se você quiser ver imagens do bot rodando e outros artigos que escrevi, clique aqui: https://pingback.com/arthurfaria/como-criar-um-bot-para-whatsapp

Carregando publicação patrocinada...
2
2

Kkkkkk isso aqui ainda vai me substituir

Vou treinar o chat gpt pra responder mensagens como eu normalmente responderia e vou sumir do whatsapp

Obrigado pelo comentário!

2

Criar um no trabalho... quando ele indentificar que o seu $USER ainda esta logado depois do seu horario de ir embora para enviar uma mensagem para a mulher avisando que vai se atrasar...

2
1

Existe uma forma de "hospedar" para ficar rodando sempre, sem ter que dar node index?
Queria saber também se ao invés de colocar um menu estático é possível fazer aquelas mensagens do whatsapp que contém botões interativos?

2

Sim, sim. É possível deixar o bot online 24 horas.

Se for usando exatamente esse código que eu mostrei, você pode alugar algum VPS com Linux instalado e configurar praticamente como eu mostrei. Deve funcionar com pouca ou quase nenhuma modificação. Sobre VPS, olha na digital ocean.

A parte chata é se caso a autenticação expirar ou o bot der algum problema, você precisar fazer a parte de scannear o qr code denovo.

Sobre os botões interativos eu acredito que não. Aqueles bots são feitos usando a api oficial do whatsapp, portanto eles se comportam e acessam recursos diferentes do usuário normal, também são limitados de certa forma. Por exemplo, um bot feito usando a api oficial não consegue iniciar uma conversa com ninguém, apenas responder.

No nosso caso, o bot consegue fazer o que um usuário acessando o whatsapp web consegue fazer.

Se for realmente colocar o bot online e quiser algum 'auxilio' de um dev inexperiente, pode me chamar no linkedin.