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
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
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 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 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 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 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: 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.
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:
Command | Endpoint | Descrição |
---|---|---|
Send (POST): | /TOKEN/send | Envia mensagem, vídeos, imagens e localização |
Info (GET): | /TOKEN/status | Verifica o status |
Stop (GET): | /TOKEN/stop | Pausa a Instância do Whatsapp |
Start (GET): | /TOKEN/start | Inicia 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.
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.