Skip to content

Commit

Permalink
add wa version
Browse files Browse the repository at this point in the history
  • Loading branch information
3mora2 committed Mar 15, 2024
1 parent a593a84 commit 0207c51
Show file tree
Hide file tree
Showing 9 changed files with 129 additions and 15 deletions.
10 changes: 5 additions & 5 deletions WPP_Whatsapp/PlaywrightSafeThread/browser/threadsafe_browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,11 +313,11 @@ def check_profile(self, path):
async def __stop_playwright(self) -> None:
# NOTE: we need to make sure those were actually launched, in
# case of a nasty race condition
if hasattr(self, "context"):
await self.context.close()

if hasattr(self, "browser"):
await self.browser.close()
# if hasattr(self, "context"):
# await self.context.close()
#
# if hasattr(self, "browser"):
# await self.browser.close()

# NOTE: this hangs without the proper child watcher
if hasattr(self, "playwright"):
Expand Down
10 changes: 5 additions & 5 deletions WPP_Whatsapp/api/Whatsapp.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
class Whatsapp(BusinessLayer):
interval: threading.Event

def __init__(self, session, threadsafe_browser, **kwargs):
def __init__(self, session, threadsafe_browser, version=None, **kwargs):
self.connected = None
self.options = {}
self.options.update(defaultOptions)
Expand All @@ -19,6 +19,7 @@ def __init__(self, session, threadsafe_browser, **kwargs):
self.options[key] = value

# self.autoCloseInterval = None
self.version = version
self.autoCloseCalled = False
self.isInitialized = False
self.isInjected = False
Expand Down Expand Up @@ -81,11 +82,10 @@ async def afterPageScriptInjected(self):
self.connected = is_authenticated

def useHere(self, timeout=120):
return self.ThreadsafeBrowser.run_threadsafe(self.useHere_, timeout_=timeout)

return self.ThreadsafeBrowser.run_threadsafe(self.useHere_, timeout_=timeout)

def logout(self, timeout=120):
return self.ThreadsafeBrowser.run_threadsafe(self.logout_, timeout_=timeout)
return self.ThreadsafeBrowser.run_threadsafe(self.logout_, timeout_=timeout)

def getMessageById(self, messageId, timeout=120):
return self.ThreadsafeBrowser.run_threadsafe(self.getMessageById_, messageId, timeout_=timeout)
Expand Down Expand Up @@ -121,7 +121,7 @@ async def getMessages_(self, chatId, params=None):
params = {}
chatId = self.valid_chatId(chatId)
return await self.ThreadsafeBrowser.page_evaluate("({ chatId, params }) => WAPI.getMessages(chatId, params)",
{"chatId": chatId, "params": params})
{"chatId": chatId, "params": params})

