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.

WhatsAppTelegram Demo

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!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *