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

Pitch: Marvin - Whatsapp bot com OpenAI, algumas features a mais e um plus

Fala pessoal do TabNews, me chamo André e desde 2014...2015 venho brincando com automatizações utilizando WhatsApp. Na época era bem complicado, utilizava libs em python como a https://github.com/tgalal/yowsup e era muito mais gambiarra do que é hoje em dia.

Sou da época do mIRC quem lembra? E sempre senti falta de algumas features que tinha no finado mIRC como por exemplo notificações quando alguem nos chamava nos canais (grupos para o pessoal mais jovem) e antes mesmo de ter essa funcionalidade no WhatsApp, em meu grupo de amigos conseguimos desenvoler um robô que notificava no privado sempre que alguém nos chamada pelo @nick. Ficamos felizes ao ver que anos depois o WhastApp implementava essa função.

Bom... feita a introdução, eis que me deparo com o excelente artigo do nosso amigo Victor e decidi compartilhar também algo que eu ja venho a algum tempo trabalhando como sideproject.

O Marvin

Marvin

O Marvin foi construído inicialmente em javascript e estou migrando pouco a pouco para typescript assim como ajustando sua arquitetura (confesso que por se tratar de um sideproject acabo relaxando bastante em boas práticas mas vou ajustando com o tempo)

Não vou perder muito tempo explicando o básico pois o artigo do Victor ja o faz com excelência apesar de o Marvin ser mais complexo em sua estrutura e utiliza outra lib para lidar com o WhatsApp

Atualmente o Marvin por enquanto só roda em grupos da amigos e contatos pessoais.

Comandos

@help

Possui diversos comandos de interação, uns são pra facilitar o dia a dia no grupo de amigos e outros por puro laboratório. Acabo usando bastante Marvin pra testar algumas coisas. Por exemplo.. ele me notifica sempre quando um serviço do trabalho está com problema, servidor caiu etc..

  • @help: Listar comandos disponíveis para interação.

  • @ping: Responde com um @pong, acabo usando pra ver se ele está online haha.

  • @vid endereço-do-video: Baixar vídeo do Instagram/Youtube/Twitter/Vimeo. Aqui eu utilizo a lib youtube-dl-exec, o Marvin baixa o vídeo (mas não salva no servidor) e encaminha diretamente como se fosse um vídeo do Whatsapp

pay.jpg

  • @pay endereço-da-noticia: Burlar paywall. Nesse caso utilizo a API do bit.ly junto com o 12ft. Até pensei em montar um proxy próprio porque o 12ft é bloqueado por alguns portais. O Marvin retorna um link para ler a notícia.

resume.jpg

  • @resume endereço-da-noticia: Aqui é um pouco diferente, utilizo uma api REST própria de extração de artigos usando a lib article-extractor e logo em seguida envio para a OpenAI para criação do resumo em tópicos. Até preciso arrumar o prompt. O Marvin retorna em forma de tópicos os assuntos relatados na matéria.

ac.jpg

  • @ac sigla-do-ativo: Cotação do ativo na bolsa. Nesse caso pego as informações de uma api de finanças da RapidApi, não to lembrado exatamente qual é mas retorna bem rápido.

  • @usd: Cotação atual do Dólar. Via awesomeapi

  • @eur: Cotação atual do Euro. Via awesomeapi

img.jpg

  • @img descricao-da-imagem: Criar uma imagem usando o DALLE-3 da OpenAI baseado na sua descrição

  • @vision url-da-imagem: Descreve a imagem usando a VISION da OpenAI baseado na sua descrição. Tenho uma ideia aqui de poder ajudar deficientes visuais que recebem imagens no WhatsApp. Por enquanto ele só aceita uma URL mas devo fazer um update para aceitar imagens enviadas ou encaminhadas pelo próprio WhatsApp. O Vision é incrivelmente funcional, tenho feito testes para analisar motores de carro e ele acerta tudo. Quem sabe no futuro nós não poderemos enviar um vídeo do motor do carro em funcionamento e a IA dizer um possível aparente problema?

talk.jpg

  • @talk: Marvin responde em formato de áudio. É basicamente o chatGPT mas o Marvin responde em formato de áudio usando a Text to Speech da própria OpenAI

  • @reset: Reiniciar a conversa com bot. Por padrão o Marvin salva as últimas 2 interações por chat/grupo no Whatsapp.

E é claro você pode conversar normalmente como se fosse o ChatGPT já usando o GPT4-turbo.

conversando

Como usar o Marvin?

O servidores assim como o serviços de API de terceiros utilizados se mantém ativo custeado pela empresa onde trabalho. Infelizmente por enquanto não temos como liberar e escalar para o público geral e está restrito somente ao meu grupo de amigos e a empresa.

Alguns comandos como @img e @vision que tem preços mais elevados são restritos somente a mim e a umas 2 pessoas. Acabei abrindo por um tempo a todos os meus amigos e levei um susto 2 dias depois hehe.

Porém o projeto está opensource. Explico mais ao final do artigo.

REST API (Fastify)

O Marvin conta também com alguns endpoints e envio de webhooks para interação com a conta do WhatsApp (ainda não migrei todos da versão antiga para essa nova) mas eles são:

CommandEndpointDescrição
Send (POST):/TOKEN/sendEnvia mensagem, vídeos, imagens e localização
Info (GET):/TOKEN/statusVerifica o status
Stop (GET):/TOKEN/stopPausa a Instância do Whatsapp
Start (GET):/TOKEN/startInicia a instância do Whatsapp
// Text message (for groups use @g.us)

