<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Soblend</title>
    <description>The latest articles on Forem by Soblend (@soblend).</description>
    <link>https://forem.com/soblend</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3604485%2F19568067-844c-41a2-8d70-86ad4c6d3cef.jpg</url>
      <title>Forem: Soblend</title>
      <link>https://forem.com/soblend</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/soblend"/>
    <language>en</language>
    <item>
      <title>Any tips to make a Node.js WhatsApp bot faste</title>
      <dc:creator>Soblend</dc:creator>
      <pubDate>Thu, 08 Jan 2026 05:29:49 +0000</pubDate>
      <link>https://forem.com/soblend/any-tips-to-make-a-nodejs-whatsapp-bot-faste-2ej9</link>
      <guid>https://forem.com/soblend/any-tips-to-make-a-nodejs-whatsapp-bot-faste-2ej9</guid>
      <description>&lt;p&gt;Hi everyone,&lt;br&gt;
I’m developing a WhatsApp bot using the Baileys library (if you’re familiar with it), and I’m trying to improve its performance.&lt;/p&gt;

&lt;p&gt;Right now, the bot takes around 700–1000 ms per response, and I’d like to reduce that as much as possible.&lt;/p&gt;

&lt;p&gt;Are there any best practices, architectural tips, or optimizations in Node.js / JavaScript that could help make it faster?&lt;/p&gt;

&lt;p&gt;Any advice is appreciated. Thanks!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>devops</category>
      <category>node</category>
    </item>
    <item>
      <title>Kaoruko Waguri-MD</title>
      <dc:creator>Soblend</dc:creator>
      <pubDate>Sat, 06 Dec 2025 05:38:57 +0000</pubDate>
      <link>https://forem.com/soblend/kaoruko-waguri-md-3khi</link>
      <guid>https://forem.com/soblend/kaoruko-waguri-md-3khi</guid>
      <description>&lt;p&gt;Cree un bot de whatsapp que es multifuncion, y pues este incluye sistemas de economia, RPG, administracion, y comandos utiles y muchos otros mas, este bot es nuevo pero les garantizo una buena velocidad :)&lt;/p&gt;

&lt;p&gt;Sigueme en mi canal y podras encontrar el numero del bot y añadirlo a tus grupos: &lt;a href="https://www.whatsapp.com/channel/0029VbB9SA10rGiQvM2DMi2p" rel="noopener noreferrer"&gt;https://www.whatsapp.com/channel/0029VbB9SA10rGiQvM2DMi2p&lt;/a&gt;&lt;/p&gt;

</description>
      <category>whatsapp</category>
      <category>bot</category>
      <category>baileys</category>
      <category>whatsappbot</category>
    </item>
    <item>
      <title>@soblend/baileys 1.0.4</title>
      <dc:creator>Soblend</dc:creator>
      <pubDate>Sun, 16 Nov 2025 03:21:33 +0000</pubDate>
      <link>https://forem.com/soblend/soblendbaileys-104-3lpe</link>
      <guid>https://forem.com/soblend/soblendbaileys-104-3lpe</guid>
      <description>&lt;p&gt;Queria decirles sobre mi nuevo proyecto, este es un mod de baileys que les puede servir bastante para bots de whatsapp, muchos diran que otro es mejor o el original es mejor, pero ¿Porque no darle una oportunidad a algo nuevo? no creen que quizas les guste mucho mas,  o de pronto les sea mas util. 🤗&lt;/p&gt;

