Skip to content

Fer2809fl/Bail

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

76 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Baileys

@fer2809fl/baileys

API de WhatsApp Web para Node.js

npm version License Node.js TypeScript

Conéctate a WhatsApp Web directamente desde Node.js sin navegadores ni Selenium


⚠️ Nota Importante

ꕤ Esta librería está basada en Baileys. No está afiliada ni aprobada oficialmente por WhatsApp.

@fer2809fl/baileys y su desarrollador no se hacen responsables por el mal uso de esta librería. Úsala de forma responsable — nada de spam ni actividades maliciosas.


📦 Instalación

Puedes instalarla de varias formas, todas funcionan igual:

Opción 1 — Desde npm (recomendado)

npm install @fer2809fl/baileys
yarn add @fer2809fl/baileys

Opción 2 — Desde GitHub directamente

npm install github:Fer2809fl/Baileys
yarn add github:Fer2809fl/Baileys

Opción 3 — También funciona con el paquete original

npm install @whiskeysockets/baileys
yarn add @whiskeysockets/baileys

Opción — En tu package.json (elige una de estas formas):

{
  "dependencies": {
    "@fer2809fl/baileys": "^1.4.5"
  }
}
{
  "dependencies": {
    "@whiskeysockets/baileys": "github:Fer2809fl/Baileys"
  }
}

⚡ Inicio Rápido

JavaScript

const { makeWASocket, useMultiFileAuthState } = require('@fer2809fl/baileys')

async function startBot() {
    const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
    
    const melody = makeWASocket({
        auth: state,
        printQRInTerminal: true
    })

    melody.ev.on('connection.update', ({ connection }) => {
        if (connection === 'open') console.log('✅ ¡Conectado con éxito!')
        if (connection === 'close') console.log('❌ Conexión cerrada, reconectando...')
    })

    melody.ev.on('messages.upsert', async ({ messages }) => {
        const m = messages[0]
        if (!m.message) return

        await melody.sendMessage(m.key.remoteJid, { 
            text: '¡Hola! Soy un bot de Delta!' 
        })
    })

    melody.ev.on('creds.update', saveCreds)
}

startBot()

TypeScript

import makeWASocket, { useMultiFileAuthState, DisconnectReason } from '@fer2809fl/baileys'
import { Boom } from '@hapi/boom'

async function startBot(): Promise<void> {
    const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
    
    const melody = makeWASocket({
        auth: state,
        printQRInTerminal: true
    })

    melody.ev.on('connection.update', ({ connection, lastDisconnect }) => {
        if (connection === 'close') {
            const shouldReconnect = (lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut
            if (shouldReconnect) startBot()
        }
        if (connection === 'open') console.log('✅ ¡Conectado!')
    })

    melody.ev.on('messages.upsert', async ({ messages }) => {
        const m = messages[0]
        if (!m.message) return

        await melody.sendMessage(m.key.remoteJid!, { 
            text: '¡Hola! Soy un bot de Delta!' 
        })
    })

    melody.ev.on('creds.update', saveCreds)
}

startBot()

✨ Características

General

  • 🚀 Optimizado para mayor velocidad y estabilidad
  • 📸 Mensajes multimedia (imágenes, video, audio, documentos)
  • 🤖 Comandos personalizados fáciles de implementar
  • 👥 Soporte para grupos y chats privados
  • 🔘 Mensajes interactivos con botones y listas

Técnicas

  • ⚡ Sin Selenium — Conexión directa vía WebSocket
  • 💾 Super eficiente — Bajo consumo de RAM
  • 📱 Soporte multi-dispositivo — Compatible con WhatsApp Web
  • 🔷 Totalmente tipado — TypeScript y JavaScript
  • 🔄 Reconexión automática ante desconexiones
  • 🔐 Sesiones persistentes guardadas localmente
  • 🌐 API completa de WhatsApp Web

📖 Uso Básico

Inicializar el bot

// JavaScript
const { makeWASocket, useMultiFileAuthState } = require('@fer2809fl/baileys')

const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
const melody = makeWASocket({ auth: state, printQRInTerminal: true })
melody.ev.on('creds.update', saveCreds)
// TypeScript
import makeWASocket, { useMultiFileAuthState } from '@fer2809fl/baileys'

const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
const melody = makeWASocket({ auth: state, printQRInTerminal: true })
melody.ev.on('creds.update', saveCreds)

Enviar mensajes

// Texto simple
await melody.sendMessage(jid, { text: '¡Hola mundo!' })

// Imagen con caption
await melody.sendMessage(jid, {
    image: { url: './images/mymelody.jpg' },
    caption: '¡Mira mi nueva foto!'
})

// Video con caption
await melody.sendMessage(jid, {
    video: { url: './videos/clip.mp4' },
    caption: '¡Nuevo video!'
})

// Audio (PTT = nota de voz)
await melody.sendMessage(jid, {
    audio: { url: './audio/nota.mp3' },
    mimetype: 'audio/mp4',
    ptt: true
})

// Sticker
await melody.sendMessage(jid, {
    sticker: { url: './stickers/melody.webp' }
})

// Documento
await melody.sendMessage(jid, {
    document: { url: './archivo.pdf' },
    mimetype: 'application/pdf',
    fileName: 'archivo.pdf'
})

// Reaccionar a un mensaje
await melody.sendMessage(jid, {
    react: { text: '💖', key: m.key }
})

🤖 Comandos Personalizados

JavaScript

melody.ev.on('messages.upsert', async ({ messages }) => {
    const m = messages[0]
    const body = m.message?.conversation
        || m.message?.extendedTextMessage?.text
        || ''

    const prefix = '!'
    if (!body.startsWith(prefix)) return

    const [cmd, ...args] = body.slice(prefix.length).trim().split(' ')

    switch (cmd.toLowerCase()) {
        case 'hola':
            await melody.sendMessage(m.key.remoteJid, {
                text: '¡Hola! Soy Delta, ¿en qué puedo ayudarte?'
            })
            break

        case 'ping':
            await melody.sendMessage(m.key.remoteJid, {
                text: '🏓 Pong!'
            })
            break

        case 'stickers':
            await melody.sendMessage(m.key.remoteJid, {
                text: '¡Aquí tienes stickers lindos!'
            })
            break

        default:
            await melody.sendMessage(m.key.remoteJid, {
                text: `Comando desconocido: ${cmd}`
            })
    }
})

TypeScript

melody.ev.on('messages.upsert', async ({ messages }) => {
    const m = messages[0]
    const body: string = m.message?.conversation
        ?? m.message?.extendedTextMessage?.text
        ?? ''

    const prefix = '!'
    if (!body.startsWith(prefix)) return

    const [cmd, ...args]: string[] = body.slice(prefix.length).trim().split(' ')

    const commands: Record<string, () => Promise<void>> = {
        hola: async () => {
            await melody.sendMessage(m.key.remoteJid!, {
                text: '¡Hola! Soy My Melody, ¿en qué puedo ayudarte?'
            })
        },
        ping: async () => {
            await melody.sendMessage(m.key.remoteJid!, { text: '🏓 Pong!' })
        },
        info: async () => {
            await melody.sendMessage(m.key.remoteJid!, {
                text: `📌 JID: ${m.key.remoteJid}\n👤 Sender: ${m.key.participant ?? m.key.remoteJid}`
            })
        }
    }

    await commands[cmd.toLowerCase()]?.()
})

⚙️ Configuración Avanzada

JavaScript

const melody = makeWASocket({
    auth: state,
    printQRInTerminal: true,
    markOnlineOnConnect: false,
    browser: ["Delta", "Chrome", "1.0.0"],
    logger: require('pino')({ level: 'silent' }),
    syncFullHistory: false,
    generateHighQualityLinkPreview: true
})

TypeScript

import pino from 'pino'

const melody = makeWASocket({
    auth: state,
    printQRInTerminal: true,
    markOnlineOnConnect: false,
    browser: ["Delta", "Chrome", "1.0.0"] as [string, string, string],
    logger: pino({ level: 'silent' }),
    syncFullHistory: false,
    generateHighQualityLinkPreview: true
})

🛠️ Funciones Útiles

Broadcast a múltiples chats

async function broadcastMessage(jids, message) {
    for (const jid of jids) {
        await melody.sendMessage(jid, { text: message })
        await new Promise(r => setTimeout(r, 1000)) // delay para evitar ban
    }
}

Descargar medios recibidos

const { downloadMediaMessage } = require('@fer2809fl/baileys')

melody.ev.on('messages.upsert', async ({ messages }) => {
    const m = messages[0]
    if (!m.message?.imageMessage) return

    const buffer = await downloadMediaMessage(m, 'buffer', {})
    require('fs').writeFileSync('./imagen_recibida.jpg', buffer)
    console.log('✅ Imagen guardada')
})

Obtener info de un grupo

const metadata = await melody.groupMetadata(jid)
console.log('Nombre:', metadata.subject)
console.log('Participantes:', metadata.participants.length)

Mencionar usuarios en un grupo

await melody.sendMessage(jid, {
    text: '@1234567890 ¡Hola!',
    mentions: ['1234567890@s.whatsapp.net']
})

📘 TypeScript — Tipos Personalizados

import makeWASocket, { WASocket, proto } from '@fer2809fl/baileys'

// Tipo para un mensaje con datos del remitente
type MessageWithSender = proto.IWebMessageInfo & {
    senderName?: string
    isGroup?: boolean
}

// Función tipada para procesar mensajes
async function processMessage(
    sock: WASocket,
    msg: MessageWithSender
): Promise<void> {
    const jid = msg.key.remoteJid!
    const text = msg.message?.conversation ?? ''

    if (text === '!tipo') {
        await sock.sendMessage(jid, {
            text: `Tipo de chat: ${msg.isGroup ? 'Grupo' : 'Privado'}`
        })
    }
}

📁 Estructura Recomendada del Proyecto

mi-bot/
├── index.js          # Entrada principal
├── config.js         # Configuración general
├── commands/
│   ├── hola.js
│   ├── ping.js
│   └── stickers.js
├── events/
│   ├── messages.js
│   └── connection.js
├── utils/
│   └── helpers.js
└── session-mymelody/ # Sesión guardada automáticamente

🔗 Links


Desarrollado con 🤍 por Fer2809fl

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors