Este proyecto fue desarrollado para ayudar a la comunidad que utiliza whatsapp como forma de implementar una API de manera rápida y efectiva, para empresas y mucho más! Gracias por ser parte de esta familia.
Puedes usar este proyecto de dos maneras, la primera es usar Servicios Web usando un conjunto de operaciones bien definidas, los métodos POST, GET, PUT y DELETE, la segunda opción es usar el bot en formato raw, sin usar una Web. Servicios.
¿Tienes alguna duda? ¿Necesitar ayuda? ¡Únete a nuestro grupo de whatsapp y pregunta tus dudas con otras personas!
Utilice la versión estable:
> npm i --guardar hidra-bot
o para lanzamientos nocturnos:
> npm i --save https://github.com/jonalan7/Hydra-bot/releases/download/nightly/hydra-nightly.tgz
Administrador de terminales:
> administrador de hilo
Instalar hilo Ubuntu:
> curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -> echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list> sudo apt update && sudo apt install hilo> hilo
El servicio se iniciará en localhost en el puerto 8080
const hidraBot = require('hidra-bot');(async () => { // iniciar servicio web const WS = espera hidraBot.initWs();}());
Si quieres trabajar en modo libre, usando solo el bot, ¡seca la información necesaria!
const hidraBot = require('hidra-bot');const mime = require('tipos-mime');const fs = require('fs');(async () => { dejar cliente; // inicia el servicio de bot const ev = espera hidraBot.initServer(); // volver a la interfaz actual de WhatsApp ev.on('interfaceChange', (cambiar) => {console.log('interfaceChange: ', cambiar); }); // devuelve los parámetros del código qr ev.on('qrcode', (qrcode) => {console.log('qrcode: ', qrcode); }); // devolver información de conexión ev.on('conexión', async (conn) => {// información del navegador!if (conn.statusFind === 'navegador') { console.log('info Navegador: ', conn.text);}/ / Estaba conectado a whatsapp chatif (conn.connect) { client = conn.client; // clase cliente de Hydra-bot const getMe = await client.getHost(); getMe.id._serialized; // número host console.log('Host Number: ', hostNumber); // envía un mensaje de texto await client.sendMessage({ a: hostNumber, // puedes pasar el número de contacto o el número de grupo cuerpo: "Hola, soy Hydra Bot", // opciones de texto del mensaje: {tipo: 'sendText', // tipo de envío },}).then((resultado) => { console.log(resultado); // mensaje resultado}).catch((error) => { console.log(error); // mensaje de error});} }); // volver recibir nuevos mensajes ev.on('newMessage', async (newMsg) => {// cuando se recibeif (!newMsg.result.fromMe) { // ¡mensaje recibido! console.log('NewMessageReceived: ', newMsg.result); // descargar archivos if (newMsg.result.isMedia) {const buffer = await client.decryptFile(newMsg.result);// En este punto, puedes hacer lo que quieras con el buffer// Lo más probable es que quieras escribirlo en un archivoconst fileName = `some-file-name.${mime.extension( newMsg.result.mimetype )}`;fs.writeFile(fileName, buffer, (err) => { if (err) {console.log(err }} }}// cuando es sentif (!!newMsg.result.fromMe) { // Mensaje enviado console.log('NewMessageSent: ', newMsg.result);} }); // devuelve el estado de cada mensaje ev.on('newOnAck', async (evento) => {console.log('id Mensaje: ', event.result.id._serialized); // mensaje idconsole.log('Mensaje de estado: ', evento.resultado .ack); // -7 = MD_DOWNGRADE, -6 = INACTIVO, -5 = CONTENIDO_UNUPLOADABLE, -4 = CONTENIDO_DEMASIADO_GRANDE, -3 = CONTENIDO_GONE, -2 = EXPIRADO, -1 = FALLADO, 0 = RELOJ, 1 = ENVIADO, 2 = RECIBIDO, 3 = LEÍDO, 4 = REPRODUCIDOconsole.log('De Mensaje: ', event.result.from); messageconsole.log('Al mensaje: ', event.result.to); // al mensaje });})();
Puppeteer se encarga de la descarga del archivo. El descifrado se realiza lo más rápido posible (supera a los métodos nativos). ¡Admite archivos grandes!
const hidraBot = require('hidra-bot');const fs = require('fs');const mime = require('mime-types');(async () => { dejar cliente; // inicia el servicio de bot const ev = espera hidraBot.initServer(); // devolver información de conexión ev.on('connection', async (conn) => {// Estaba conectado a whatsapp chatif (conn.connect) { client = conn.client;} }); ev.on('newMessage', async (newMsg) => {// cuando se recibeif (!newMsg.result.fromMe) { // ¡mensaje recibido! console.log('NewMessageReceived: ', newMsg.result); // descargar archivos if (newMsg.result.isMedia) {const buffer = await client.decryptFile(newMsg.result);// En este punto, puedes hacer lo que quieras con el buffer// Lo más probable es que quieras escribirlo en un archivoconst fileName = `some-file-name.${mime.extension( newMsg.result.mimetype )}`;fs.writeFile(fileName, búfer, (err) => { if (err) {console.log(err }}); });})();
const hidraBot = require('hidra-bot');hidraBot.initServer({ session: 'session', // Nombre del token a generar, se creará una carpeta con toda la información del cliente pathNameToken: 'token', // La ruta y el nombre de la carpeta donde se guardarán los tokens del cliente printQRInTerminal: true, // El CÓDIGO QR se imprimirá en el terminal si es verdadero updateLog: true, // Registra las actualizaciones de información automáticamente en la terminal timeAutoClose: 60000, // Si no lee el CÓDIGO QR por defecto durante 60 segundos, cerrará automáticamente el navegador del cliente para ahorrar memoria, si desea deshabilitarlo, establezca 0 o falso mkdirFolderToken: '', // Ruta de la carpeta del token, solo dentro del proyecto puppeteerOptions: {headless: true, // ¡Inicia el proyecto con el navegador abierto o no! args: [], // Argumentos adicionales para pasar a la instancia del navegador. agregando cualquier parámetro, reemplazará los argumentos predeterminados del proyectoexecutablePath: 'useChrome', // El navegador que se usará para el proyecto, puede especificar una ruta, si no pasa ningún parámetro, se abrirá el navegador instalado. },});
const hidraBot = require('hidra-bot');hidraBot.initWs({ servidorhost: 'http://localhost', puerto: '8080', url: '', // ¡apunta una URL para recibir una devolución de llamada! autenticación: verdadero, // solicita autenticación en las rutas pathNameToken: 'token', // La ruta y el nombre de la carpeta donde se guardarán los tokens del cliente printQRInTerminal: true, // El CÓDIGO QR se imprimirá en el terminal si es verdadero updateLog: true, // Registra las actualizaciones de información automáticamente en la terminal timeAutoClose: 60000, // Si no lee el CÓDIGO QR por defecto durante 60 segundos, cerrará automáticamente el navegador del cliente para ahorrar memoria, si desea deshabilitarlo, establezca 0 o falso mkdirFolderToken: '', // Ruta de la carpeta del token, solo dentro del proyecto puppeteerOptions: {headless: true, // ¡Inicia el proyecto con el navegador abierto o no! args: [], // Argumentos adicionales para pasar a la instancia del navegador. agregando cualquier parámetro, reemplazará los argumentos predeterminados del proyectoexecutablePath: 'useChrome', // El navegador que se usará para el proyecto, puede especificar una ruta, si no pasa ningún parámetro, se abrirá el navegador instalado. },});
Para iniciar la interfaz de administración utilice:
> administrador de hilo
Lista de comandos en la terminal:
Dominio | Descripción |
---|---|
/create | Crear usuario |
/delete | Eliminar usuario |
/selectid | Mostrar usuario por id |
/selectname | Seleccionar usuario por nombre |
/getall | Listar todos los usuarios |
/deactivate | Desactivar usuario |
/activate | Activar usuario |
/changename | Cambiar nombre de usuario |
/password | Cambiar contraseña de usuario |
/cls | Borrar pantalla/terminal |
/help | Enumere todos los comandos para la administración en la terminal |
/exit | Administrador de salida |
REST API
Headers
, para poder acceder a ellas, crear un administrador{ "Tipo de contenido": "aplicación/json", "admin": "admin", "admin_pass": "admin"}
Tipo | Ruta al navegador | Descripción | Cuerpo |
---|---|---|---|
CORREO | /create_user | Crear usuario | {"name":"USE","password":"USER PASSWORD"} |
DEL | /delete_user/ID_USE | Eliminar usuario | EMPTY |
CONSEGUIR | /get_user_by_id/ID_USE | Mostrar usuario por ID | EMPTY |
CONSEGUIR | /get_all_users | Listar todos los usuarios | EMPTY |
PONER | /deactivate_user | Desactivar usuario | {"id":"USER ID"} |
PONER | /activate_user | Activar usuario | {"id":"USER ID"} |
PONER | /change_name | Cambiar nombre de usuario | {"id":"USER ID","name":"NEW USERNAME"} |
PONER | /change_password | Cambiar contraseña de usuario | {"id":"USER ID","password":"NEW SECURE PASSWORD"} |
Nota: ¡Los parámetros se pueden cambiar durante el desarrollo!
Headers
de usuario (por defecto, nombre de usuario = 'usuario', contraseña = 'usuario').Los encabezados deben parametrizarse como:
{ "Tipo de contenido": "aplicación/json", "usuario": "usuario", "user_pass": "usuario"}
Si desea recibir una devolución de llamada en una URL específica, pase el parámetro URL en la ruta de conexión.
Tipo | Ruta al navegador | Descripción | Cuerpo |
---|---|---|---|
CORREO | /connect | Iniciar conexión con Whatsapp | { "url": "http://localhost:8080/webhooktest" } |
CORREO | /sendtext | Enviar un mensaje de texto a un número | { "to": "contact number", "body": "message"} |
CORREO | /sendFile | Enviar archivo a un número | { "to": "contact number", "file_path": "https://docs.marklogic.com/guide/node-dev.pdf", "file_name": "node.js" } |
CORREO | /sendAudio | enviar audio | { "to": "contact number", "url_mp3": "https://cdn.freesound.org/previews/620/620094_4935038-lq.mp3", "file_name": "node.js" } |
CORREO | /sendImage | Enviar mensaje de imagen | { "to": "contact number", "url_img": "https://i.pinimg.com/564x/a9/b1/18/a9b118761788b1ab260aae2835c468cd.jpg" } |
CORREO | /disconnect | Desconectarse del servidor | VACÍO |
CORREO | /check_user | Comprobar si el usuario ingresado existe | VACÍO |
Tipo | Ruta al navegador | Descripción | Cuerpo |
---|---|---|---|
CONSEGUIR | /get_all_contacts | Recuperar contactos | EMPTY |
CONSEGUIR | /check_connect | comprobar si el cliente está conectado | EMPTY |
CONSEGUIR | /last_qrcode | Compruebe si el código QR está activo | EMPTY |
CONSEGUIR | /screenshot | Obtener captura de pantalla | EMPTY |
¡Debes iniciar sesión para utilizar estas funciones!
to
ser <phone Number>@c.us
o <phone Number>-<groupId>@g.us
o <phone Number><groupId>@g.us
¡Puedes enviar mensajes solo usando una función!
// enviar mensaje de textoesperar cliente .sendMessage({to: '[email protected]', // puedes pasar el número de contacto o número de grupobody: 'Un mensaje enviado por Hydra-bot', // mensaje textoptions: { tipo: 'sendText', // tipo de envío}, }) .then((resultado) => {console.log(resultado); // resultado del mensaje }) .catch((error) => {console.log(error); // mensaje de error });// enviar archivos en espera del cliente .sendMessage({to: '[email protected]', // puedes pasar el número de contacto o número de grupobody: './file.pdf', // puedes usar un directorio o usar urloptions: { tipo: ' sendFile', // tipo de envío nombre de archivo: 'nombre de archivo', // ponga el nombre del archivo aquí}, }) .then((resultado) => {console.log(resultado); // resultado del mensaje }) .catch((error) => {console.log(error); // mensaje de error });// enviar archivo cliente audioawait .sendMessage({to: '[email protected]', // puedes pasar el número de contacto o número de grupobody: './file.mp3', // puedes usar un directorio o usar urloptions: { type: ' sendAudio', // tipo de envío}, }) .then((resultado) => {console.log(resultado); // resultado del mensaje }) .catch((error) => {console.log(error); // mensaje de error });// Enviar archivo de audio al cliente base64await .sendMessage({to: '[email protected]', // puedes pasar el número de contacto o número de grupobody: base64MP3, // puedes usar un directorio o usar urloptions: { type: 'sendAudioBase64', // envío tipo}, }) .then((resultado) => {console.log(resultado); // resultado del mensaje }) .catch((error) => {console.log(error); // mensaje de error });// Enviar imagen mensaje en espera del cliente .sendMessage({to: '[email protected]', // puedes pasar el número de contacto o número de grupobody: './file.jpg', // puedes usar un directorio o usar urloptions: { type: ' sendImage', // título del tipo de envío: 'texto de imagen', // texto de imagen}, }) .then((resultado) => {console.log(resultado); // resultado del mensaje }) .catch((error) => {console.log(error); // mensaje de error });// Enviar imagen al cliente Base64await .sendMessage({to: '[email protected]', // puedes pasar el número de contacto o número de grupobody: base64IMG, // puedes usar un directorio o usar urloptions: { type: 'sendImageFromBase64', // envío escriba título: 'texto de imagen', // texto de imagen}, }) .then((resultado) => {console.log(resultado); // resultado del mensaje }) .catch((error) => {console.log(error); // mensaje de error });
// Envía un mensaje de texto al cliente chatawait determinado .sendText('[email protected]', 'Un mensaje enviado por Hydra-bot') .then((resultado) => {console.log(resultado); // resultado del mensaje }) .catch((error) => {console.log(error); // mensaje de error });// Envía el archivo desde el cliente pathawait .sendFile('[email protected]', './file.pdf', {nombre de archivo: 'nombre de archivo' }) .then((resultado) => {console.log(resultado); // resultado del mensaje }) .catch((error) => {console.log(error); // mensaje de error });// Enviar archivo de audio al cliente en espera .sendAudio('[email protected]', './archivo.mp3') .then((resultado) => {console.log(resultado); // resultado del mensaje }) .catch((error) => {console.log(error); // mensaje de error });// Enviar audio al cliente base64await .sendAudioBase64('[email protected]', base64MP3) .then((resultado) => {console.log(resultado); // resultado del mensaje }) .catch((error) => {console.log(error); // mensaje de error });// Enviar imagen mensaje en espera del cliente .sendImage('[email protected]', './file.jpg', {título: 'texto de la imagen' }) .then((resultado) => {console.log(resultado); // resultado del mensaje }) .catch((error) => {console.log(error); // mensaje de error });// Enviar imagen al cliente base64await .sendImageFromBase64('[email protected]', base64IMG, {título: 'texto de la imagen' }) .then((resultado) => {console.log(resultado); // resultado del mensaje }) .catch((error) => {console.log(error); // mensaje de error });
// Obtener información del dispositivoawait client.getHost();
// devuelve una lista de contactosconst contacts = aw