{
  "cmd": "chat",
  "to": "[email protected]",
  "msg": "some message"
}

// Audios (audio/ogg, audio/mpeg)

{
  "cmd": "media",
  "to": "[email protected]",
  "url": "https://domain.tld/audio.mp3"
}

// Images (image/jpeg, image/png, image/gif)

{
  "cmd": "media",
  "to": "[email protected]",
  "url": "https://domain.tld/image.jpg",
  "msg": "some caption (optional)"
}

// Link or Youtube videos

{
  "cmd": "link",
  "to": "[email protected]",
  "url": "https://github.com",
  "msg": "some message (optional)"
}

Plus (GamaGame) 😁

Essa é pra quem começou cedo na internet na época do mIRC e jogava os GamaGames do canais. Acabei sendo nostálgico demais e desenvolvi um módulo para o Marvin.

gamagame

Basicamente GamaGame é um jogo de listas/quiz com múltiplas respostas onde todo mundo do grupo interage ao mesmo tempo. Cada resposta certa tem uma pontuação com peso diferente pra cada resposta.

Cada jogo tem 10 perguntas e cada pergunta dura em média 60 segundos. Ao final tem um score do ganhador.

No Marvin todas as perguntas são geradas pelo ChatGPT em tempo de execução, ou seja a cada jogo as perguntas e respostas serão diferentes.

Próximo passo é salvar todos os scores no SQLite para ter o campeão da semana/mês/ano e o Marvin não esquecer o score quando tiver que ser resetado.

OpenSource

Decidi abrir o código do Marvin, infelizmente está sem um Readme pois ainda não tive tempo de criar toda a documentação, principalmente dos endpoints REST de interação.

Ainda é necessário arrumar e organizar bastante coisa, melhorar a estrutura de pastas.. tem muitos if's desnecessários.. enfim, não está 100% mas é um projeto que eu levo com carinho e espero que possa gerar interesse no aprendizado de alguem.

Repositório do Marvin

Carregando publicação patrocinada...
2

Ai que legal, adorei as funções que você implementou.

Eu tenho um projeto parecido, eu chamo ele de Maria, pode ser encontrado em: www.mariabot.com.br

Sobre deixar escalável é bem complicado mesmo, quando iniciei o projeto eu deixava usuários gratuitos gerarem 25 imagens por dia sksksksk, depois de -600 R$ eu fui melhorando e atualmente deixo apenas 5 imagens diárias.

Nao sei qual lib vc usa para cuidar do whatsapp, mas eu tive alguns problemas com algumas libs e a que mais me serviu foi a Baileys.

Boa sorte com o projeto!

1

Que legal @andremacola parabéns pelo projeto 👏🏻👏🏻.

Eu fiz um bot para notificar os jogos gratuitos da Epic Games para o WhatsApp e Telegrama, nessa jornada acabei encontrando com o projeto Evoluiton API onde e possível ter uma integração bem legal.

1

Eu tenho uma questões, que podem não estar relacionadas ao game, mas não exatamente nele, mas ao estado!

Como você sabe em que estado um jogado esta?
Se tem 3 pessoas jogando o mesmo game, cada pessoa pode estar em perguntas diferentes.

O seus sistema precisa saber em que ponto cada jogador esta.
E como voce fez isso?
Pergunto isso pq quero fazer um bot pra inserir eventos e listar eventos pra minha região!

Mas não sei gerir ainda os estados.
Pessoa 1 - inicia
Pessoa 2 - inicia
Pessoa 1 - pede lista de eventos
Pessoa 2 quer enviar um evento
Bot - pede nome do evento para pessoa 2
Bot - envia lista de eventos para pessoa 1
Pessoa 2 - envia o nome do evento
Bot - salva o nome do evento e pede confirmação do nome
Pessoa 3 - inicia
Pessoa 3 - quer enviar um evento
Pessoa 2 - confirma nome do evento.

Acho que deu pra entender.
Meu problema é como gerenciar isso?
Eu to quebrando a cabeça com isso!

Vi pelo seu game que isso é bem parecido.
Como vc fez?
Abraços

1

1 - Como você sabe em que estado um jogado esta?
Na verdade todos jogam ao mesmo tempo colocando respostas. Quem inicia o jogo é o Admin. O jogo só funciona em grupo. Assim que um acerta, o Marvin retorna uma mensagem e adiciona no score a pontuação referente aquela pergunta.

O Game é separado por instancias e em cada grupo é criado uma instancia diferente. Uma coisa que não fiz foi a persistencia, ou seja, se tiver 2 ou 3 jogos seguidos, os pontos de cada jogo não são somados a um score total e se o Marvin tiver a instância do WhatsApp reiniciada, todos os scores são zerados. Penso em adotar SQLite pra salvar os dados dos jogadores.

Não existe bem um gerenciador de estado... apenas uma variável na classe onde ficam sendo atualizados os scores que fica em memória e duram somente até o jogo ser finalizado

1

Isso é extremamente incrivel! Fico impressionada em como podemos automatizar as coisas mais simples do nosso dia a dia com códigos tao divertidos.
Espero chegar lá um dia..
Voa!

1

Incrivel,queria começar a desenvolver algumas coisas parecidas com automatizações no WhatsApp,poderia me passar algum guia ou documentação,qual quer informação serve.Parabens pelo projeto!!!

1
0