<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Dev Shubham's Blog]]></title><description><![CDATA[Dev Shubham's Blog]]></description><link>https://blog.shubhambadgujar.com</link><generator>RSS for Node</generator><lastBuildDate>Sun, 17 May 2026 11:16:27 GMT</lastBuildDate><atom:link href="https://blog.shubhambadgujar.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Write your first WhatsApp bot with baileys.js and baileys-bottle]]></title><description><![CDATA[I have been creating WhatsApp bots for fun, and in this blog post, I'd like to 'enlighten' you on how you can set up your bots quickly and without getting stuck as I did at the beginning.

Warn: Not Suitable for production-ready bot development

Requ...]]></description><link>https://blog.shubhambadgujar.com/write-your-first-whatsapp-bot-with-baileysjs-and-baileys-bottle</link><guid isPermaLink="true">https://blog.shubhambadgujar.com/write-your-first-whatsapp-bot-with-baileysjs-and-baileys-bottle</guid><category><![CDATA[whatsapp]]></category><category><![CDATA[whatsapp-api]]></category><category><![CDATA[Node.js]]></category><category><![CDATA[bots]]></category><category><![CDATA[free]]></category><dc:creator><![CDATA[Shubham Badgujar]]></dc:creator><pubDate>Mon, 12 Sep 2022 03:05:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662951228813/rJpJ8F2-R.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I have been creating WhatsApp bots for fun, and in this blog post, I'd like to 'enlighten' you on how you can set up your bots quickly and without getting stuck as I did at the beginning.</p>
<blockquote>
<p>Warn: Not Suitable for production-ready bot development</p>
</blockquote>
<h3 id="heading-requirements">Requirements</h3>
<ul>
<li>Nodejs(only basic)</li>
</ul>
<h3 id="heading-with-these-steps">with these steps</h3>
<ul>
<li>intro</li>
<li>installation</li>
<li>get your hands dirty with code</li>
<li>OwO</li>
</ul>
<h4 id="heading-intro">Intro</h4>
<ul>
<li>Baileys.js</li>
</ul>
<p>Baileys supports interacting with the multi-device &amp; web versions of WhatsApp.</p>
<blockquote>
<p>Baileys does not require Selenium or any other browser to interface with WhatsApp Web, it does so directly using a WebSocket. Not running Selenium or Chromium saves you like half a gig of ram :/</p>
</blockquote>
<ul>
<li>Baileys bottle</li>
</ul>
<p>A little package made by deadlinecode for storing all the data from baileys in whatever database you want to use by using typeorm</p>
<p>TypeORM currently supports:</p>
<ul>
<li>MySQL</li>
<li>MariaDB</li>
<li>Postgres</li>
<li>CockroachDB</li>
<li>SQLite</li>
<li>Microsoft SQL Server</li>
<li>Oracle</li>
<li>SAP Hana</li>
<li>sql.js</li>
</ul>
<blockquote>
<p>ps:  we gonna use SQLite for keeping this simple :)</p>
</blockquote>
<h4 id="heading-installation">Installation</h4>
<ol>
<li>First set up your nodejs project if you haven't yet with ( Run these commands in your terminal/cmd)<pre><code>npm <span class="hljs-keyword">init</span> -y
</code></pre></li>
<li>Install required packages<pre><code><span class="hljs-built_in">npm</span> i @adiwajshing/baileys
</code></pre><pre><code><span class="hljs-built_in">npm</span> i baileys-bottle
</code></pre><pre><code><span class="hljs-built_in">npm</span> i qrcode-terminal
</code></pre></li>
<li>create file app.js</li>
</ol>
<h4 id="heading-coding-and-stuff">Coding and stuff</h4>
<ul>
<li><p>gotta do some importing</p>
<pre><code><span class="hljs-keyword">import</span> <span class="hljs-title">makeWASocket</span>, {
<span class="hljs-title">DisconnectReason</span>,
<span class="hljs-title">fetchLatestBaileysVersion</span>,
} <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"@adiwajshing/baileys"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-title">log</span> <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"@adiwajshing/baileys/lib/Utils/logger"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-title">BaileysBottle</span> <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">".."</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title">Boom</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"@hapi/boom"</span>;
</code></pre></li>
<li><p>setting up datastore</p>
</li>
</ul>
<pre><code>  const logger <span class="hljs-operator">=</span> log.child({});
  logger.level <span class="hljs-operator">=</span> <span class="hljs-string">"silent"</span>;

  const { auth, store } <span class="hljs-operator">=</span> await BaileysBottle({
    <span class="hljs-keyword">type</span>: <span class="hljs-string">"sqlite"</span>,
    database: <span class="hljs-string">"db.sqlite"</span>,
  });

  const { state, saveState } <span class="hljs-operator">=</span> await auth.useAuthHandle();
