Chatbot Manga Reader - WhatsApp e Telegram

Criei um chatbot para ler mangás que se conecta com o WhatsApp e com o Telegram, assim é possível ler seus títulos favoritos de qualquer lugar!

A inspiração para esse projeto veio daqui da TabNews, após ler o artigo do Guia completo de como integrar o ChatGPT com Whatsapp 🤖 descobri a Lib Venom Bot e, a partir daí, decidi integrá-la com a API de mangás que eu havia desenvolvido a um tempo.

O objetivo era ter uma forma fácil de ler meus títulos favoritos em um tablet bem velhinho que tenho aqui. Como eu havia desenvolvido um API em Python que realiza o Scrapping de páginas da internet, resolvi reaproveitar esse projeto que estava parado. Nessa API recebo a requisição para um título e qual seria a fonte que preciso realizar a raspagem de dados, se não encontrar os arquivos localmente envio para uma fila SQS. Para popular esse banco de imagens tenho consumers que buscam e inserem em uma pasta, nesse caso fica em um EBS na AWS, já que tudo está hospedado em uma máquina EC2 (free tier).

Exemplo de chamada para a API

curl --location --request GET 'http://localhost:3000/chapter?source=manga_livre&manga=Naruto&number=692'

Mensagem enviada para o SQS apartir do request não encontrado

{
    "source": "manga_livre",
    "manga": "Naruto",
    "chapter": "692"
}

Para esse projeto também configurei uma esteira de CD para subir automaticamente as alterações na API. Posso compartilhar um post aqui no TabNews depois explicando melhor como configurei! Segue o arquivo para quem tiver curiosidade deploy.yml

A ideia inicial era fazer apenas para o WhatsApp então utilizei apenas a lib VenomBot nessa primeira versão, segue o exemplo de como estava:

Só que no caminho tive alguns imprevistos... o número que peguei para o WhatsApp foi bloqueado e até o momento não consegui recadastrar ele...

Decidi adicionar o telegram como uma segunda opção e utilizar ele por enquanto. Foi bem simples porque já existem diversas libs para ele, sem falar que havia feito em python alguns bots anos atrás, mas foi a primeira vez em NodeJS.

Integração Telegram

import TelegramBot from 'node-telegram-bot-api'

import commands from '../utils/commands.js'
import MangaService from './manga.service.js';

export default function startTelegramBot() {

    const token = process.env.TELEGRAM_BOT_TOKEN;

    const bot = new TelegramBot(token, { polling: true });

    bot.onText(/\/mangabot (.+) (.+)/, (msg, request) => {
        const chatId = msg.chat.id;
        const manga = request[1];
        const chapter = request[2];

        bot.sendMessage(chatId, `Buscando o capítulo ${chapter} de ${manga}...`);

        MangaService.getMangaChapter(manga, chapter, 0).then((pages) => {
            if (pages === null || pages.length === 0) {
                bot.sendMessage(chatId, "Capítulo sendo baixado ou não encontrado. Aguarde alguns minutos e tente novamente.")
                return
            }
            let i = 0;
            function sendNext() {
                if (i >= pages.length) return;
                let pageNumber = pages[i].split("=").pop()
                bot.sendPhoto(
                    chatId,
                    pages[i]
                ).catch((error) => {
                    console.log(error)
                    bot.sendMessage(chatId, `Ocorreu um erro ao enviar a página ${pageNumber}. Tente novamente mais tarde.`)
                })
                i++;
                setTimeout(sendNext, 1000); // delay of 1 second
            }
            sendNext();
        }).catch((error) => {
            console.log(error)
            bot.sendMessage(chatId, "Ocorreu um erro ao buscar o capítulo. Tente novamente mais tarde.")
        })
    })

    bot.onText(/\/help/, (msg) => {
        const chatId = msg.chat.id;

        // send a message to the chat acknowledging receipt of their message
        bot.sendMessage(chatId, "Comandos disponíveis: \n/mangabot [nome do mangá] [número capítulo] \n\n Exemplo: /mangabot Naruto 698");
    })

    commands.hello.map((command) => {
        bot.onText(new RegExp(command, 'i'), (msg) => {
            const chatId = msg.chat.id;

            // send a message to the chat acknowledging receipt of their message
            bot.sendMessage(chatId, "Olá, eu sou o Mangabot! \n\nPara saber os comandos disponíveis, digite /help");
        })
    })

}

No final ficou assim o desenho: A requisição pode chegar do WhatsApp ou do Telegram e a aplicação NodeJS irá chamar a API de scrapping para pegar as páginas, fazendo retentativas até o consumer finalizar e retornar.

Ainda preciso realizar algumas melhorias no código, mas já está bem legal para uma versão beta test! Espero que gostem!

