<?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: Arpit Vasani</title>
    <description>The latest articles on Forem by Arpit Vasani (@arpitvasani).</description>
    <link>https://forem.com/arpitvasani</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%2F156845%2F616f3e46-4da7-416b-8a31-79e4a516edfc.jpg</url>
      <title>Forem: Arpit Vasani</title>
      <link>https://forem.com/arpitvasani</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/arpitvasani"/>
    <language>en</language>
    <item>
      <title>How to connect Whatsapp with google sheets?</title>
      <dc:creator>Arpit Vasani</dc:creator>
      <pubDate>Sat, 05 Mar 2022 08:49:39 +0000</pubDate>
      <link>https://forem.com/arpitvasani/how-to-connect-whatsapp-with-google-sheets-1a2i</link>
      <guid>https://forem.com/arpitvasani/how-to-connect-whatsapp-with-google-sheets-1a2i</guid>
      <description>&lt;h2&gt;
  
  
  Table Of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Background&lt;/li&gt;
&lt;li&gt;Problem&lt;/li&gt;
&lt;li&gt;Solution&lt;/li&gt;
&lt;li&gt;Why?&lt;/li&gt;
&lt;li&gt;Limitations&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.toconclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;Few years ago I made a simple solution to my problem which was involving WhatsApp. you can read about it from this &lt;a href="https://dev.to/arpitvasani/how-i-created-whatsapp-bot-to-talk-with-my-friends-h92"&gt;post&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/arpitvasani" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F156845%2F616f3e46-4da7-416b-8a31-79e4a516edfc.jpg" alt="arpitvasani"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/arpitvasani/how-i-created-whatsapp-bot-to-talk-with-my-friends-h92" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How I Created Whatsapp bot to talk with my friends?  &lt;/h2&gt;
      &lt;h3&gt;Arpit Vasani ・ Aug 8 '19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#whatsapp&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#bot&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webautomation&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#puppeteer&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
 Since making this people have been using this to solve their various personal or business problem. Also, People have been asking for several features one of which being making this messages dynamic as per their google sheet. 

&lt;p&gt;So, in this article, I will share how you can connect your WhatsApp account with google sheet and reply to your customers/contact as per the information in the sheet for free. We will not be using any subscription or paid service for this. This guide has been made keeping technical(developers) and non-technical people in mind.&lt;/p&gt;
&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;Using bot.json, Wbot provides keyword-based rules such as if an incoming message has certain keywords, it will respond by an equivalent message written using that rule. There are image-based rules as well.&lt;/p&gt;

&lt;p&gt;The problem is, in a business case you might want to serve your customer with unique messages. Something like following &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzt7zkj80gkbt1mnardm4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzt7zkj80gkbt1mnardm4.png" alt="whatsapp screenshot" width="360" height="274"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;As you can see, this generic message won’t help because the value $240 in this message is dynamic (something which changes customer to customer). We can't set this from &lt;code&gt;bot.json&lt;/code&gt; because it applies to everyone, not just one customer. &lt;/p&gt;
&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ccc2f1uubphcfun5m8q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ccc2f1uubphcfun5m8q.jpg" alt="webhooks to the rescue meme with baby yoda grogu" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wbot provides a feature called webhook. It can be used in this use case. What is a webhook? It is a simple network request which can be used as an event. What it does is every time WBOT gets a message it will call an URL which we set in webhook property in &lt;code&gt;bot.json&lt;/code&gt; file. So, for every message, we will be notified. In this URL, we can write our custom code in any language, and it doesn't have to be code-based. It can be any URL that you have control of what is incoming.&lt;/p&gt;

&lt;p&gt;Google has this service called &lt;a href="https://www.google.com/script/start/" rel="noopener noreferrer"&gt;Google app script&lt;/a&gt; which lets you code on top of google sheet or any other google product per se. So, We can make our own webhook. &lt;/p&gt;

&lt;p&gt;Here is what solution looks like&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh941kkwq7lpyxulur3wi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh941kkwq7lpyxulur3wi.png" alt="solution diagram" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a blank google sheet or open an existing one&lt;/li&gt;
&lt;li&gt;For this example, we will keep it simple as following 
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vrs2udau2nydzod6z1o.png" alt="sample google sheet image" width="500" height="267"&gt;
column C is something that we will send to the user. You can use any formula you like in there. In the end, whatever text is in this cell will be sent to the user.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next, we are going to create a web app using this data. So go to extensions &amp;gt; AppScript. You should see something like following&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zaa9kxzg20asxpt8pim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zaa9kxzg20asxpt8pim.png" alt="google app script screenshot" width="786" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I have updated the name of the project for organization and simplicity. It might be an untitled project in your case. You can update it by clicking on it.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select all and remove those two lines of code and put the following in&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SHEET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR-SHEET-ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;doPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="c1"&gt;//fetching values which we are getting from wbot&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;postData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;customerMobile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@c.us&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// setting up response with default value&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;😢 No order found!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}]&lt;/span&gt;

  &lt;span class="c1"&gt;//getting the reference of the sheer&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SpreadsheetApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;openById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SHEET&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;getActiveSheet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="c1"&gt;//getting current data from sheet&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDataRange&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;getValues&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;//find phone number in sheet&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Logger.log(data[i][0], customerMobile)&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;customerMobile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;//[0] because column A&lt;/span&gt;
      &lt;span class="nx"&gt;Logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Match&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Return result of operation&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ContentService&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createTextOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setMimeType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ContentService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MimeType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;There is this small thing which you need to change in 1st line of code where it says &lt;code&gt;YOUR-SHEET-ID&lt;/code&gt; take the URL of the sheet and take the following part from it without &lt;code&gt;/&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08yem1y8gic83uwas47l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08yem1y8gic83uwas47l.png" alt="screenshot of google sheets url" width="774" height="47"&gt;&lt;/a&gt;&lt;br&gt;
put/paste this between quotes &lt;code&gt;'&lt;/code&gt; in code. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It is time for deployment. Click on Deploy &amp;gt; New Deployment. In Select Type &amp;gt; choose Web app. Setup things as follows&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp4ao0upsijgc9lfxpni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp4ao0upsijgc9lfxpni.png" alt="Google app script new deployment page" width="769" height="607"&gt;&lt;/a&gt;&lt;br&gt;
click deploy. You should see something like following &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fry1s38jcsiss66pnehiv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fry1s38jcsiss66pnehiv.png" alt="Google app script authorize screen" width="774" height="609"&gt;&lt;/a&gt;&lt;br&gt;
Click on Authorize access. It will open a popup as following. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw6j7olsztxy15qw4lun3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw6j7olsztxy15qw4lun3.png" alt="Authorization window" width="650" height="784"&gt;&lt;/a&gt;&lt;br&gt;
 This will give our code permission to read the sheet whenever needed. Wait for a few seconds while google deploys our code. Once done you should see something like the following.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbt0b8kbta6hpj9x3vnru.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbt0b8kbta6hpj9x3vnru.png" alt="deployment successful" width="551" height="247"&gt;&lt;/a&gt;&lt;br&gt;
Copy the URL. We will use it as webhook in bot.json. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open &lt;code&gt;bot.json&lt;/code&gt; from wbot and create a new block in bot Array (section) with the following&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"contains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"bill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"order"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"exact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"webhook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://script.google.com/macros/s/AKfycby8cwEumo.../exec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"response"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"okay. Checking"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"afterSeconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;do make sure that the JSON is valid. You can use &lt;a href="https://jsonlint.com/" rel="noopener noreferrer"&gt;https://jsonlint.com/&lt;/a&gt; to check that. &lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;That's it, Start the wbot and test your changes.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fin37hcjpn1omjfkobk99.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fin37hcjpn1omjfkobk99.gif" alt="man throwing confetti gif" width="429" height="350"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why?
&lt;/h2&gt;

&lt;p&gt;You must be wondering why this solution instead of some third-party integration?&lt;/p&gt;

&lt;p&gt;The answer is Freedom.&lt;/p&gt;

