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

Guia completo de como integrar o ChatGPT com Whatsapp 🤖

Imagem gerada com a IA do Midjourney
Imagem gerada no Midjourney

Este guia irá explicar como integrar o modelo de linguagem GPT-3 com o WhatsApp. A integração permitirá que usuários interajam com o GPT-3 através de mensagens de texto no WhatsApp, fornecendo respostas automatizadas baseadas em suas perguntas e comandos. O guia discutirá os passos necessários desde a configuração até a integração. Vamos usar o Node.js com Javascript para criar o projeto e a biblioteca venom-bot para a integração com o Whatsapp.

Chat GPT Logo

Vantagens de integrar o modelo GPT-3 com Whatsapp

  1. Conforto de utilizar a IA no Whatsapp
  2. Qualquer pessoa pode mandar os comandos para a IA no privado ou em grupos que o contato que esteja rodando este serviço estiver.
  3. O filtro para perguntas politicamente incorretas está desligado ao comunicar diretamente com a API. Seria isso uma vantagem? 👀

Teste do filtro feito no próprio site do Chat GPT:
Chat GPT Teste Filtro

Teste do filtro feito no Whatsapp utilizando a API:
Chat GPT Teste Filtro Whatsapp

1. Criando o projeto

O Node.js é uma plataforma de desenvolvimento baseada em Javascript que permite criar aplicações como APIs e serviços. Ele foi baseado no interpretador V8 do Google permitindo assim rodar diretamente no servidor sem necessidade de um navegador para sua execução. Diferente do uso tradicional do Javascript, que é restrito ao client-side, o Node.js permite aproveitar as vantagens do Javascript no desenvolvimento de aplicações no server-side.

Javascript Power

Passo 1.1: Instalando o Node.js e o npm

