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

[🐛] Como es posible añadir funciones adicionales al cliente? #572

Closed JoelVeloz closed 1 year ago

JoelVeloz commented 1 year ago

¿Que versión estas usando?

v2

¿Sobre que afecta?

Flujo de palabras (Flow)

Describe tu problema

Como es posible poner funciones adicionales que dependan de variables externas al Mensaje. Considerando que en el proveedor podemos tenemos referencia a la clase de Message y sus atributos, me gastaría acceder a otras variables del propio cliente de ws.

Esto con el propósito de poder generar funcionalidades extras. Por ejemplo:

  1. Como podría añadir un mensaje de bienvenida? Es decir que el usuario al mandar un mensaje, se le active un flow una sola vez por ser usuario nuevo, o por no haber enviado mensajes en las ultimas 48 horas, (Asumiria que requiero de obtener los mensajes respecto a un numero, pero cual es la función? y con que variable la ejecutaría?)

  2. Si requiero que se envien mensajes programados con crons, en que seccion del código lo enviaría?

  3. Si requiero que los flows solo de generen con sesiones, es decir que te mande un mensaje diciendo que si no responde se le enviara, se cerrara la conversación y tendrá que empezar desde el menu principal?

Toda esta lógica creo que podría ser posible obteniendo la referencia del cliente de Whatsapp y jugar con sus funciones, donde puedo obtener mas información de aquello?

Reproducir error

No response

Información Adicional

No response

JoelVeloz commented 1 year ago

Considero que la funcionalidad 1 es fundamental para que tenga sentido el bot, ya que si el usuario no sabe como iniciar el flujo conversacional, no podría acceder a todas las opciones del bot. Se que ya se puede hacer un mensaje de bienvenida via ws bussiness, pero me gastaría tener mayor control de las opciones, haciendo la logia vía código.

leifermendez commented 1 year ago

Considero que la funcionalidad 1 es fundamental para que tenga sentido el bot, ya que si el usuario no sabe como iniciar el flujo conversacional, no podría acceder a todas las opciones del bot. Se que ya se puede hacer un mensaje de bienvenida via ws bussiness, pero me gastaría tener mayor control de las opciones, haciendo la logia vía código.

Con respecto a este ya tengo la tarea #496 ya estamos con ella!

aurik3 commented 1 year ago

hola @JoelVeloz buen dia,

con respecto a tu issue hemos generado un nuevo atributo llamado provider el cual se encargara de darte la libertad de usar las opciones que te genera el proveedor OJO EL PROVEEDOR no las funcionas nativas de whatsapp para ello te dejo el siguiente codigo de ejemplo, estamos haciendo uso del proveedor de baileys y estamos usando la funcion de baileys para enviar una Vcard

const flowVCard = addKeyword('vcard').addAnswer(':triangular_flag_on_post::triangular_flag_on_post::triangular_flag_on_post:', null, async (ctx, { provider }) => {
    const id = ctx.key.remoteJid

    const templateButtons = [
        {index: 1, urlButton: {displayText: ':star: Star Baileys on GitHub!', url: 'https://github.com/adiwajshing/Baileys'}},
        {index: 2, callButton: {displayText: 'Call me!', phoneNumber: '+1 (234) 5678-901'}},
        {index: 3, quickReplyButton: {displayText: 'This is a reply, just like normal buttons!', id: 'id-like-buttons-message'}},
    ]

    const templateMessage = {
        text: "Hi it's a template message",
        footer: 'Hello World',
        templateButtons: templateButtons
    }

    const abc = await provider.getInstance()

    await abc.sendMessage(id, templateMessage)
    console.log('->', abc)
    return 
})
  1. despues del ctx tenemos la nueva funcion del provider (async (ctx, { provider })) la cual nos permite acceder a las funciones del proveedor que se haya escogido
  2. luego tenemos esta constante const abc = await provider.getInstance() la cual instancia la opcion con la cual queremos hacer referencia al proveedor
  3. por ultimo hacemos uso de la funcion que hayamos escogido del proovedor await abc.sendMessage(id, templateMessage) en este caso las VCARD de baileys

importante aun no se ha desplegado a publico esta funcion, sin embargo puedes hacer uso de ellas realizando la siguente instalacion en el terminal de tu proyecto de bot. npm i @bot-whatsapp/bot@dev npm i @bot-whatsapp/provider@dev

cualquuier duda o inquietud puedes gestionarla a travez del canal de discord.

jose-ess commented 1 year ago

ya desplegaron esta opcion?

yizuz420 commented 1 year ago

me funciona con el texto..... pero cómo se hace con imágenes? quiero hacer algo como lo que viene así en la página del proveedor:

await sock.sendMessage( id, { video: "./Media/ma_gif.mp4", caption: "hello!", gifPlayback: true } )

///////////////////////// lo tengo así en mi app.js:

const flowProb = addKeyword('prov') .addAction( async (ctx, {provider}) =>{ Nombre = ctx.pushName Telefono = 5215559099956@s.whatsapp.net id = 5215559099956@s.whatsapp.net const refProvider = await provider.getInstance() //await refProvider.sendMessage(id, { text: texto del proveedor })

await refProvider.sendMessage(id, 
  { 
    video: "https://renacerjusticiaylibertad.org/publia/gif/termipubliamex.gif", 
    caption: "hello!",
    gifPlayback: true
}
  )

} )

/////////////pero nada, tira el siguiente error:

TypeError: Cannot use 'in' operator to search for 'stream' in https://renacerjusticiaylibertad.org/publia/gif/termipubliamex.gif at getStream (C:\Users\Abraham\chatbot\publia\node_modules\baileys\lib\Utils\messages-media.js:229:18) at encryptedStream (C:\Users\Abraham\chatbot\publia\node_modules\baileys\lib\Utils\messages-media.js:278:58) at prepareWAMessageMedia (C:\Users\Abraham\chatbot\publia\node_modules\baileys\lib\Utils\messages.js:101:152) at generateWAMessageContent (C:\Users\Abraham\chatbot\publia\node_modules\baileys\lib\Utils\messages.js:327:53) at generateWAMessage (C:\Users\Abraham\chatbot\publia\node_modules\baileys\lib\Utils\messages.js:468:102) at Object.sendMessage (C:\Users\Abraham\chatbot\publia\node_modules\baileys\lib\Socket\messages-send.js:606:69) at Object.ans_2c39e980-db09-4320-85c2-324345ab3825 (C:\Users\Abraham\chatbot\publia\app.js:53:23) at async cbEveryCtx (C:\Users\Abraham\chatbot\publia\node_modules@bot-whatsapp\bot\lib\bundle.bot.cjs:775:13) at async resolveCbEveryCtx (C:\Users\Abraham\chatbot\publia\node_modules@bot-whatsapp\bot\lib\bundle.bot.cjs:751:55)

Node.js v18.15.0