&lt;p&gt;There are a lot of strings attached when we use third-party tools. As a small business ideally, you should be able to solve your business problem without worrying about subscription, compliance, compatibility, data protection, etc. hassles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Google has some limits on how many times you can call their services during the day. This may vary for account type and region. Do keep an eye on executions from this page &lt;a href="https://script.google.com/home/executions" rel="noopener noreferrer"&gt;https://script.google.com/home/executions&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Most of the problems for small businesses can be solved using minimum code or with low code tools without paying huge monthly subscription charges.&lt;/p&gt;

</description>
      <category>whatsapp</category>
      <category>googlesheets</category>
      <category>integration</category>
      <category>howto</category>
    </item>
    <item>
      <title>Can we automate code-review? Yes we can</title>
      <dc:creator>Arpit Vasani</dc:creator>
      <pubDate>Mon, 23 Sep 2019 11:33:17 +0000</pubDate>
      <link>https://forem.com/arpitvasani/can-we-automate-code-review-yes-we-can-3kaf</link>
      <guid>https://forem.com/arpitvasani/can-we-automate-code-review-yes-we-can-3kaf</guid>
      <description>&lt;h2&gt;
  
  
  Index
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.towhat-is-codereview"&gt;What is code-review?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.towhy-would-i-want-to-automate-it"&gt;Why do I want to automate it?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.tohow-can-i-automate-it"&gt;How can I automate it?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  What is code-review?
&lt;/h1&gt;

&lt;p&gt;After you submit a pull request then there will be someone from the senior development team who will review(or maybe test) your code before merging it to development or master branch.&lt;/p&gt;

&lt;p&gt;Code review helps us identify the wrongs before it gets to master code base or get published to a production site. It could be programming-wise or business logic wise. For programming related mistakes there are tools using which one can enforce best practices and for the other, we need to have a person who has an understanding about the flow of the system. The last one can't be automated(at the moment).&lt;/p&gt;

&lt;h1&gt;
  
  
  Why would you want to automate it?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fksairxo42i0sypptu40z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fksairxo42i0sypptu40z.jpg" alt="I'll replace you with AI meme"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are lots of reason to automate your tasks. Like following. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More free time on work 😉&lt;/li&gt;
&lt;li&gt;It will give you time to focus on more concerning problems&lt;/li&gt;
&lt;li&gt;Higher accuracy than human &lt;/li&gt;
&lt;li&gt;It's a Reliable system to prevent the buggy code to reach production &lt;/li&gt;
&lt;li&gt;...and much more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not like we are completely removing human intervention in the code review process. In fact, Technology will play helping hand in this review process for a senior developer(or a code reviewer).&lt;/p&gt;

&lt;h1&gt;
  
  
  How can you automate it?
&lt;/h1&gt;

&lt;p&gt;In this tutorial, We will be using &lt;a href="https://www.sonarqube.org/" rel="noopener noreferrer"&gt;sonarqube&lt;/a&gt;. Sonarcube is code quality checker which can be hosted on-premise it also has an inbuilt web interface to show the bugs and code sniffs. Sonarqube is an on-premise version which you can download and install on a machine on LAN. on top of that there is a community edition of sonarqube which is free and open source. yay!!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sonarcloud.io" rel="noopener noreferrer"&gt;Sonarcloud&lt;/a&gt; is the cloud version of the same service and it's free for public repo so we are going to use that. &lt;/p&gt;

&lt;p&gt;For the demo purposes, I will be using this repo &lt;a href="https://github.com/vasani-arpit/sonarcloud-tutorial" rel="noopener noreferrer"&gt;https://github.com/vasani-arpit/sonarcloud-tutorial&lt;/a&gt; which has some intentional mistakes. &lt;/p&gt;

&lt;h3&gt;
  
  
  Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://sonarcloud.io/about" rel="noopener noreferrer"&gt;sonarcloud&lt;/a&gt; and sign in with Github&lt;/li&gt;
