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

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.

WhatsApp

Telegram

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!

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

Carregando publicação patrocinada...
2
2

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.

1
1

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

1
1

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!

1
1
1
1

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!

1
1
1
1

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

0
1
1
1

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?

1
0
1
1
1
1
1

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.

0
1
1

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!