A primeira coisa que você precisa fazer é instalar o Node.js em seu computador. Você pode baixar o instalador no site oficial do Node.js (https://nodejs.org/en/download/) e seguir as instruções de instalação. Uma vez que você instalou o Node.js, você também terá o npm instalado automaticamente, o npm é o gerenciador de pacotes do Node.js ele permite instalar e gerenciar bibliotecas e dependências. Para verificar se você tem o Node.js e o npm instalados corretamente, abra o prompt de comando e digite “node -v” e “npm -v” para ver as versões instaladas.

Passo 1.2: Criando um novo projeto

Depois de ter o Node.js e o npm instalados, você pode criar um novo projeto Node.js. Abra o prompt de comando e navegue até a pasta onde você deseja criar o projeto, digite “npm init” para iniciar o processo de criação, isso criará um arquivo package.json que contém as informações do projeto, incluindo nome, versão, dependências e scripts. Ele é usado pelo npm para gerenciar as dependências do projeto.

# Primeiro crie a sua pasta com o nome do projeto
mkdir zap-gpt

# Entre na pasta criada 
cd zap-gpt

# Crie o arquivo package.json com o comando
npm init

Agora vamos adicionar em nosso package.json o “type” como “module”, assim a gente vai poder usar a syntax de import do ES6 Modules.

{
  "name": "zap-gpt",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

2. Instalando e configurando o venom-bot

Venom é uma dependência desenvolvida com JavaScript para criar serviços para WhatsApp como atendimento ao cliente automatizado, envio de mídia, reconhecimento de frases baseado em inteligência artificial e todos os tipos de arquitetura de design para WhatsApp.

Venom Bot Image

Passo 2.1: Instalação

Agora que voce já tem o arquivo package.json, já pode instalar as dependências do seu projeto. Você vai instalá-lo digitando “npm install venom-bot” no prompt de comando.

# Instale venom-bot como uma dependencia do seu projeto
npm install venom-bot

Passo 2.2: Configuração

Não vou me atentar na estruturação das pastas neste guia, então vamos apenas criar um arquivo index.js dentro na raiz do projeto.

Estrutura de pastas index.js

No nosso arquivo index iremos criar uma nova sessão e chamar nossa função start() após a conexão ser feita com sucesso. Para que a gente possa observar qualquer evento disparado de mensagem no nosso whatsapp iremos chamar a função onAnyMessage do client para que ele observe todas as mensagens enviadas incluindo as nossas, e passaremos como parametro uma function como callback para que seja executada sempre que uma nova mensagem for enviada, validaremos então o conteúdo da mensagem, se o conteúdo for “hello” iremos enviar uma mensagem de volta “🤖 world 🌎”.

import { create } from 'venom-bot'

create({
    session: 'chat-gpt',
    multidevice: true
})
    .then((client) => start(client))
    .catch((erro) => {
        console.log(erro)
    })

async function start(client) {
    const botText = "🤖 world 🌎"
    // Da um console.log em message depois, tem muita coisa bacana
    client.onAnyMessage((message) => {
        if (message.body.toLowerCase() === "hello") {
            // message.from é o número do usuário que enviou a msg "hello"
            client.sendText(message.from, botText)
        }
    })
}

Passo 2.3: Testando a implementação

Execute o projeto com o comando “node .” em seu terminal, assim ele irá executar o arquivo nomeado como index no diretorio onde o comando foi executado. Após aguardar alguns instantes será gerado um QR Code que deve ser lido pelo aplicativo do Whatsapp. Em seu aplicativo toque em “Mais opções” ou “Configurações”, selecione “Aparelhos conectados” e depois selecione a opção “Conectar um aparelho” para ler o QR Code gerado.

Inicialização do projeto

Após ler o QR Code irá aparecer no terminal o status “✓ [instance: Chat-GPT]: Connected” indicando que a conexão foi bem sucedida e irá criar uma pasta no seu projeto chamada tokens, esta pasta guarda a sessão da conexão, dessa forma voce não precisará ler o QR Code toda vez que inicializar o projeto.

Estrutura das pastas após instalação do venom

Vamos agora testar nosso humilde script e ver se deu tudo certinho com nossa integração com o Venom!

Teste do venom

3. Instalando e configurando o “Chat GPT”

Nada melhor do que o nosso queridíssimo Chat GPT para nos explicar o significado de “GPT”.

GPT é uma sigla para “Generative Pre-trained Transformer”, é um modelo de linguagem treinado pela OpenAI. Ele é capaz de gerar texto de forma autônoma, com base em um grande conjunto de dados de texto pré-treinado. Ele pode ser usado para tarefas como preenchimento automático, geração de texto, tradução automática, entre outras. Ele é uma das tecnologias de IA de linguagem mais avançadas disponíveis atualmente e é utilizado em uma variedade de aplicações, incluindo chatbots, assistentes virtuais e sistemas de geração automática de conteúdo.

Chat GPT Logo

Passo 3.1: Pegar a API Key e Organization ID na OpenAI

A primeira coisa que precisamos aqui é da api key da openai, uma chave para autorização de envio das nossas requisições. Entre neste link para pegar sua chave https://beta.openai.com/account/api-keys, é bem auto explicativo.

API Key na open api

Para pegar o organization ID também é bem fácil, é só acessar este link e copiar o seu ID https://beta.openai.com/account/org-settings

Organization ID

Passo 3.2: Instalação

Agora da mesma forma que fizemos com o venom faremos com a dependência da openai, instale-a utilizando o comando “npm install openai” em seu terminal na raiz do projeto.

# Instale openai como uma dependencia do seu projeto
npm install openai

Para evitarmos futuros problemas como o vazamento da nossa api key e organization id vamos instalar também uma depencia chamada dotenv, que serve para criarmos variáveis de ambiente separadas do código.

# Instale dotenv como uma dependencia do seu projeto
npm install dotenv

Passo 3.3: Configuração

Vamos começar configurando nossas variáveis de ambiente com o dotenv. Na raiz do seu projeto crie um arquivo chamado “.env” nele colocaremos quaisquer dados sensíveis que precisaremos utilizar em nosso projeto.

Estrutura das pastas .env

Dentro do arquivo iremos criar uma variável chamada OPENAI_KEY e colocaremos nossa api key aqui.

OPENAI_KEY=SUA-API-KEY
ORGANIZATION_ID=SEU-ORGANIZATION-ID
PHONE_NUMBER=SEU-NUMERO exemplo -> [email protected]

Em nosso arquivo index.js vamos carregar nossas variáveis para podermos utiliza-las e instanciar a configuração da openai.

import { create } from 'venom-bot'
import * as dotenv from 'dotenv'
import { Configuration, OpenAIApi } from "openai"

dotenv.config()

/* Agora podemos chamar nossas variáveis de ambiente
 * process.env.OPENAI_KEY
 * process.env.ORGANIZATION_ID
 * process.env.PHONE_NUMBER
 */ 
const configuration = new Configuration({
    organization: process.env.ORGANIZATION_ID,
    apiKey: process.env.OPENAI_KEY,
});

Após isso iremos criar 3 funções, a primeira getDavinciResponse() será para fazer chamadas para o davinci-003 que irá gerar as respostas em texto:

const getDavinciResponse = async (clientText) => {
    const options = {
        model: "text-davinci-003", // Modelo GPT a ser usado
        prompt: clientText, // Texto enviado pelo usuário
        temperature: 1, // Nível de variação das respostas geradas, 1 é o máximo
        max_tokens: 4000 // Quantidade de tokens (palavras) a serem retornadas pelo bot, 4000 é o máximo
    }

    try {
        const response = await openai.createCompletion(options)
        let botResponse = ""
        response.data.choices.forEach(({ text }) => {
            botResponse += text
        })
        return `Chat GPT 🤖\n\n ${botResponse.trim()}`
    } catch (e) {
        return `❌ OpenAI Response Error: ${e.response.data.error.message}`
    }
}

A segunda função será para a DALL-E getDalleResponse() que irá gerar nossas imagens:

const getDalleResponse = async (clientText) => {
    const options = {
        prompt: clientText, // Descrição da imagem
        n: 1, // Número de imagens a serem geradas
        size: "1024x1024", // Tamanho da imagem
    }

    try {
        const response = await openai.createImage(options);
        return response.data.data[0].url
    } catch (e) {
        return `❌ OpenAI Response Error: ${e.response.data.error.message}`
    }
}

A tarceira e ultima commands(), será para mapear os comandos que chegam como input do usuário:

const commands = (client, message) => {
    const iaCommands = {
        davinci3: "/bot",
        dalle: "/img"
    }

    let firstWord = message.text.substring(0, message.text.indexOf(" "));

    switch (firstWord) {
        case iaCommands.davinci3:
            const question = message.text.substring(message.text.indexOf(" "));
            getDavinciResponse(question).then((response) => {
                /*
                 * Faremos uma validação no message.from
                 * para caso a gente envie um comando
                 * a response não seja enviada para
                 * nosso próprio número e sim para 
                 * a pessoa ou grupo para o qual eu enviei
                 */
                client.sendText(message.from === process.env.BOT_NUMBER ? message.to : message.from, response)
            })
            break;

        case iaCommands.dalle:
            const imgDescription = message.text.substring(message.text.indexOf(" "));
            getDalleResponse(imgDescription, message).then((imgUrl) => {
                client.sendImage(
                    message.from === process.env.PHONE_NUMBER ? message.to : message.from,
                    imgUrl,
                    imgDescription,
                    'Imagem gerada pela IA DALL-E 🤖'
                )
            })
            break;
    }
}

Por fim iremos listar dentro do nosso callback do evento onAnyMessage() a função commands(). O nosso index.js ficará exatamente como mostrado abaixo!

import { create } from 'venom-bot'
import * as dotenv from 'dotenv'
import { Configuration, OpenAIApi } from "openai"

dotenv.config()

create({
    session: 'Chat-GPT',
    multidevice: true
})
    .then((client) => start(client))
    .catch((erro) => {
        console.log(erro);
    });

const configuration = new Configuration({
    organization: process.env.ORGANIZATION_ID,
    apiKey: process.env.OPENAI_KEY,
});

const openai = new OpenAIApi(configuration);

const getDavinciResponse = async (clientText) => {
    const options = {
        model: "text-davinci-003", // Modelo GPT a ser usado
        prompt: clientText, // Texto enviado pelo usuário
        temperature: 1, // Nível de variação das respostas geradas, 1 é o máximo
        max_tokens: 4000 // Quantidade de tokens (palavras) a serem retornadas pelo bot, 4000 é o máximo
    }

    try {
        const response = await openai.createCompletion(options)
        let botResponse = ""
        response.data.choices.forEach(({ text }) => {
            botResponse += text
        })
        return `Chat GPT 🤖\n\n ${botResponse.trim()}`
    } catch (e) {
        return `❌ OpenAI Response Error: ${e.response.data.error.message}`
    }
}

const getDalleResponse = async (clientText) => {
    const options = {
        prompt: clientText, // Descrição da imagem
        n: 1, // Número de imagens a serem geradas
        size: "1024x1024", // Tamanho da imagem
    }

    try {
        const response = await openai.createImage(options);
        return response.data.data[0].url
    } catch (e) {
        return `❌ OpenAI Response Error: ${e.response.data.error.message}`
    }
}

const commands = (client, message) => {
    const iaCommands = {
        davinci3: "/bot",
        dalle: "/img"
    }

    let firstWord = message.text.substring(0, message.text.indexOf(" "));

    switch (firstWord) {
        case iaCommands.davinci3:
            const question = message.text.substring(message.text.indexOf(" "));
            getDavinciResponse(question).then((response) => {
                /*
                 * Faremos uma validação no message.from
                 * para caso a gente envie um comando
                 * a response não seja enviada para
                 * nosso próprio número e sim para 
                 * a pessoa ou grupo para o qual eu enviei
                 */
                client.sendText(message.from === process.env.BOT_NUMBER ? message.to : message.from, response)
            })
            break;

        case iaCommands.dalle:
            const imgDescription = message.text.substring(message.text.indexOf(" "));
            getDalleResponse(imgDescription, message).then((imgUrl) => {
                client.sendImage(
                    message.from === process.env.PHONE_NUMBER ? message.to : message.from,
                    imgUrl,
                    imgDescription,
                    'Imagem gerada pela IA DALL-E 🤖'
                )
            })
            break;
    }
}

async function start(client) {
    client.onAnyMessage((message) => commands(client, message));
}

Passo 3.4: Hora de testar!

Teste da implementação

4. Considerações finais

Se te ajudei de alguma forma já curte esse guia para que ele chegue em mais pessoas e as ajude também!

4.1 Dicas

Voce pode subir esse serviço em uma máquina EC2 da AWS Amazon para que ele fique 24/7 ( rodando 24h por dia ) gratuitamente por 1 ano! Assim voce não precisa pagar mais caro na sua conta de luz com seu PC Gamer com RPG ligado a semana toda!

Caso seja do seu interesse se inscreve lá no meu canal, não tem nada ainda mas em breve vou soltar vídeos explicando passo a passo de como fazer essa instalação do projeto em um servidor da EC2, e também criarei outros conteúdos legais como desse post!

Canal Dev Cansado

4.2 Ta com preguiça e quer um plug and play?

Sei que eu deveria colocar isso no início pra evitar da galera descobrir só depois de ler tudo mas você também deveria ler mais 👍

Vai lá no repositório pra da fork e estrela ⭐: https://github.com/victorharry/zap-gpt

4.3 Sugestões

Caso tenha uma ideia de como otimizar o código e deixar ele mais legível pode deixar aqui comentado ou abre um MR lá no repo que a gente atualiza pra ficar bacana pra todo mundo e pra gente trocar conhecimento também, sempre bom!

Valeu polvo 🐙

Quem quiser conectar no Linkedin

Comemorações

Deixei a fonte com o link do Medium pois postei lá antes

6
3

Muito obrigado. Sou um newbie e consegui fazer funcionar no Ventura. Tô apanhando com no Zorin, mas é alguma coisa relacionada com o puppeter... ENFIM, uma hora vai!!! A quantidade de coisa que aprendi fazendo essa instalação é maravilhosa. PARABÉNS E OBRIGADO por compartilhar....

2

Muito massa, estou testando aqui.

Há um typo no process.env.BOT_NUMBER, né? No seu env tem PHONE_NUMBER...

1
2

Antes de mais nada, parabéns mesmo pelo nível de documentação aqui e pelo projeto em si! Animal!
Fiz essa integração pra Alexa também :)
https://www.tabnews.com.br/xambitow/fiz-uma-skill-da-alexa-pro-irmao-mais-velho-do-chatgpt

Aí entra uma pequena consideração: Na verdade o ChatGPT ainda não tem uma API, ela vai ser liberada pra algumas pessoas em uma fila de espera em breve em beta: https://share.hsforms.com/1u4goaXwDRKC9-x9IvKno0A4sk30

Twitte falando sobre isso: https://twitter.com/openai/status/1615160228366147585

O modelo que tanto eu quanto vc usamos em nosso projeto é o Davinci GPT-3, um modelo bem mais cru, que somado ao InstructGPT, mais outras camadas, e diversos aprimoramentos, formam o ChatGPT, mas não é ele.

ChatGPT is a sibling model to InstructGPT, which is trained to follow an instruction in a prompt and provide a detailed response.
Fonte: https://openai.com/blog/chatgpt/

https://beta.openai.com/docs/models
https://openai.com/blog/instruction-following/

Mas isso não muda o fato que o irmão mais velho do ChatGPT é uma experiência similar incrível e que a integração ficou super detalhada e bem documentada!

2

Xambitow valeu demais por mandar essas informações aqui, de fato algo muito bacana para se ter em mente e ficarmos mais empolgados ainda quando sair a API oficial do Chat GPT!

Alias, top demaisss seu projeto integrando com a Alexa!

2

❌ OpenAI Response Error: You exceeded your current quota, please check your plan and billing details.

Alguém sabe como resolve? Tô vendo aqui no uso da conta e diz que não usei nada

1
1

A razao disso sao as configs do bot que esta com tudo no maximo.
Vai buscando a melhor para vc...

const getDavinciResponse = async (clientText) => {
const options = {
model: "text-davinci-003", // Modelo GPT a ser usado
prompt: clientText, // Texto enviado pelo usuário
temperature: 0.5,
max_tokens: 100,
}

1
1
1
2
1
2

Muito obrigada, o guia está bem completo funciou perfeitamente!!

Esperemos agora o GPT-4, quando sair vai ser necessário mudar ou até mesmo acrescentar lá no commands()

2
2

Fiz aqui pra testar, no começo tava vindo um erro de Billing, cadastrei um cartão no site da OpenAI e funcionou perfeitamente!

Considerando a taxa na geração das imagens, talvez seria interessante um ambiente utilizando Stable Diffusion num servidor local ou hospedado.

Muito legal o funcionamento, tinha interesse em testar o venom-bot, mas nunca tinha ido atrás, seu post foi um bom pontapé kkkkk, parabéns pelo guia!

1

Então, no meu caso não precisei... Tenta criar uma conta nova e gerar uma key. Sei que a API tem um limite de 18 dólares gratuitos, depois disso em teoria eu teria que cadastrar um cartão para poder continuar a usar. As requisições gastam bemmm pouquinho, talvez de até pra criar contas usando tempmail e ter mais 18 dol grátis.

2
1
1

cara eu sou um newbie do newbie nisso tudo e fui tentar fazer seguindo o passo a passo, mas nao importa o que eu mude no codigo o bot simplesmente nao responde, no final no desespero eu só copei e colei o index.js do jeito que vc deixou e coloquei meu numero no formato "550011112222" sem o + e sem o 9 adicional com o a key e a org id certinhas, MAS MESMO ASSIM NAO FUNFA!! to mt frustrado de ver todo mundo conseguindo um trem facil desses menos eu...

edit: fui tentar rodar de novo e agora ta dando isso kkkkk

C:\Users\leand\zap-gpt>node .
file:///C:/Users/leand/zap-gpt/index.js:3
import { Configuration, OpenAIApi } from "openai"
^^^^^^^^^^^^^
SyntaxError: The requested module 'openai' does not provide an export named 'Configuration'
at ModuleJob._instantiate (node:internal/modules/esm/module_job:124:21)
at async ModuleJob.run (node:internal/modules/esm/module_job:190:5)

Node.js v18.18.2

1
1
1
1
1
1

sensacional!!!
atualmente to trabalhando em uma plataforma usando o Baileys pra integrar com o whatsapp, não conhecia o venon, alguém saberia dizer se o venon tem alguma vantagem sobre o baileys?

1
1

Primeiramente parabens pelo belo trabalho, Sensacional !

Estou usando a alguns dias e esta funcionando beleza.

No momento estou "sofrendo" tentando migrar para a versao GPT3.5-Turbo .. mas nao estou conseguindo. Tentei varias sugestoes que obtive na web mas nada para em pé. Creio que devido ao fato de usar bibliotecas com whatsapp, axion, etc, pois os exemplos que obtive são codigos em terminal de Node.js e Phyton.

Sera que voce poderia me dar alguma dica de que caminho seguir ?

Agradeço antecipadamente... Como exemplo copiei o codigo do index.js abaixo que no momento estou tentando fazer funcionar mas sem sucesso...


// Using GPT-3.5-Turbo
const { Configuration, OpenAIApi } = require('openai');
const API_KEY = process.env.OPENAI_KEY;
const configuration = new Configuration({ apiKey: API_KEY });
const openai = new OpenAIApi(configuration);
const model = 'gpt-3.5-turbo-0301';
const temp = 0.5;
const tokens = 1024;

const { Client, MessageMedia, LocalAuth } = require('whatsapp-web.js')
const qrcode = require('qrcode-terminal')
const axios = require('axios')
require('dotenv').config()

const client = new Client({
authStrategy: new LocalAuth()
})

let conversationHistory = [];

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

client.on('authenticated', (session) => console.log(Autenticado))

client.on('ready', () => console.log('O zap-gpt está pronto 😋 Não esquece da estrelinha no repo ⭐ by: Victor Harry 🧙‍'))

client.on('message_create', message => {
if (conversationHistory.length >= 3) {
conversationHistory.shift();
}
conversationHistory.push({from: 'user', text: message.body});
commands(message);
})

client.initialize();

const headers = {
'Authorization': Bearer ${API_KEY},
'Content-Type': 'application/json'
}

const axiosInstance = axios.create({
baseURL: 'https://api.openai.com/',
timeout: 120000,
headers: headers
});

const TurboGPT = async (prompt) => {
try {
const completion = await openai.createChatCompletion({
model: model,
messages: [
{ role: 'system', content: 'You are omnipotent and always compassionate' },
{ role: 'assistant', content: 'How else may I help' },
{ role: 'user', content: prompt },
],
temperature: temp,
max_tokens: tokens,
top_p: 1,
frequency_penalty: 0,
presence_penalty: 0,
n: 1,
stop: '',
});

    const botAnswer = completion.data.choices[0].message.content;
    return `Bestfriend 🤖 ${botAnswer}`
} catch (e) {
    return `❌ OpenAI Response Error`
}

}

const getDalleResponse = async (clientText) => {
const body = {
prompt: clientText, // Descrição da imagem
n: 1, // Número de imagens a serem geradas
size: "256x256", // Tamanho da imagem
}

try {
    const { data } = await axiosInstance.post('v1/images/generations', body)
    return data.data[0].url
} catch (e) {
    return `❌ OpenAI Response Error`
}

}

const commands = async (message) => {
const iaCommands = {
davinci3: "/teste"
}

let firstWord = message.body.substring(0, message.body.indexOf(" "))
const sender = message.from.includes(process.env.PHONE_NUMBER) ? message.to : message.from
switch (firstWord) {
    case iaCommands.davinci3:
        const question = message.body.substring(message.body.indexOf(" "));
        TurboGPT(question).then(async (response) => {
            const contact = await message.getContact()
            client.sendMessage(sender, `${response}\n\n_Generated by @${contact.id.user}_`, { mentions: [contact] })
            if (conversationHistory.length >= 3) {
                conversationHistory.shift();
            }
            conversationHistory.push({from: 'bot', text: response});
        })
        break
}

}

1

Cara, muito bom MESMO este post! Ficou show, parabéns!
Não era exatamente o que queria, estava procurando alternativas à API do WhatsApp, mas o post me deu uma ótima ideia para outro projeto.

"fui em busca de cobre e encontrei ouro" 😂😂

1

Bom dia ! Ótimo tutorial! Parabéns.
O meu não saiu dessa parte:

info: [Chat-GPT] Waiting... checking the browser...
info: [Chat-GPT] Browser successfully opened
info: [Chat-GPT] checking headless...
info: [Chat-GPT] headless option is active, browser hidden
info: [Chat-GPT] Checking page...
info: [Chat-GPT] Page successfully accessed
_ [instance: Chat-GPT]: Checking is logged...

O que pode ser que não ta fazendo logar?

1

Eu segui as instruções, consegui obter resposta no venom (Hello > World), mas quando eu copio o código do index.js da versão final, ainda que eu faça o comando correto (/bot ou /img), o programa não retorna qualquer mensagem. Alguém poderia me ajudar?

1
1
1
1
1

Victor! O código ficou ótimo!
Seria possível você nos ajudar a adaptá-lo para o modelo "gpt-3.5-turbo"?

Muito obrigada!
Abraços!

1
1

Massa!!! Eu testei aqui e está funcionando massa demais.. Mas gostaria de saber como faço para enviar a mensagem no grupo ou com o contato que estou falando no momento envio o comando para ele? Quando estou falando com um contato e /bot .... ele envia a mensagem no meu privado. O que fazer?

1

Muito massa! Mas poxa, o meu aqui não ta funfando nem o Hello kkkk Tentei de tudo aqui, mas sou apenas um iniciante no mundo do javascript. Eu consigo conectar o whatsapp, mas quando mando o "hello" não obtenho a resposta. O que poderia ser?

2
1
1

Caracas mano... nunca mexi com programação na vida e segui os passos e deu certo. Teve uma hora que travei e aí perguntei pro CHATGPT como resolver e ele me guiou kkk Ele mesmo me ensinou copiar e colar seus scripts kkk Obrigado mesmo.

OBS: existe alguma forma pra treinar ele? Ou seja, queria com o tempo deixá-lo como bot pra tirar dúvidas da minha empresa. Mas na forma que ele está ele responde tudo. Nesse caso, o certo seria eu procurar um outro bot? Se for... tem como me indicar qual? E se usar o venom fica melhor ainda, pois já me adaptei. Muito obrigado.

1

caralho que foda,
será que alguem sabe um venom-bot ou similar que para python ou java.
Queria fazer um projeto igual o seu só que usando alguma outra linguagem...

1

Parabens pelo conteudo, muito bom!!

Para quem quiser hospeadar em alguma cloud e deixar sempre Online, recomendo a OracleCloud, existem shapes gratuitos para sempre, inclusive usei para subir um serviço SystemD desse projeto e está rodando legal :D

1
1

Aqui eu ainda não consegui fazer funcionar galera. Já verifiquei as variáveis de ambiente e já tentei o número de telefone com 9 e sem 9 a mais: 5588996883328 e 558896883328, mas quando mando uma mensagem pra mim mesmo não tenho resposta

1

Vou soltar um videozim jaja e vou explicar como voce pode debugar isso :)

Mas ja adiantando, brinca com o console.log lendo as mensagens que chegam pra ver como fica seu numero

1
1

Muito bom. Muito obrigado!
Fiquei com 1 dúvida: NO meu caso, eu tirei o IF no OnAnyMessage, mas o código ali dentro ficou rodando sem para mesmo quando não havia troca de mensagem, ficava enviando o texto sem parar.

Tu saberia explicar o pq?

1

Muito maneiro!!! Como faço pra usar em grupos? Porque tipo, eu faço a pergunta num grupo mas ele tá respondendo pro meu número individual 🥲

1
1

Eu coloquei meu número certinho! Ele tá rodando legal. Mas quando eu faço uma pergunta num grupo ou numa conversa com alguém, ele tá respondedo numa conversa particular comigo mesma 🤔

1

Parabens cara, muito bom!!

Cara, fiz uma pequena alteração no codigo tirando a necessidade do comendo "/bot" antes das mensagens, fiz alguns testes e ficou bom, porem agora estou recebendo um erro de limite de requisições atingidas por minuto. E mesmo tentando novamente um tempo depois de uma pausa, ainda não consigo.

Alguem consegue falar um pouco disso, ou me mandar um link onde posso ler mais...

1

@Ednan Martins, você consegue compartilhar essa melhoria do comando "/bot"?
Eu tentei implementar aqui, mas não consegui chegar numa lógica legal.

Também tomei erro de limite de requisições logo na primeira mensagem.

0

Nossa cara, vi o que era. Ele tava respondendo o proprio numero, depois vou ver como tratar isso.
Acho que ele ainda mandou umas 300k de mensagem para ele mesmo em apenas 20min que deixei ativo. Espero que o whats não bloqueie meu numero 🥹🥹

1
1

Bacana, testei e funcionou muito bem, como posso fazer ela funcionar em apenas um grupo ? Agora qualquer pessoa que mandar um /bot pra mim vai começar a escrever hahahha

1
1
1
1
1

Tu fez exatamente como o cara falou ou precisou mudar algo? Pergunto pq o meu aparentemente não ta lendo as mensagens que chegam. Consigo logar o whats, mas não passa disso.

1
1

Funcionando perfeitamente no windows, subi pra máquina AWS rodando Ubunto, retornando esse erro: ❌ OpenAI Response Error: Incorrect API key provided: undefined. You can find your API key at https://beta.openai.com.

A chave de API está certa...

1
1
1

show de bola, mas e em relação ao Whatapp Banir a conta ? não tem problemas ?
eles não permitem "automações" se é que posso chamar o bot assim

1

estou com esse erro no meu código se puder me ajudar, eu fui iniciar com node index.js e deu esse erro

Error [ERR_REQUIRE_ESM]: require() of ES Module C:\Users\Myssingh\Documents\zap-gpt\node_modules\latest-version\index.js from C:\Users\Myssingh\Documents\zap-gpt\node_modules\venom-bot\dist\controllers\welcome.js not supported.
Instead change the require of index.js in C:\Users\Myssingh\Documents\zap-gpt\node_modules\venom-bot\dist\controllers\welcome.js to a dynamic import() which is available in all CommonJS modules.
at Object. (C:\Users\Myssingh\Documents\zap-gpt\node_modules\venom-bot\dist\controllers\welcome.js:9:26)
at Object. (C:\Users\Myssingh\Documents\zap-gpt\node_modules\venom-bot\dist\controllers\initializer.js:67:19)
at Object. (C:\Users\Myssingh\Documents\zap-gpt\node_modules\venom-bot\dist\index.js:85:21) {
code: 'ERR_REQUIRE_ESM'
}

1

Da uma olhada se isso aqui resolve pra voce Myssingh -> Fix Module
Veja também se voce está usando pelo menos a versão lts do node ou até mesmo qualquer versão acima da 15.3.0

1

Bom isso não chegou a funcionar, mas reinstalei o venom e o apenai e funcionou acho que foi uma somatoria de tudo que fez funcionar reinstalei uma 3 vezes rsrsr

1

Estou fazendo exatamente da maneira a qual esta sendo dita mas quando rodo o codigo para aparecer o QR CODE consta essa mensagem.

SyntaxError: Cannot use import statement outside a module
at internalCompileFunction (node:internal/vm:74:18)
at wrapSafe (node:internal/modules/cjs/loader:1141:20)
at Module._compile (node:internal/modules/cjs/loader:1182:27)
at Module._extensions..js (node:internal/modules/cjs/loader:1272:10)
at Module.load (node:internal/modules/cjs/loader:1081:32)
at Module._load (node:internal/modules/cjs/loader:922:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47

Node.js v18.13.0

2

Fix "type": "module"

Tentei replicar o erro e vi o problema, você esqueceu de colocar o "type" como "module" no package.json. Logo em cima desse erro ele aponta pra um import dando a entender que ele não consegue usar essa syntax.

Erro:

error type

Solução 1:

solução type

Solução 2:

Mude a extensão do arquivo index.js para index.mjs

2
1
2

É sim, essas bibliotecas funcionam como se fossem crawlers do Whatsapp Web. A lib do Venom ja é bem famosa e tem uma empresa por tras dela, então é sim confiável! Uso a anos já, tem empresas que usam ela como Core do produto deles ao invés da API oficial do Whatsapp

1
1

Seria legal implementar um timeout, galera aqui nos grupos deram uma empolgada e tão spammando comando pro bot kk Mas top demais o guia cara, parabéns!

1

Eu fiz a seguinte alteração para tentar limitar. Como sou novato, pode ter coisa errada aí que não estou conseguindo identificar.

const messageInterval = 2000;
const lastMessages = {};

async function start(client) {
client.onAnyMessage((message) => {
if (message.from in lastMessages) {
const currentTime = new Date().getTime();
const lastMessageTime = lastMessages[message.from];
if (currentTime - lastMessageTime < messageInterval) {
console.log("Mensagem ignorada por flood")
return;
}
}
lastMessages[message.from] = new Date().getTime();
commands(client, message);
});
}

1

Antes de encontrar este artigo eu já tinha feito, e não usei a Lib Venonbot e sim a wppconnect
Meu desafio agora é treinar ela, para que atue como uma personalidade que eu mesmo criei para ela
Estou buscando artigos para me ajudarem nisso, quero que a IA fique o mais próximo possivel da personalidade que desejo para que eu possa integra-la em minha IA, Mia que lucro em média 3k com ela.
Alguma sugestão?

2 coisas

treinar ela para ser exatamente oque eu quero

todo o tipo de conversa ela guardar em uma sessão para sempre saber oque ela havia conversado antes

1
1
1

como eu faço para receber uma imagem junto da mensagem? Gostaria de implementar uma funcionalidade de enviar sticker também mas não consigo manipular arquivos.

1

Ante de gerar a imagem precisa entrar com "/img"

Lá no teu whatsapp escreva
/img desenhe um avatar

mesmo serve pra ele responder texto, tem que entrar com "/bot"
/bot Descreva uma arvore

1
1
1
1
1
1

Muito bom, vai ser útil... mas só um detalhe, a API do chatGPT não está disponível, ele utiliza a versão 3.5, que é versão adaptada da 3.0. A API da OpenAI consegue usar só até a 3.0.

1
1
1

Ele já funciona em grupos, caso os membros mandem mensagem. O que faz gerar erro para você é o nome da variável que salvou no .env que está trocada no código.
Basta substituir o "process.env.BOT_NUMBER" por "process.env.PHONE_NUMBER" (caso no arquivo .env esteja desta forma).
Além do mais no .env onde você declara o seu numero tem que ter no final dele o "@c.us"

1
1
1

Parabéns pela matéria, tenho uma dúvida, quando vc testa escrevendo hello foi a ia que respondeu world? pergunto pq nao digitou com o comando "/" e nas outras precisou colocar a barra, é possível deixar o whatsapp exclusivamente só para a ia responder e alguem mandar mensagem sem a "/" pra ia responder?

1

Então, a questão do Hello não tinhamos implementado ainda a IA, a resposta foi nós que definimos bem aqui const botText = "🤖 world 🌎". Sobre deixar o bot aberto sem precisar de comandos é possível sim, mas recomendo que deixe ele fora de grupos e responda apenas no privado já que bateria o limite da sua conta facilmente e acabaria sendo chato já que ele iria responder a qualquer coisa. Modifique o Event Listener de mensagem, é só fazer o seguinte:

async function start(client) {
    client.onAnyMessage((message) => { 
        if(message.isGroupMsg === false) {
            getDavinciResponse(message.body).then((response) => {
                client.sendText(message.from === process.env.BOT_NUMBER ? message.to : message.from, response)
            })
        }
    });
}

Não testei o código então não tenho certeza se está redondinho, mas a lógica é essa. Aí é só voce deletar a função commands() já que não irá utiliza-la mais.

1
1
1
1

Tenho uma dúvida. Ainda não criei o bot, mas vendo o manual e lendo os comentários não ficou claro para mim: para o bot funcionar ele usa o número pessoal da pessoa que contém o whats (no meu caso, usaria meu número) correto? Como eu desvinculo meu número do bot, é possível? Ou para realizar isso, eu preciso de um novo número (novo chip) e então usar esse número para configurar o bot?

2

É igual o Whatsapp Web, leu o QR Code com um Whatsapp o bot vai ficar vinculado a ele enquanto o serviço estiver rodando. Caso queira que ele rode em outro Whatsapp com outro número voce teria sim que ter outro chip.

1

sabe me dizer se há outra solução na internet, que sei lá, simule uma nova conta? Complicado pegar outro chip kkkk

1
0
0