Share WhatsApp Web without Scanning QR code using Python (original) (raw)

Last Updated : 20 Sep, 2022

Prerequisite: Selenium, Browser Automation Using Selenium

In this article, we are going to see how to share your Web-WhatsApp with anyone over the Internet without Scanning a QR code.

Web-Whatsapp store sessions

Web Whatsapp stores sessions in IndexedDB with the name wawc and syncs those key-value pairs to local storage. IndexedDB stores the data inside the user’s browser and allows to create web application that can query from this indexedDB with or without a network connection.

How to get a session:

We can figure it out by trying the following. We will take help of chrome dev tool.

Steps:

  1. Clear cookies and refresh the page: It will remain login.
  2. Clear localStorage and refresh the page: It will restore the local Storage and remain logged in.
  3. Clear IndexedDB and refresh the page: It will restore the IndexedDB and remain logged in.
  4. Now clear both localStorage and IndexedDB: It will log out.

Steps demonstration:

Extract sessions from IndexedDB:

We can extract sessions from IndexedDB by using the following javascript.

Javascript

function getResultFromRequest(request) {

`` return new Promise((resolve, reject) => {

`` request.onsuccess = function (event) {

`` resolve(request.result);

`` };

`` });

}

async function getDB() {

`` var request = window.indexedDB.open( "wawc" );

`` return await getResultFromRequest(request);

}

async function readAllKeyValuePairs() {

`` var db = await getDB();

`` var objectStore = db.transaction( "user" ).objectStore( "user" );

`` var request = objectStore.getAll();

`` return await getResultFromRequest(request);

}

session = await readAllKeyValuePairs();

console.log(session);

We can try to execute the above code in the browser’s console or tab where we had opened Web-Whatsapp and we will see the output as follows containing session key-value pairs.

Now we get those key-value pairs as text by running the following line of code.

Javascript

Now let’s copy that text to a file to save a session and clear both localStorage and IndexedDB to log out. Now we can run the following code to inject a session by assigning the value of the session string we just copied to a file to variable SESSION_STRING. Then refresh the page and we will log in again without scanning the QR code.

Javascript

function getResultFromRequest(request) {

`` return new Promise((resolve, reject) => {

`` request.onsuccess = function (event) {

`` resolve(request.result);

`` };

`` })

}

async function getDB() {

`` var request = window.indexedDB.open( "wawc" );

`` return await getResultFromRequest(request);

}

async function injectSession(SESSION_STRING) {

`` var session = JSON.parse(SESSION_STRING);

`` var db = await getDB();

`` var objectStore = db.transaction( "user" , "readwrite" ).objectStore( "user" );

`` for ( var keyValue of session) {

`` var request = objectStore.put(keyValue);

`` await getResultFromRequest(request);

`` }

}

var SESSION_STRING = "" ;

await injectSession(SESSION_STRING);

Automating the process of generating a session file and injecting a session:

We can automate the process of generating a session file that contains our session key-value pairs and also reading session key-value pairs from that generated session file to inject a session into the browser to open web-WhatsApp without scanning QR code

We can automate as follows:

Take the session file path as a command-line argument.

Generating session file:

Opening session file:

Below is the implementation:

Note: Please download chormedrive before running the code.

By using selenium’s WebDriverWait, we can wait for some elements to be present on the browser as following:

Python3

def _wait_for_presence_of_an_element(browser, selector):

`` element = None

`` try :

`` element = WebDriverWait(browser, DEFAULT_WAIT).until(

`` EC.presence_of_element_located(selector)

`` )

`` except :

`` pass

`` finally :

`` return element

Generating session file:

Python3

def sessionGenerator(sessionFilePath):

`` browser = webdriver.Chrome()

`` print ( "Waiting for QR code scan..." )

`` _wait_for_presence_of_an_element(

`` browser, MAIN_SEARCH_BAR__SEARCH_ICON)

`` session = browser.execute_script(EXTRACT_SESSION)

`` with open (sessionFilePath, "w" , encoding = "utf-8" ) as sessionFile:

`` sessionFile.write( str (session))

`` print ( "Your session file is saved to: " + sessionFilePath)

`` browser.close()

Use the above methods for Generating session file:

Python3

from session import *

import sys

sessionFilePath = sys.argv[ 1 ]

sessionGenerator(sessionFilePath)

Opening session file:

Python3

def sessionOpener(sessionFilePath):

`` if sessionFilePath = = "":

`` raise IOError( '"' + sessionFilePath + '" is not exist.' )

`` with open (sessionFilePath, "r" , encoding = "utf-8" ) as sessionFile:

`` session = sessionFile.read()

`` browser = webdriver.Chrome()

`` _wait_for_presence_of_an_element(browser, QR_CODE)

`` print ( "Injecting session..." )

`` browser.execute_script(INJECT_SESSION, session)

`` browser.refresh()

`` input ( "Press enter to close browser." )

Use the above methods for Opening session file:

Python3

from session import *

import sys

sessionFilePath = sys.argv[ 1 ]

sessionOpener(sessionFilePath)

We can generate a session file by using the following command:

For Generating session file:

python session_generator.py session.wa

After generating the session file then share it with someone and put that session file in the same folder where session_opener.py is located and run the following command to open the Web Whatsapp without scanning the QR code

For Opening session file:

python session_opener.py session.wa

OR open PowerShell normally without going to the folder and give absolute paths as following

For Generating session file:

python E:\share-web-whatsapp\session_generator.py E:\share-web-whatsapp\session.wa

For Opening session file:

python E:\share-web-whatsapp\session_opener.py E:\share-web-whatsapp\session.wa