Seguem os repositórios e o link do bot

Não esqueçam de dar um "star🌟" se curtiram o projeto!

Que projeto legal Jean 👏👏 Uma ideia seria de usar a api que a MangaDex criou também, é um site agregador de grupos de tradução americano, mas que contém muitos mangás em pt-br.

Aqui estaria a documentação caso surgir o interesse: https://api.mangadex.org/docs/

Que projeto fino senhores! 🍷🗿

Uma ideia boa seria concatenar as imagens em um pdf. Pra ficar mais simples do usuário organizar os arquivos no celular.

Impressionado em como você conseguiu vencer a instabilidade do servidor do Mangá Livre, muito bom, parabéns.

Sensacional jjeanjacques10! Projeto ficou muito bem explicado e completinho, é maravilhoso ver explicações assim aqui no fórum 🥳

seria muito massa se as respostas das requisições viessem em um pdf, para prevenir acabar perdendo a ordem das paginas ou a pessoa queira guardar em outro lugar

top demais, parabens!

Tenho uma empresa que atua com experiências em canais digitais e não tinha pensando em uma jornada como essa, achei mega interessante a aplicação. Talvez só tentaria oferecer uma forma de paginação manual para quem nao quer receber uma porrada de imagens de uma única vez. No mais, achei incrível! Parabéns!

Gostei da ideia [diglopes](https://www.tabnews.com.br/diglopes)! Estou ainda entendendo como funciona essa parte de sessões nas libs, mas estou mapeando algumas melhorias e essa páginação parece interessante!
Eu particularmente gostei dessa ideia, espero que os desenvolvedores considerem.

Ficou muito top, parabéns!!!

Projeto massa! Achei bem interessante a ideia e como você explicou o desenvolvimento dele. De forma simples. Acho interessante que a forma que você explicou ajuda muito quem deseja criar um bot para Whatsapp e Telegram. E vendo tanto a possibilidade, como um guia simples, de integração com imagens e outros conteúdos fora respostas simples, o pessoal pode ter ideia para criar muitos outros tipos de bots que os ajudarão no dia a dia, assim como o seu te ajudou a conseguir ler seus mangás de qualquer lugar! Ótimo projeto e ótima publicação!

bot não ta respondendo no telegram

Qual mensagem está dando? testei aqui e retornou O.o
mandei /start
Para iniciar você pode enviar um "Oi", vou adicionar como chamada padrão o `/start` também. Agora para pedir um capítulo você coloca assim: `/mangabot [nome do mangá] [número capítulo]` Exemplo: `/mangabot Naruto 698`
eu mandei o /start pq foi oq apareceu ao clicar no link, mas colocando o comando que ta na img de exemplo deu certo

Eu gostei muito, parabéns cara, a sua criatividade foi muito boa!

Que bot incrível, me inspirando muito nos posts do pessoal para voltar a programar! Parabéns!

Parabéns, não apenas pelo projeto mas pelo storyteller que nos proporcionou, ótimo post! Explicando a motivação, e as inspirações! Já deixei as stars :) E pra mim criar um bot do whatsapp era complicado, isso vai me ajudar bastante ;)

o número que peguei para o WhatsApp foi bloqueado e até o momento não consegui recadastrar ele. Isso foi por causa do uso do Venom Bot?

Acredito que tenha sido sim por conta dele, mas por conta de um bug que fez enviar várias mensagens seguidas 😅. Aparentemente eles liberaram, habilitei aqui caso queiram testar: WhatsApp: https://bit.ly/mangabot
É pessoal, até tentei, mas a máquina t2.micro nao aguenta os dois juntos rodando... Vai ficar só o telegram.

Que projeto top!!! Posso contribuir com alguma modificação lá no github?

Opa, obrigado [brunomileto](https://www.tabnews.com.br/brunomileto)!! Claro, fique a vontade para contribuir, vou ficar muito feliz de ver Issues ou PR's abertos!

Muito bom, resolver desafios do dia a dia com tecnologia é que faz de nós desenvolvedores de software melhores que qualquer IA por aí rs, meus parabéns.

excelente... sempre bom ver novas manieras de trabalho...

Curti o projeto, muito bom! Talvez, como sugestão, separar o nome do manga com o capitulo, por exemplo em mangas com nome que contenha mais que uma palavra, colocar todo junto ele não encontra, nem separado pois pega como mais de dois argumentos ou algo assim.

*Corrigindo* Testei alguns diferentes aqui e funcionaram, com duas palavras no nome!

Nossa! Eu tenho que aprender a fazer bot no Telegram. rsrs

Muito obrigado por compartilhar esse conteúdo incrível! Não só foi útil, mas também bem escrito e fácil de entender Obrigado por se dedicar em produzir conteúdo de qualidade. Valeu!