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

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

Crie um bot para WhatsApp capaz de criar desculpas criativas para evitar sair de casa.

AF
5 min
0
0

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 enxergar as mensagens que chegam pra você através do terminal. Ao rodar node index.js você terá:

Email image
Email image

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.

Veja como vai ficar nosso index.js agora:

const { client } = require("./client");
const groupIdRemote = "120363194634031131@g.us";
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

Email image
Email image

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?
Email image

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,

Tamo junto