codigoencasa / bot-whatsapp

🤖 Crear Chatbot WhatsApp en minutos. Únete a este proyecto OpenSource (Typescript Version Pronto)
https://bot-whatsapp.netlify.app
MIT License
2.29k stars 797 forks source link

[🐬] permitir varias (multiples) sesiones en una sola ejecución del boot. #889

Closed precisapp closed 6 months ago

precisapp commented 10 months ago

¿Cual proveedor usaste?

bailey

¿Cual base de datos usaste?

json

Conclusion de la prueba

muy buena

Describe tu caso

Cómo se podría crear/mantener los QRs y las bot_sessions organizadas en subcarpetas, a las cuales podríamos llamar tenants? de tal forma a mantener una aplicación multisesion, por ejemplo:

project -> package.json -> node_modules -> app.js -> tenant1 ->-> bot_sessions ->-> bot.qr.png -> tenant2 ->-> bot_sessions ->-> bot.qr.png -> tenant_etc ->-> bot_sessions -> bot.qr.png

La idea consistiría en dar la misma funcionalidad, el mismo bot, pero a diferentes cuentas de clientes que se conectan mediante apis,

Se que existe la opción de crear varias instancias utilizando docker, o incluso replicando el contenido del proyecto e iniciando la instancia directamente desde dicho folder incluso con pm2, pero como sabrán eso conlleva un consumo a mas de recursos(por las instancias del node), sin contar que tanto el docker como las copias para usarlas con el pm2 las habría que automatizar para ir creándolas dinámicamente.

La idea también es evitar tener que instalar varios node_modules y aprovechar el del mismo proyecto.

Si esto se logra, se podría obtener el QR de un tentant por ejemplo utilizando ésta idea:

    app.get("/:tenant/get-qr", (req, res) => {
        res.sendFile(__dirname + "/" + req.params.tenant + "/bot.qr.png");
    });  

Para enviarla hacia cualquier pagina web de destino.

Y talvez con alguna modificación en el core, también de repente obtener el adapterProvider de un tenant específico de ésta manera:

    app.post("/:tenant/send-text/:number", bodyParser.text({type: '*/*'}), (req, res) => {
        try {
            let number = req.params.number;

            adapterProvider[req.params.tenant].sendText(number + '@' + 's.whatsapp.net', req.body)
            .then(o=>{
                console.log("send-text", o);
            })
            .catch(error=>{
                console.log("error de send-text", error);
            });

            res.send("sendText ok");
        } catch(error) {    
            console.log('/send-text/', error);
            return res.status(500).send(error);
        }
    });    

Es solo una idea, pero podría pensarse en otras soluciones.

Yo podría trabajar sobre la solución, solamente necesitaría un poco de ayuda para que alguien me indique:

  1. si se puede hacer o no por que hay algo que lo bloquea. (ya que no vi que nadie preguntó por esto aun). Utilizo baileys y postgres, por que note que es la mas eestable.
  2. tener idea de qué parte del código mirar para entender donde mismo se genera la imagen bot.qr y la carpeta bot_sessions.

Estaré aguardando una respuesta.

Saludos y Gracias.

¿Logs Importantes?

No hay por el momento

Información Adicional

No response

¿Quieres que te mencionemos?

https://www.youtube.com/channel/UC5ZwiLHWHQ0b4g-IblP7kBw

leifermendez commented 9 months ago

Hola @precisapp interesante tu enfoque si se puede lograr ya lo he hecho anteriormente puedes mirarte este video primero https://bot-whatsapp.netlify.app/docs/masterclass/ sobre las masterclass y tener otro punto de vista! PD: Felicidades por tu canal lo estuve mirando :) menciona!

diegozz4 commented 9 months ago

@precisapp, esta funcionalidad puede lograrse mediante instancias de clase que encapsularían cada sesión. @leifermendez, sería excelente tener esta capacidad de forma nativa. Quiero reiterar que he logrado implementarlo creando instancias para cada cliente sin un consumo excesivo de recursos, especialmente al usar Baileys como proveedor, dado que este maneja sockets directamente, a diferencia de otros proveedores que utilizan instancias de un navegador.

AdrMXR commented 8 months ago

Hola @diegozz4 , puedes dar mas detalles de como lograste crear instancias para cada cliente?

github-actions[bot] commented 6 months ago

¿Alguna novedad sobre esta ISSUE?

brunocascio commented 4 months ago

Me interesa tambien conocer la implementaciones @diegozz4