&lt;li&gt;after authentication is done, click on ➕ on the top and select analyze new project&lt;/li&gt;
&lt;li&gt;Next, Import your GitHub repo using "Choose an organization on Github button"&lt;/li&gt;
&lt;li&gt;Click on "Bind to an existing SonarCloud organization" and then "Bind Organization" button&lt;/li&gt;
&lt;li&gt;Select/check the repo you want to analyze from the list and click on set up&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now go back to your repo and add a file at root level as following and save it as &lt;strong&gt;.sonarcloud.properties&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Path to sources
sonar.sources=.
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;push your commit. Sonar cloud will automatically pick up your code and start analyzing the repo. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;once the analysis is complete you should see something like following&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fqgfqns8qrj2pl461fq7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fqgfqns8qrj2pl461fq7s.png" alt="sonar could overview image"&gt;&lt;/a&gt; It is a public project. you can see it on &lt;a href="https://sonarcloud.io/dashboard?id=vasani-arpit_sonarcloud-tutorial" rel="noopener noreferrer"&gt;https://sonarcloud.io/dashboard?id=vasani-arpit_sonarcloud-tutorial&lt;/a&gt; as well.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It says there is one bug let's see what that is. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F76rmlh8t9f7fh09hq9yv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F76rmlh8t9f7fh09hq9yv.png" alt="sonar cloud bug overview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;as you can see &lt;code&gt;if&lt;/code&gt; and &lt;code&gt;else&lt;/code&gt; block of the code is the same so sonar suggesting me to remove the condition because there is no point in having it. It also tells how much time it will take to resolve this bug. So, Next time when you have an existing project to refactor then pass it through sonarcloud and tell exact efforts needed for reactor so your PM won't ask you every day for the update. 😜 &lt;/p&gt;

&lt;p&gt;Now, This is something my IDE/compiler won't catch because it only checks for the syntax. &lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;by Partially automating the code-review task you can have better results which human eye can miss. If you like pair-programming then sonarqube/sonarcloud can be your pair-reviewer. 😀 &lt;/p&gt;

&lt;p&gt;On a serious note, If you are in domain/organization in which you can't put your code on the cloud then you can setup sonarqube (instead of sonarcloud) on your local machine and automate your PR reviews.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>coding</category>
      <category>codereview</category>
    </item>
    <item>
      <title>How I Created Whatsapp bot to talk with my friends?  </title>
      <dc:creator>Arpit Vasani</dc:creator>
      <pubDate>Thu, 08 Aug 2019 08:58:46 +0000</pubDate>
      <link>https://forem.com/arpitvasani/how-i-created-whatsapp-bot-to-talk-with-my-friends-h92</link>
      <guid>https://forem.com/arpitvasani/how-i-created-whatsapp-bot-to-talk-with-my-friends-h92</guid>
      <description>&lt;h1&gt;
  
  
  Index
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;🤔 Why?&lt;/li&gt;
&lt;li&gt;
🤨 How?

&lt;ul&gt;
&lt;li&gt;How did I got inspired?&lt;/li&gt;
&lt;li&gt;How did I do it?&lt;/li&gt;
&lt;li&gt;Enough show me the code&lt;/li&gt;
&lt;li&gt;Final results&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;✌ Conclusion&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  🤔 Why?
&lt;/h3&gt;

&lt;p&gt;The title seems kinda rude and lazy. Right? But if you think about the situation I am in then you'll understand. Here in India it's important to be socially active than being alive. If you don't reply or send a few &lt;em&gt;"good morning"&lt;/em&gt; messages in a few groups, People would think you are actually dead. and taunt you for being busy and not spending time with them.😤&lt;/p&gt;

&lt;p&gt;Now, the thing with me and social media is, I want to use it on my time not when they send me a notification. So, there are situations Where I reply to a post after 4-5 days and by that time my reply would not matter, as that moment would have been gone. Let's consider about posting. For example birthdays anniversaries etc... But the thing is I don't want to be that guy who replies after 4-5 days. We all have 24 hours and I try my best to allocate it to all the things and priorities I have at my disposal. I'd get disappointed if someone replies to me after a week so I don't want to be that guy for them. &lt;/p&gt;

&lt;p&gt;So, I have come up with my programming skills to solve/automate this scenario which will save my screen time.🤩&lt;/p&gt;

&lt;h3&gt;
  
  
  🤨 How?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  How did I got inspired?
&lt;/h4&gt;

&lt;p&gt;I was looking to do an automation on the web and just like Google's top result, Selenium popped up in my mind but, as a JavaScript enthusiast, I choose JS as my ally. As an matter of fact, I found  few modules in npm for Selenium but wasn't really impressed by that😐. &lt;/p&gt;