</code></pre><ul>
<li>and finally</li>
</ul>
<pre><code> const startSocket <span class="hljs-operator">=</span> async () <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> {
    const { version, isLatest } <span class="hljs-operator">=</span> await fetchLatestBaileysVersion();
    console.log(`<span class="hljs-keyword">using</span> <span class="hljs-title">WA</span> <span class="hljs-title">v$</span>{<span class="hljs-title">version</span>.<span class="hljs-title">join</span>(".")}, <span class="hljs-title">isLatest</span>: <span class="hljs-title">$</span>{<span class="hljs-title">isLatest</span>}`);

    const sock <span class="hljs-operator">=</span> makeWASocket({
      version,
      printQRInTerminal: <span class="hljs-literal">true</span>,
      auth: state,
      logger,
    });

    store.bind(sock.ev);

    sock.ev.process(
     async (events) <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> {

      <span class="hljs-comment">//</span>
      <span class="hljs-comment">// Start your bot code here...</span>
      <span class="hljs-comment">//</span>
      <span class="hljs-keyword">if</span>(events[<span class="hljs-string">'messages.upsert'</span>]) {
                const upsert <span class="hljs-operator">=</span> events[<span class="hljs-string">'messages.upsert'</span>];
                console.log(<span class="hljs-string">'recv messages '</span>, JSON.stringify(upsert, undefined, <span class="hljs-number">2</span>));
                <span class="hljs-keyword">if</span>(upsert.type <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-string">'notify'</span>) {
                    <span class="hljs-keyword">for</span>(const <span class="hljs-built_in">msg</span> of upsert.messages) {
                        <span class="hljs-keyword">if</span>(<span class="hljs-operator">!</span><span class="hljs-built_in">msg</span>.key.fromMe) {
              <span class="hljs-comment">// mark message as read</span>
                            await sock<span class="hljs-operator">!</span>.readMessages([<span class="hljs-built_in">msg</span>.key]);
                        }
                    }
                }
            }
      <span class="hljs-comment">//</span>
      <span class="hljs-comment">// End your bot code here...</span>
      <span class="hljs-comment">//</span>

      <span class="hljs-comment">// credentials updated -- save them</span>
            <span class="hljs-keyword">if</span>(events[<span class="hljs-string">'creds.update'</span>]) saveState();


      <span class="hljs-keyword">if</span>(events[<span class="hljs-string">'connection.update'</span>]) {
        const update <span class="hljs-operator">=</span> events[<span class="hljs-string">'connection.update'</span>];
                const { connection, lastDisconnect } <span class="hljs-operator">=</span> update;
        connection <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-string">"open"</span>
        ? console.log(<span class="hljs-string">"Connected"</span>)
        : connection <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-string">"close"</span>
        ? (lastDisconnect?.error <span class="hljs-keyword">as</span> Boom)?.output?.statusCode <span class="hljs-operator">!</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span>
          DisconnectReason.loggedOut
          ? startSocket()
          : console.log(<span class="hljs-string">"Connection closed. You are logged out."</span>)
        : null;
      }
    });
  };

  startSocket();
</code></pre><p>   now run your project ('node app.js'), and you will get QRcode in your terminal now scan it with your WhatsApp and the bot will come to life</p>
<p>now above code only mark the message as read.</p>
<p><a target="_blank" href="https://github.com/adiwajshing/Baileys#sending-messages">you can use these methods for sending replies, as text, media message,s or link preview </a></p>
<h4 id="heading-owo">OwO</h4>
<ul>
<li>bonus</li>
</ul>
<p><a target="_blank" href="https://www.npmjs.com/package/wa-sticker-formatter">use this for creating custom Whatsapp stickers with ur bot</a></p>
<ul>
<li>complete code</li>
</ul>
<pre><code><span class="hljs-keyword">import</span> <span class="hljs-title">makeWASocket</span>, {
  <span class="hljs-title">DisconnectReason</span>,
  <span class="hljs-title">fetchLatestBaileysVersion</span>,
} <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"@adiwajshing/baileys"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-title">log</span> <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"@adiwajshing/baileys/lib/Utils/logger"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-title">BaileysBottle</span> <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">".."</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title">Boom</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"@hapi/boom"</span>;

