Skip to main content

High-stealth WhatsApp Web automation plugin for CamouChat. WA-JS powered, async-first, multi-account with AES-256 encrypted storage.

Project description

CamouChat WhatsApp 🟢

High-stealth WhatsApp automation plugin for the CamouChat ecosystem. Built on top of camouchat-browser and WA-JS, providing a structured, API-driven pipeline for multi-account automation with end-to-end encrypted message storage.

[!IMPORTANT] This package requires a one-time binary fetch for the underlying Camoufox browser engine after installation. See Setup below.

Key Features

  • WA-JS Integration: Uses the internal WhatsApp Web API via wa-js — not fragile DOM selectors.
  • Multi-Account Isolation: Each account runs in a sandboxed profile with isolated cookies, storage, and fingerprints.
  • E2E Encryption: All stored messages are encrypted at rest using AES-256-GCM.
  • Async-First: Fully asyncio-native for high-throughput multi-session workloads.
  • Humanized Behavior: Mouse movements, typing cadence, and delays mimic organic user behavior.
  • Rate Limiting: Built-in configurable rate-limit support to prevent account bans.

Installation

Using uv (Recommended)

uv add camouchat-whatsapp "camoufox[geoip]"

Using pip

pip install camouchat-whatsapp "camoufox[geoip]"

Setup

[!WARNING]
uv sync / pip install alone are not enough. You must fetch the Camoufox browser binary separately.

With uv

uv run python -m camoufox fetch

With pip

python -m camoufox fetch

This downloads the latest hardened Firefox binary used internally by Camoufox.

Quick Start

import asyncio

from camouchat_browser import BrowserConfig, BrowserForge, CamoufoxBrowser, ProfileManager
from camouchat_core import Platform
from camouchat_whatsapp import (
    Login,
    WebSelectorConfig,
    WapiSession,
    InteractionController,
    MessageModelAPI,
    on_newMsg,
)

async def main():
    # 1. Profile
    pm = ProfileManager()
    profile = pm.create_profile(platform=Platform.WHATSAPP, profile_id="my_account")

    print("Location of saved DIR cookies : ", profile.cache_dir)

    # 2. Browser
    config = BrowserConfig.from_dict({
        "platform": Platform.WHATSAPP,
        "headless": False,
        "locale": "en-US",
        "fingerprint_obj": BrowserForge(),
    })
    browser = CamoufoxBrowser(config=config, profile=profile)
    page = await browser.get_page()

    # 3. Login (reuses saved session automatically)
    ui = WebSelectorConfig(page=page)
    login = Login(page=page, UIConfig=ui)
    await login.login(method=0)

    # 4. Message event hook
    wapi = WapiSession(page=page)
    interaction = InteractionController(page=page, ui_config=ui, wapi=wapi)

    cm = wapi.chat_manager

    @on_newMsg(wapi_session=wapi)
    async def handle_message(msg: MessageModelAPI):
        print(f"New message from {msg.jid_From}: {msg.body}")

        # open chat & send msg .
        print(f"Opening Chat... [{msg.author}]")
        chat_id = msg.jid_From # jid is internal WhatsApp used ID system , and _from tells from which chat this came on, so jid_from -> msg came from which chat.
        chat = await cm.get_chat_by_id(chat_id=chat_id)
        await cm.open_chat(chat= chat)

        if msg.body == "!ping":
            await interaction.send_api_text(
                chat_id=msg.jid_From,
                text="🏓 Pong!",
                quoted_msg_id=msg.id_serialized,
            )

    await handle_message()   # start listening
    await asyncio.sleep(3600)  # keep alive


if __name__ == "__main__":
    try :
        asyncio.run(main())
    except KeyboardInterrupt :
        pass
    except Exception  :
        import tracemalloc
        tracemalloc.print_exc()

Anti-Ban Best Practices

  • Use residential proxies and enable GeoIP matching.
  • Run only one visible browser (others auto-switch to headless).
  • Respect rate limits — avoid burst-sending messages.
  • Use test accounts before deploying on real numbers.

Documentation

⚖️ Security & Ethics

CamouChat's strict policy regarding acceptable automation, anti-spam, and stealth disclaimers can be found in our central ecosystem hub:

👉 SECURITY.md


Acknowledgements & Third-Party Code

CamouChat WhatsApp uses portions of the wa-js library developed by the WPPConnect Team.

wa-js provides the internal WhatsApp Web JavaScript bridge that powers reliable, selector-free automation. It is distributed under the Apache License 2.0.

See the NOTICE file for full compliance details.

License

MIT License. See LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

camouchat_whatsapp-0.7.2.tar.gz (174.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

camouchat_whatsapp-0.7.2-py3-none-any.whl (186.1 kB view details)

Uploaded Python 3

File details

Details for the file camouchat_whatsapp-0.7.2.tar.gz.

File metadata

  • Download URL: camouchat_whatsapp-0.7.2.tar.gz
  • Upload date:
  • Size: 174.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for camouchat_whatsapp-0.7.2.tar.gz
Algorithm Hash digest
SHA256 4b7b20ecf7a66346ddcfa3ef0e6ce40ba24ee2de22ae715b88be0e9da219c50e
MD5 67297361a722ba5780166e52bfa60d0b
BLAKE2b-256 5b4aad67c9cb968594996bd55ce2121611694ca19676ef1220fdbe555ec89f04

See more details on using hashes here.

File details

Details for the file camouchat_whatsapp-0.7.2-py3-none-any.whl.

File metadata

File hashes

Hashes for camouchat_whatsapp-0.7.2-py3-none-any.whl
Algorithm Hash digest
SHA256 34ae74d9ac1620d95d034dbe641814f87e0efdc020807d426b652b04208d68b9
MD5 d39ee74df337c594873c95b07cdb42b7
BLAKE2b-256 9656acd3b71b784aebe9818c4943856a97634c1a9dc6b1808eae0990d1b84ba3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page