&lt;p&gt;While searching for that I stumbled upon &lt;a href="https://www.youtube.com/watch?v=lhZOFUY1weo" rel="noopener noreferrer"&gt;this video&lt;/a&gt; from google IO 2018 and then &lt;a href="https://www.youtube.com/watch?v=VDGiQ2cwFP4&amp;amp;feature=youtu.be&amp;amp;t=500" rel="noopener noreferrer"&gt;this one&lt;/a&gt; which got me thinking like &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/BmmfETghGOPrW/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/BmmfETghGOPrW/giphy.gif" alt="this"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How I did it?
&lt;/h4&gt;

&lt;p&gt;First, I learned about a few tricks from this post&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/hardkoded" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F7781%2F2198466.jpeg" alt="hardkoded"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/hardkoded/creating-a-whatsapp-bot-with-puppeteer-sharp-16f2" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Creating a WhatsApp bot with Puppeteer-Sharp&lt;/h2&gt;
      &lt;h3&gt;Darío Kondratiuk ・ Apr 12 '19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#csharp&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#puppeteersharp&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
then, I realized that relying on DOM is not a good idea🤨. What if classes or selectors I have used got updated in the page🤔? So I decided not to use DOM. (But I ended up using it any way for other feature🤷‍♂️. Will write about it in another post. Stay Tuned.......😎)

&lt;p&gt;Just like a production issue solved before the deadline😏, I found one repo which gives programmable access to the WhatsApp which works the same way as I want it.&lt;/p&gt;
&lt;h4&gt;
  
  
  Enough show me the code
&lt;/h4&gt;

&lt;p&gt;Here are the overall steps and gist. I have added a link to the repo as well.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First I created a puppeteer browser window and opened Whatsapp like this&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F4s02h7ha9fw1r1wf7ke9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F4s02h7ha9fw1r1wf7ke9.png" alt="code screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Then, I created a json file to manage messages and it's equivalent reply and also to add some configs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fa0wbjm0p3gjujrj1n86h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fa0wbjm0p3gjujrj1n86h.png" alt="code screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Next, I added a function inside &lt;code&gt;inject.js&lt;/code&gt; which would be called every time I get a new message&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Furz4ixk1iud6siyczx5o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Furz4ixk1iud6siyczx5o.png" alt="code screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Final results
&lt;/h4&gt;