async def rejectCall_(self, callId):
return await self.ThreadsafeBrowser.page_evaluate(
Expand Down
39 changes: 39 additions & 0 deletions WPP_Whatsapp/api/helpers/wa_version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import os
from nodesemver import max_satisfying, _sorted, satisfies
import requests


def getAvailableVersions(versionMatch=None, includePrerelease=True):
r = requests.get("https://api.github.com/repos/wppconnect-team/wa-version/contents/html")
if not r.ok:
return []
versions = [os.path.splitext(da.get("name"))[0] for da in r.json()]
sorted_versions = _sorted(versions)

if versionMatch:
return [v for v in sorted_versions if satisfies(v, versionMatch, include_prerelease=includePrerelease)]
else:
return sorted_versions


def getLatestVersion(versionMatch='*', includePrerelease=True):
versions = getAvailableVersions()

max_version = max_satisfying(versions, versionMatch, include_prerelease=includePrerelease)

return (max_version or versions[-1]).raw


def getPageContent(versionMatch=None, includePrerelease=True):
if versionMatch is None:
versionMatch = getLatestVersion()

versions = getAvailableVersions()

max_version = max_satisfying(versions, versionMatch, include_prerelease=includePrerelease)

if not max_version:
raise ValueError(f"Version not available for {versionMatch}")
r = requests.get(f"https://raw.githubusercontent.com/wppconnect-team/wa-version/main/html/{max_version.raw}.html")
if r.ok:
return r.text
56 changes: 55 additions & 1 deletion WPP_Whatsapp/api/layers/HostLayer.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from WPP_Whatsapp.api.const import whatsappUrl, Logger
from WPP_Whatsapp.api.helpers.function import asciiQr
from WPP_Whatsapp.PlaywrightSafeThread import ThreadsafeBrowser
from WPP_Whatsapp.api.helpers.wa_version import getPageContent


class HostLayer:
Expand All @@ -38,6 +39,7 @@ class HostLayer:
checkStartInterval: threading.Event
logQR: bool
remain: int
version: str

def __init__(self):
self.__initialize()
Expand Down Expand Up @@ -111,12 +113,62 @@ def start(self):
# self.page.on('close', lambda: self.clearInterval(self.checkStartInterval))
return True

############################### initWhatsapp ####################################################
def initWhatsapp(self):
# await page.setUserAgent(useragentOverride);
# self.unregisterServiceWorker()
if self.version:
self.logger.info(f'{self.session}: Setting WhatsApp WEB version to {self.version}')
self.setWhatsappVersion(self.version)
self.logger.info(f'{self.session}: Loading WhatsApp WEB')
self.ThreadsafeBrowser.sync_goto(whatsappUrl, wait_until="domcontentloaded")
self.logger.info(f'{self.session}: WhatsApp WEB loaded')
# ToDo: unregisterServiceWorker, setWhatsappVersion,

def unregisterServiceWorker(self):
try:
self.ThreadsafeBrowser.sync_page_evaluate("""() => {
// Remove existent service worker
navigator.serviceWorker
.getRegistrations()
.then((registrations) => {
for (let registration of registrations) {
registration.unregister();
}
})
.catch((err) => null);
// Disable service worker registration
// @ts-ignore
navigator.serviceWorker.register = new Promise(() => {});
setInterval(() => {
window.onerror = console.error;
window.onunhandledrejection = console.error;
}, 500);
}""")
except:
pass

def setWhatsappVersion(self, version):
body = ""
try:
body = getPageContent(version)
except:
Logger.exception("setWhatsappVersion")
if not body:
Logger.error(f"Version not available for {version}, using latest as fallback")
return

self.ThreadsafeBrowser.run_threadsafe(self.page.route, 'https://web.whatsapp.com/check-update',
lambda route: route.abort())
self.ThreadsafeBrowser.run_threadsafe(self.page.route, 'https://web.whatsapp.com/',
lambda route: route.fulfill(body=body))

async def __handel_request(self, ):
pass

#################################################################################################
async def __checkStart(self):
await self.__needsToScan()

Expand Down Expand Up @@ -528,7 +580,8 @@ async def _onLoadingScreen(self):
@staticmethod
def valid_chatId(chatId):
chatId = chatId.replace("+", "")
if chatId and (not chatId.endswith('@c.us') and not chatId.endswith('@g.us') and not chatId.endswith('@newsletter')):
if chatId and (
not chatId.endswith('@c.us') and not chatId.endswith('@g.us') and not chatId.endswith('@newsletter')):
chatId += '@g.us' if len(chatId) > 15 else '@c.us'
return chatId

Expand All @@ -554,6 +607,7 @@ def convert_to_base64(path):

def fileToBase64(self, path):
return self.convert_to_base64(path)

@staticmethod
def base64MimeType(encoded):
result = encoded.split(";base64")[0].split(":")[-1]
Expand Down
5 changes: 3 additions & 2 deletions WPP_Whatsapp/controllers/initializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def __init__(
catchQR=None,
statusFind=None, onLoadingScreen=None,
onStateChange=None, waitForLogin: bool = True, logQR: bool = False,
autoClose: int = 0, *args, **kwargs) -> None:
autoClose: int = 0, version=None,*args, **kwargs) -> None:
"""
check_open_dir:bool
close_already_profile:bool
Expand All @@ -39,6 +39,7 @@ class Create:
self.statusFind_dict = {}
self.catchQR_dict = {}
self.session = session
self.version = version
self.user_data_dir = user_data_dir
self.folderNameToken = (
folderNameToken or
Expand Down Expand Up @@ -147,7 +148,7 @@ def create(self) -> Whatsapp:
self.ThreadsafeBrowser.browser.on("disconnected", lambda: self.statusFind('browserClose', self.session))

self.client = Whatsapp(self.session, self.ThreadsafeBrowser, logQR=self.logQR,
autoClose=self.autoClose)
autoClose=self.autoClose, version=self.version)
self.client.catchQR = self.catchQR
self.client.statusFind = self.statusFind
self.client.onLoadingScreen = self.onLoadingScreen
Expand Down
18 changes: 18 additions & 0 deletions examples/wa_version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from WPP_Whatsapp import Create

import logging

logger = logging.getLogger(name="WPP_Whatsapp")
logger.setLevel(logging.DEBUG)

# start client with your session name
your_session_name = "test"
creator = Create(session=your_session_name, browser="chrome", version="2.2409.2")
client = creator.start()
# Now scan Whatsapp Qrcode in browser

# check state of login
if creator.state != 'CONNECTED':
raise Exception(creator.state)

print(client.getWAVersion())
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ pyee
segno
typing_extensions
requests
node-semver
5 changes: 3 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"the creation of any interaction, such as customer service, media sending, intelligence recognition "
"based on phrases artificial and many other things, use your imagination")

version = "0.1.8"
version = "0.1.9"

setup(
name="WPP_Whatsapp",
Expand All @@ -27,7 +27,8 @@
"pyee",
'segno',
'typing_extensions',
"playwright-stealth"
"playwright-stealth",
"node-semver"
],
long_description=long_description,
long_description_content_type="text/markdown",
Expand Down
Empty file added test/2.py
Empty file.

0 comments on commit 0207c51

Please sign in to comment.