mirror of
https://github.com/cheveguerra/bot-whatsapp.git
synced 2026-04-17 19:26:23 +00:00
feat(provider): meta provider is added
feat(provider): meta provider is added excelente trabajo @vicente1992
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -7,6 +7,7 @@
|
||||
"provider",
|
||||
"adapter",
|
||||
"ci",
|
||||
"starters"
|
||||
"starters",
|
||||
"conflict"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"./twilio": "./lib/twilio/index.cjs",
|
||||
"./web-whatsapp": "./lib/web-whatsapp/index.cjs",
|
||||
"./venom": "./lib/venom/index.cjs",
|
||||
"./baileys": "./lib/baileys/index.cjs"
|
||||
"./baileys": "./lib/baileys/index.cjs",
|
||||
"./meta": "./lib/meta/index.cjs"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,4 +48,13 @@ module.exports = [
|
||||
},
|
||||
plugins: [commonjs()],
|
||||
},
|
||||
{
|
||||
input: join(__dirname, 'src', 'meta', 'index.js'),
|
||||
output: {
|
||||
banner: banner['banner.output'].join(''),
|
||||
file: join(__dirname, 'lib', 'meta', 'index.cjs'),
|
||||
format: 'cjs',
|
||||
},
|
||||
plugins: [commonjs()],
|
||||
},
|
||||
]
|
||||
|
||||
115
packages/provider/src/meta/index.js
Normal file
115
packages/provider/src/meta/index.js
Normal file
@@ -0,0 +1,115 @@
|
||||
const { ProviderClass } = require('@bot-whatsapp/bot')
|
||||
const axios = require('axios')
|
||||
const MetaWebHookServer = require('./server')
|
||||
const URL = `https://graph.facebook.com/v15.0`
|
||||
|
||||
/**
|
||||
* ⚙️MetaProvider: Es un provedor que te ofrece enviar
|
||||
* mensaje a Whatsapp via API
|
||||
* info: https://developers.facebook.com/docs/whatsapp/cloud-api/reference/messages
|
||||
*
|
||||
*
|
||||
* Necesitas las siguientes tokens y valores
|
||||
* { token, numberId, vendorNumber, verify_token }
|
||||
*/
|
||||
|
||||
class MetaProvider extends ProviderClass {
|
||||
metHook
|
||||
token
|
||||
numberId
|
||||
constructor({ token, numberId, verifyToken }, _port = 3000) {
|
||||
super()
|
||||
this.token = token
|
||||
this.numberId = numberId
|
||||
this.metHook = new MetaWebHookServer(verifyToken, _port)
|
||||
this.metHook.start()
|
||||
|
||||
const listEvents = this.busEvents()
|
||||
|
||||
for (const { event, func } of listEvents) {
|
||||
this.metHook.on(event, func)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mapeamos los eventos nativos de whatsapp-web.js a los que la clase Provider espera
|
||||
* para tener un standar de eventos
|
||||
* @returns
|
||||
*/
|
||||
busEvents = () => [
|
||||
{
|
||||
event: 'auth_failure',
|
||||
func: (payload) => this.emit('error', payload),
|
||||
},
|
||||
{
|
||||
event: 'ready',
|
||||
func: () => this.emit('ready', true),
|
||||
},
|
||||
{
|
||||
event: 'message',
|
||||
func: (payload) => {
|
||||
this.emit('message', payload)
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
async sendMessageMeta(body) {
|
||||
try {
|
||||
const response = await axios.post(
|
||||
`${URL}/${this.numberId}/messages`,
|
||||
body,
|
||||
{
|
||||
headers: {
|
||||
Authorization: `Bearer ${this.token}`,
|
||||
},
|
||||
}
|
||||
)
|
||||
return response.data
|
||||
} catch (error) {
|
||||
return Promise.resolve(error)
|
||||
}
|
||||
}
|
||||
|
||||
async sendtext(number, message) {
|
||||
const body = {
|
||||
messaging_product: 'whatsapp',
|
||||
to: number,
|
||||
type: 'text',
|
||||
text: {
|
||||
preview_url: false,
|
||||
body: message,
|
||||
},
|
||||
}
|
||||
await this.sendMessageMeta(body)
|
||||
}
|
||||
|
||||
async sendMedia(number, message, mediaInput = null) {
|
||||
if (!mediaInput) throw new Error(`MEDIA_INPUT_NULL_: ${mediaInput}`)
|
||||
const body = {
|
||||
messaging_product: 'whatsapp',
|
||||
to: number,
|
||||
type: 'image',
|
||||
image: {
|
||||
link: mediaInput,
|
||||
},
|
||||
}
|
||||
await this.sendMessageMeta(body)
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {*} userId
|
||||
* @param {*} message
|
||||
* @param {*} param2
|
||||
* @returns
|
||||
*/
|
||||
sendMessage = async (number, message, { options }) => {
|
||||
if (options?.buttons?.length) return console.log('Envio de botones')
|
||||
if (options?.media)
|
||||
return this.sendMedia(number, message, options.media)
|
||||
|
||||
this.sendtext(number, message)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = MetaProvider
|
||||
63
packages/provider/src/meta/server.js
Normal file
63
packages/provider/src/meta/server.js
Normal file
@@ -0,0 +1,63 @@
|
||||
const { EventEmitter } = require('node:events')
|
||||
const polka = require('polka')
|
||||
const { urlencoded } = require('body-parser')
|
||||
|
||||
class MetaWebHookServer extends EventEmitter {
|
||||
metaServer
|
||||
metaPort
|
||||
verifyToken
|
||||
constructor(_verifyToken, _metaPort) {
|
||||
super()
|
||||
this.metaServer = this.buildHTTPServer()
|
||||
this.metaPort = _metaPort
|
||||
this.verifyToken = _verifyToken
|
||||
}
|
||||
|
||||
/**
|
||||
* Mensaje entrante
|
||||
* emit: 'message'
|
||||
* @param {*} req
|
||||
* @param {*} res
|
||||
*/
|
||||
incomingMsg = (req, res) => {
|
||||
const { body } = req
|
||||
const message = body.entry[0].changes[0].value.messages[0]
|
||||
const to = body.entry[0].changes[0].value.metadata.display_phone_number
|
||||
this.emit('message', {
|
||||
from: message.from,
|
||||
to,
|
||||
body: message.text.body,
|
||||
})
|
||||
const json = JSON.stringify({ body })
|
||||
res.end(json)
|
||||
}
|
||||
|
||||
/**
|
||||
* Contruir HTTP Server
|
||||
* @returns
|
||||
*/
|
||||
buildHTTPServer = () => {
|
||||
return polka()
|
||||
.use(urlencoded({ extended: true }))
|
||||
.post('/meta-hook', this.incomingMsg)
|
||||
}
|
||||
|
||||
/**
|
||||
* Puerto del HTTP
|
||||
* @param {*} port default 3000
|
||||
*/
|
||||
start = () => {
|
||||
this.metaServer.listen(this.metaPort, () => {
|
||||
console.log(``)
|
||||
console.log(`[meta]: Agregar esta url "WHEN A MESSAGE COMES IN"`)
|
||||
console.log(
|
||||
`[meta]: POST http://localhost:${this.metaPort}/meta-hook`
|
||||
)
|
||||
console.log(`[meta]: Más información en la documentacion`)
|
||||
console.log(``)
|
||||
})
|
||||
this.emit('ready')
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = MetaWebHookServer
|
||||
Reference in New Issue
Block a user