&lt;p&gt;With the few garnishing with libraries like &lt;a href="https://www.npmjs.com/package/ora" rel="noopener noreferrer"&gt;Ora&lt;/a&gt;, &lt;a href="https://www.npmjs.com/package/cli-progress" rel="noopener noreferrer"&gt;Cli-progress&lt;/a&gt; and &lt;a href="https://www.npmjs.com/package/qrcode-terminal" rel="noopener noreferrer"&gt;qrcode-terminal&lt;/a&gt; on the top &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l4Jz3a8jO92crUlWM/giphy-tumblr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l4Jz3a8jO92crUlWM/giphy-tumblr.gif" alt="Garnishing giphy meme"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I got this&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fal5vwx3nso5pfhod3n0r.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fal5vwx3nso5pfhod3n0r.gif" alt="preview of wbot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the full code&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/vasani-arpit" rel="noopener noreferrer"&gt;
        vasani-arpit
      &lt;/a&gt; / &lt;a href="https://github.com/vasani-arpit/WBOT" rel="noopener noreferrer"&gt;
        WBOT
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A simple Web based BOT for WhatsApp™ in NodeJS 😜. Working as of 📅 Feb 4th, 2024
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;WBOT&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://www.patreon.com/arpit_vasani" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F6497827%2F53698102-4af3f400-3dfe-11e9-9749-4104ceb6ea3c.png" alt="Support me on Patreon"&gt;&lt;/a&gt; &lt;a href="https://amzn.in/iCUjhKZ" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F6497827%2F53698105-51826b80-3dfe-11e9-9e63-b14ad6ad7c19.png" alt="Buy me a book"&gt;&lt;/a&gt; &lt;a href="https://www.paypal.me/arpitvasani" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F6497827%2F53698092-42032280-3dfe-11e9-8054-1597c62d344e.png" alt="PayPal"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A simple Nodejs BOT for whatsapp web&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/vasani-arpit/WBOT#-preview" rel="noopener noreferrer"&gt;Preview&lt;/a&gt; •
&lt;a href="https://github.com/vasani-arpit/WBOT#-features" rel="noopener noreferrer"&gt;Features&lt;/a&gt; •
&lt;a href="https://github.com/vasani-arpit/WBOT#-downloads-" rel="noopener noreferrer"&gt;Downloads&lt;/a&gt; •
&lt;a href="https://github.com/vasani-arpit/WBOT#how-to-start-the-bot" rel="noopener noreferrer"&gt;How to?&lt;/a&gt; •
&lt;a href="https://github.com/vasani-arpit/WBOT#-technologies" rel="noopener noreferrer"&gt;Technologies Used&lt;/a&gt; •
&lt;a href="https://github.com/vasani-arpit/WBOT#why" rel="noopener noreferrer"&gt;Why?&lt;/a&gt; •
&lt;a href="https://github.com/vasani-arpit/WBOT#goals" rel="noopener noreferrer"&gt;Goals&lt;/a&gt; •
&lt;a href="https://github.com/vasani-arpit/WBOT#deploy" rel="noopener noreferrer"&gt;deploy&lt;/a&gt; •
&lt;a href="https://github.com/vasani-arpit/WBOT#faq" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🔍 Preview&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Quick preview&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/6497827/58411958-1dcc8000-8093-11e9-8aeb-5747efe10266.gif"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F6497827%2F58411958-1dcc8000-8093-11e9-8aeb-5747efe10266.gif" alt="Screenshot gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;⚡ Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;🎨 Highly customizable json&lt;/li&gt;
&lt;li&gt;💯 Totally Free for personal use&lt;/li&gt;
&lt;li&gt;🔒 Complete Privacy. Your data stays with you always&lt;/li&gt;
&lt;li&gt;💻 Download media files automatically&lt;/li&gt;
&lt;li&gt;👥 Multiple instances&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;⬇ Downloads ⬇&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;macOS&lt;/th&gt;
&lt;th&gt;Windows&lt;/th&gt;
&lt;th&gt;Linux&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/vasani-arpit/WBOT/releases/latest/download/WBOT-mac.zip" rel="noopener noreferrer"&gt;Download Latest Release&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/vasani-arpit/WBOT/releases/latest/download/WBOT-win.zip" rel="noopener noreferrer"&gt;Download Latest Release&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/vasani-arpit/WBOT/releases/latest/download/WBOT-linux.zip" rel="noopener noreferrer"&gt;Download Latest Release&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Supported Platforms&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Following platforms are supported by Wbot:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt;
The minimum version supported is macOS 10.9.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt;
Windows 7 and later are supported.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu 12.04 and later&lt;/li&gt;
&lt;li&gt;Fedora 21&lt;/li&gt;
&lt;li&gt;Debian 8&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How to start the BOT?&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;STEPS&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;After downloading, extract the zip file and open the bot.json file and in the third line change the value of "headless" from true to false. Now, navigate to the location of the WBOT folder in your terminal…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/vasani-arpit/WBOT" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  ✌ Conclusion
&lt;/h3&gt;

&lt;p&gt;This is what technology is all about. Identify the problem and fix the problem with the tools/tech. Isn't it?&lt;br&gt;
There are so many possibilities with the combination of the tools like Google Puppeteer and NodeJS. We just need to be self aware enough to look for solution to the problem we have in day to day life. &lt;/p&gt;




&lt;p&gt;!! Reward me with your comments below🎁..... You are awesome !!&lt;/p&gt;

&lt;p&gt;Thanks &lt;a href="https://www.freepik.com/starline" rel="noopener noreferrer"&gt;starline&lt;/a&gt; for the background vector&lt;/p&gt;

&lt;p&gt;&lt;em&gt;P.S: This is the first time I am sharing/writing over the internet. Feel free to point out mistakes so that I can improve that for my next post.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>whatsapp</category>
      <category>bot</category>
      <category>webautomation</category>
      <category>puppeteer</category>
    </item>
  </channel>
</rss>
