Olá, esse bot de whatsapp foi criado com foco em atendimento ao cliente.
git clone https://github.com/kaualandi/bot-whatsapp-flow.git
cd bot-whatsapp-flow
npm install
Você precisará de um arquivo .env
, copie o .env.example
cp .env.example .env
O que tem em sua env:
- JSON_SERVER_PORT: Porta do servidor json-server, onde é salvo as informações dos usuários.
- EXPIRE_TIME: Tempo de expiração da seção do usuário em milissegundos (o padrão é 2 minutos).
npm start
Isso iniciará o bot em modo de desenvolvimento, aparecerá um QR Code para escanear.
O Json-Server também será iniciado, é nele onde é salvo as informações dos usuários.
Acredito que você não queria que o server fique ocupando uma instância do terminal. Devemos então prepará-lo para o PM2.
Não ensinarei aqui como configurar o PM2. Mas se quiser, você pode ver o guia para isso. Verifique de instalar também o suporte para Typescript do PM2.
Se ainda não estiver, entre na pasta do servidor
Inicie o server com o PM2:
pm2 start src/index.ts --name meu-bot
Para escanear o QR Code, basta acessar o endereço http://<seu_ip>:3012
.
O passo do bot é o arquivo que ele chamará para executar uma ação em determinado momento.
Por exemplo: Quando o usuário inicia uma conversa, o código o cadastrará e será chamado o passo 0. Fazendo o que for configurado nele.
Observe o código abaixo:
import { Client, Message } from '@open-wa/wa-automate';
import { Step } from '../core/decorators/step-decorator';
import { OnInit } from '../core/models/step';
@Step({ selector: 0 })
export class Step0 implements OnInit {
async onInit(client: Client, message: Message): Promise<number> {
await client.sendText(message.from, 'Olá, tudo bem? Escolha 1 ou 2');
return 1;
}
}
Ele é o primeiro passo, como indica o seletor no decorador @Step({ selector: 0 })
.
O método onInit
é o hook que será chamado quando o passo é carregado. Ele espera um retorno de um número, que é o próximo passo que o bot deve chamar na próxima vez que o usuário enviar uma mensagem.
Mas você também pode usar um choices, como no código abaixo:
import { Client, Message } from '@open-wa/wa-automate';
import { Step } from '../core/decorators';
import { IChoice, WithChoices } from '../core/models/step';
@Step({ selector: 1 })
export class Step1 implements WithChoices {
public choices: Record<string, IChoice> = {
'1': this.choice1,
'2': this.choice2,
};
async choice1(client: Client, message: Message) {
await client.sendText(message.from, 'Você escolheu a opção 1');
return 0;
}
async choice2(client: Client, message: Message) {
await client.sendText(message.from, 'Você escolheu a opção 2');
return 0;
}
}
O método choice1
e choice2
são as escolhas que o usuário pode fazer. Eles são chamados quando o usuário envia a mensagem correspondente a chave do objeto choices
.
Dica: Você pode combinar o uso de onInit
e WithChoices
para criar opções dinamicas vindo de uma API, por exemplo.
Para criar um passo, basta criar um arquivo na pasta src/steps
com o nome step<number>.ts
, ou como preferir.
Depois disso, você deve criar uma classe com o decorador @Step
, não se esqueça de expecificar um seletor (selector
) que ainda não foi usado para evitar sobreposição.
Implementar a interface OnInit
ou WithChoices
para te auxiliar com a tipagem.
Você também precisa importar de forma explícita o passo no arquivo src/steps/index.ts
, para que o bot possa carregar ele.
Chamadas de API e outros serviços devem ser feitos na pasta src/public/services
. Crie conforme o user-service.ts
para te auxiliar. Mas não se esqueça de usar o decorator @injectable
para que o serviço para uso do DI. Também o importe no arquivo src/config/inversify.ts
, siga o exemplo do UserService
.
O Axios é o cliente HTTP que está sendo utilizado, suas configurações estão no arquivo src/config/axios.ts
.
- Testes
- Logs com Sentry
- Migração para um banco real
- Containarização
- Documentação
- Internacionalização (i18n)
- CI/CD
- Histórico de conversa
- Humanização das mensagens com IA
- Integração com outros serviços (n8n)
- Feedback do usuário
👤 Kauã Landi
- Website: https://kaualf.com
- Github: @kaualandi
- LinkedIn: @kaualandi
- Instagram: @kauaalandi
Contribuições, problemas e solicitações de recursos são bem-vindos!
Sinta-se à vontade para verificar a página de problemas. Você também pode dar uma olhada na página de contribuição.
Dê uma ⭐️ se este projeto te ajudou!