const main <span class="hljs-operator">=</span> async () <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> {
  const logger <span class="hljs-operator">=</span> log.child({});
  logger.level <span class="hljs-operator">=</span> <span class="hljs-string">"silent"</span>;

  const { auth, store } <span class="hljs-operator">=</span> await BaileysBottle({
    <span class="hljs-keyword">type</span>: <span class="hljs-string">"sqlite"</span>,
    database: <span class="hljs-string">"db.sqlite"</span>,
  });

  const { state, saveState } <span class="hljs-operator">=</span> await auth.useAuthHandle();

  const startSocket <span class="hljs-operator">=</span> async () <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> {
    const { version, isLatest } <span class="hljs-operator">=</span> await fetchLatestBaileysVersion();
    console.log(`<span class="hljs-keyword">using</span> <span class="hljs-title">WA</span> <span class="hljs-title">v$</span>{<span class="hljs-title">version</span>.<span class="hljs-title">join</span>(".")}, <span class="hljs-title">isLatest</span>: <span class="hljs-title">$</span>{<span class="hljs-title">isLatest</span>}`);

    const sock <span class="hljs-operator">=</span> makeWASocket({
      version,
      printQRInTerminal: <span class="hljs-literal">true</span>,
      auth: state,
      logger,
    });

    store.bind(sock.ev);

    sock.ev.process(
     async (events) <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> {

      <span class="hljs-comment">//</span>
      <span class="hljs-comment">// Start your bot code here...</span>
      <span class="hljs-comment">//</span>
      <span class="hljs-keyword">if</span>(events[<span class="hljs-string">'messages.upsert'</span>]) {
                const upsert <span class="hljs-operator">=</span> events[<span class="hljs-string">'messages.upsert'</span>];
                console.log(<span class="hljs-string">'recv messages '</span>, JSON.stringify(upsert, undefined, <span class="hljs-number">2</span>));
                <span class="hljs-keyword">if</span>(upsert.type <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-string">'notify'</span>) {
                    <span class="hljs-keyword">for</span>(const <span class="hljs-built_in">msg</span> of upsert.messages) {
                        <span class="hljs-keyword">if</span>(<span class="hljs-operator">!</span><span class="hljs-built_in">msg</span>.key.fromMe) {
              <span class="hljs-comment">// mark message as read</span>
                            await sock<span class="hljs-operator">!</span>.readMessages([<span class="hljs-built_in">msg</span>.key]);
                        }
                    }
                }
            }
      <span class="hljs-comment">//</span>
      <span class="hljs-comment">// End your bot code here...</span>
      <span class="hljs-comment">//</span>

      <span class="hljs-comment">// credentials updated -- save them</span>
            <span class="hljs-keyword">if</span>(events[<span class="hljs-string">'creds.update'</span>]) saveState();


      <span class="hljs-keyword">if</span>(events[<span class="hljs-string">'connection.update'</span>]) {
        const update <span class="hljs-operator">=</span> events[<span class="hljs-string">'connection.update'</span>];
                const { connection, lastDisconnect } <span class="hljs-operator">=</span> update;
        connection <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-string">"open"</span>
        ? console.log(<span class="hljs-string">"Connected"</span>)
        : connection <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-string">"close"</span>
        ? (lastDisconnect?.error <span class="hljs-keyword">as</span> Boom)?.output?.statusCode <span class="hljs-operator">!</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span>
          DisconnectReason.loggedOut
          ? startSocket()
          : console.log(<span class="hljs-string">"Connection closed. You are logged out."</span>)
        : null;
      }
    });
  };

  startSocket();
};

main();
</code></pre><ul>
<li><a target="_blank" href="https://github.com/deadlinecode/baileys-bottle/blob/master/src/example/example.ts">Cradit: deadlinecode for his example </a></li>
</ul>
<hr />
<p>Have a nice day, Take care :)</p>
]]></content:encoded></item></channel></rss>