&lt;p&gt;En este post no lo dire todo ya que es demasiado largo, pero te dejo aqui los enlaces de los repositorios y de npmjs.com para que puedas leerlo completamente:&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/nekyb/baileys" rel="noopener noreferrer"&gt;Click Aqui&lt;/a&gt;&lt;br&gt;
NPMJS: &lt;a href="https://www.npmjs.com/package/@soblend/baileys" rel="noopener noreferrer"&gt;Clicl Aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instalación&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opción 1: NPM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install @soblend/baileys&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opción 2: Yarn&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn add @soblend/baileys&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opción 3: PNPM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pnpm add @soblend/baileys&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo Basico&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;`import { SoblendBaileys } from '&lt;a class="mentioned-user" href="https://dev.to/soblend"&gt;@soblend&lt;/a&gt;/baileys';&lt;/p&gt;

&lt;p&gt;async function main() {&lt;br&gt;
  // Crear instancia con configuración básica&lt;br&gt;
  const soblend = new SoblendBaileys({&lt;br&gt;
    printQRInTerminal: true,  // Mostrar QR en consola&lt;br&gt;
    enableCache: true,         // Activar caché inteligente&lt;br&gt;
    logLevel: 'info',          // Nivel de logs&lt;br&gt;
  });&lt;/p&gt;

&lt;p&gt;// Conectar&lt;br&gt;
  const socket = await soblend.connect('auth_session');&lt;/p&gt;

&lt;p&gt;console.log('✅ ¡Conectado a WhatsApp!');&lt;/p&gt;

&lt;p&gt;// Escuchar mensajes&lt;br&gt;
  socket.ev.on('messages.upsert', async ({ messages }) =&amp;gt; {&lt;br&gt;
    const msg = messages[0];&lt;br&gt;
    if (!msg.message || msg.key.fromMe) return;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const text = msg.message.conversation || '';
const from = msg.key.remoteJid;

// Responder a "hola"
if (text.toLowerCase() === 'hola') {
  await socket.sendMessage(from, { text: '¡Hola! 👋' });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;});&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;main();`&lt;/p&gt;

&lt;p&gt;Ejemplo 2: Bot con Base de datos y sistema de niveles&lt;/p&gt;

&lt;p&gt;`import { SoblendBaileys, SoblendStorage } from '&lt;a class="mentioned-user" href="https://dev.to/soblend"&gt;@soblend&lt;/a&gt;/baileys';&lt;/p&gt;

&lt;p&gt;async function main() {&lt;br&gt;
  const storage = new SoblendStorage('./database', true, 'password');&lt;br&gt;
  await storage.initialize();&lt;/p&gt;

&lt;p&gt;const soblend = new SoblendBaileys({ printQRInTerminal: true });&lt;br&gt;
  const socket = await soblend.connect('session');&lt;/p&gt;

&lt;p&gt;socket.ev.on('messages.upsert', async ({ messages }) =&amp;gt; {&lt;br&gt;
    const msg = messages[0];&lt;br&gt;
    if (!msg.message || msg.key.fromMe) return;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const sender = msg.key.participant || msg.key.remoteJid;
const from = msg.key.remoteJid;

// Registrar usuario si no existe
let user = storage.getUser(sender);
if (!user) {
  await storage.saveUser({
    jid: sender,
    name: msg.pushName || 'Usuario',
    messageCount: 0,
    firstSeen: Date.now(),
    lastSeen: Date.now(),
    isBlocked: false,
    isBanned: false,
    level: 1,
    points: 0
  });
  user = storage.getUser(sender);
}

// Incrementar contador y puntos
await storage.updateUser(sender, {
  messageCount: user.messageCount + 1,
  lastSeen: Date.now()
});
await storage.incrementUserLevel(sender, 10);  // +10 puntos por mensaje

const text = msg.message.conversation || '';

// Comando: !level
if (text === '!level') {
  const updatedUser = storage.getUser(sender);
  await socket.sendMessage(from, {
    text: `👤 Tu Perfil:\n` +
          `Nivel: ${updatedUser.level}\n` +
          `Puntos: ${updatedUser.points}\n` +
          `Mensajes: ${updatedUser.messageCount}`
  });
}

// Comando: !top
if (text === '!top') {
  const topUsers = await storage.getTopUsers(5);
  let leaderboard = '🏆 Top 5 Usuarios:\n\n';
  topUsers.forEach((u, i) =&amp;gt; {
    leaderboard += `${i + 1}. ${u.name}\n`;
    leaderboard += `   Nivel ${u.level} - ${u.points} puntos\n\n`;
  });
  await socket.sendMessage(from, { text: leaderboard });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;});&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;main();`&lt;/p&gt;

&lt;p&gt;Ejemplo 3: Sistema de administración&lt;/p&gt;

&lt;p&gt;`import { SoblendBaileys, GroupAdminManager } from '&lt;a class="mentioned-user" href="https://dev.to/soblend"&gt;@soblend&lt;/a&gt;/baileys';&lt;/p&gt;

&lt;p&gt;async function main() {&lt;br&gt;
  const soblend = new SoblendBaileys({ printQRInTerminal: true });&lt;br&gt;
  const socket = await soblend.connect('session');&lt;br&gt;
  const groupManager = new GroupAdminManager(socket);&lt;/p&gt;

&lt;p&gt;// Configurar reglas anti-spam y anti-link&lt;br&gt;
  const GROUP_ID = '&lt;a href="mailto:GROUP_ID@g.us"&gt;GROUP_ID@g.us&lt;/a&gt;';&lt;/p&gt;

&lt;p&gt;groupManager.addRule(GROUP_ID, {&lt;br&gt;
    id: 'no-links',&lt;br&gt;
    type: 'anti-link',&lt;br&gt;
    enabled: true,&lt;br&gt;
    action: 'kick',&lt;br&gt;
    message: '❌ Enlaces prohibidos'&lt;br&gt;
  });&lt;/p&gt;

&lt;p&gt;groupManager.addRule(GROUP_ID, {&lt;br&gt;
    id: 'no-spam',&lt;br&gt;
    type: 'anti-spam',&lt;br&gt;
    enabled: true,&lt;br&gt;
    action: 'mute'&lt;br&gt;
  });&lt;/p&gt;

&lt;p&gt;// Mensaje de bienvenida personalizado&lt;br&gt;
  groupManager.setWelcomeMessage(GROUP_ID, {&lt;br&gt;
    enabled: true,&lt;br&gt;
    text: '¡Hola {user}! 👋\nBienvenido a {group}\n\n📋 Reglas:\n1. No spam\n2. No enlaces\n3. Respeto mutuo',&lt;br&gt;
    buttons: true&lt;br&gt;
  });&lt;/p&gt;

&lt;p&gt;socket.ev.on('messages.upsert', async ({ messages }) =&amp;gt; {&lt;br&gt;
    const msg = messages[0];&lt;br&gt;
    if (!msg.message || msg.key.fromMe) return;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const text = msg.message.conversation || '';
const from = msg.key.remoteJid;
const sender = msg.key.participant || msg.key.remoteJid;

// Verificar reglas
if (from.endsWith('@g.us')) {
  const allowed = await groupManager.checkRules(from, sender, text);
  if (!allowed) return;  // Mensaje bloqueado por reglas
}

// Comando: !admin (mostrar panel)
if (text === '!admin' &amp;amp;&amp;amp; from.endsWith('@g.us')) {
  const isAdmin = await groupManager.isAdmin(from, sender);
  if (isAdmin) {
    await groupManager.sendAdminPanel(from, sender);
  }
}

// Comando: !kick @usuario
if (text.startsWith('!kick') &amp;amp;&amp;amp; from.endsWith('@g.us')) {
  const isAdmin = await groupManager.isAdmin(from, sender);
  if (!isAdmin) return;

  const mentioned = msg.message.extendedTextMessage?.contextInfo?.mentionedJid;
  if (mentioned &amp;amp;&amp;amp; mentioned.length &amp;gt; 0) {
    await groupManager.removeParticipants(from, mentioned);
    await socket.sendMessage(from, { text: '✅ Usuarios eliminados' });
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;});&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;main();`&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solucion De Problemas (Comunes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Problema: QR Code no aparece&lt;br&gt;
Solución:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const soblend = new SoblendBaileys({&lt;br&gt;
  printQRInTerminal: true,  // Asegúrate de que esté en true&lt;br&gt;
  logLevel: 'debug'          // Activa logs detallados&lt;br&gt;
});&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Problema: Reconexión lenta&lt;br&gt;
Solución:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const soblend = new SoblendBaileys({&lt;br&gt;
  autoReconnect: true,&lt;br&gt;
  reconnectDelay: 1500,      // Reducir delay inicial&lt;br&gt;
  maxReconnectAttempts: 20   // Aumentar intentos&lt;br&gt;
});&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Problema: Alto uso de memoria&lt;br&gt;
Solución:&lt;/p&gt;

&lt;p&gt;`const soblend = new SoblendBaileys({&lt;br&gt;
  enableCache: true,&lt;br&gt;
  cacheMaxSize: 5000,  // Reducir tamaño del caché&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// Limpiar caché periódicamente&lt;br&gt;
setInterval(() =&amp;gt; {&lt;br&gt;
  soblend.getCache().clear();&lt;br&gt;
}, 3600000);  // Cada hora`&lt;/p&gt;

&lt;p&gt;Problema: Botones no funcionan&lt;br&gt;
Solución: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;await socket.sendInteractiveButtons(jid, {&lt;br&gt;
  text: 'Elige una opción',&lt;br&gt;
  footer: 'Powered by Soblend',&lt;br&gt;
  buttons: [&lt;br&gt;
    {&lt;br&gt;
      buttonId: 'id1',&lt;br&gt;
      buttonText: { displayText: 'Opción 1' },&lt;br&gt;
      type: 1&lt;br&gt;
    }&lt;br&gt;
  ]&lt;br&gt;
});&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;[ NOTA ] Recientemente se encontro un error en los botones, esto se estara corrijiendo en la siguiente version junto con la integración de carouseles.&lt;/p&gt;

</description>
      <category>node</category>
      <category>automation</category>
      <category>typescript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>@soblend/scraper</title>
      <dc:creator>Soblend</dc:creator>
      <pubDate>Mon, 10 Nov 2025 19:18:18 +0000</pubDate>
      <link>https://forem.com/soblend/soblendscraper-b0a</link>
      <guid>https://forem.com/soblend/soblendscraper-b0a</guid>
      <description>&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/soblend"&gt;@soblend&lt;/a&gt;/scraper is a comprehensive collection of 13 robust and verified scrapers designed to extract data from various web sources. Each scraper is optimized for its specific use case, includes robust error handling, automatic retries, and a consistent API.&lt;/p&gt;

&lt;p&gt;The library is built with a modular architecture, allowing you to import only the scrapers you need, reducing bundle size and improving your application's performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instalation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install @soblend/scraper&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick Start&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;`import { MetaDataFinder, CryptoPriceWatcher } from '&lt;a class="mentioned-user" href="https://dev.to/soblend"&gt;@soblend&lt;/a&gt;/scraper';&lt;/p&gt;

&lt;p&gt;const metaFinder = new MetaDataFinder();&lt;br&gt;
const metadata = await metaFinder.scrape('&lt;a href="https://example.com'" rel="noopener noreferrer"&gt;https://example.com'&lt;/a&gt;);&lt;br&gt;
console.log(metadata.metadata.basic.title);&lt;br&gt;
const crypto = new CryptoPriceWatcher();&lt;br&gt;
const top10 = await crypto.getTopCryptos(10);&lt;br&gt;
console.log(top10.cryptos);`&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Available Scrapers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ImageCollector&lt;/p&gt;

&lt;p&gt;A specialized scraper for downloading images from web pages with filtering capabilities by dimensions and format.&lt;/p&gt;

&lt;p&gt;Use Cases:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Creating datasets for training AI models&lt;br&gt;
Bulk downloading of wallpapers and images&lt;br&gt;
Archiving web galleries&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Configuration options:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
timeout: 10000, // Maximum wait time per request (ms)&lt;br&gt;
maxImages: 100, // Maximum number of images to extract&lt;br&gt;
minWidth: 0, // Minimum width in pixels&lt;br&gt;
minHeight: 0, // Minimum height in pixels&lt;br&gt;
formats: ['.jpg', '.png'], // Accepted image formats&lt;br&gt;
userAgent: 'custom-agent', // Custom user agent&lt;br&gt;
retries: 3, // Number of retries in case of failure&lt;br&gt;
downloadPath: './images' // Download path&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You can read more about this library in our official repository: &lt;a href="https://github.com/Soblend-Development/-soblend-scraper" rel="noopener noreferrer"&gt;https://github.com/Soblend-Development/-soblend-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don't forget to give the repository a star and follow us =)&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
