Skip to content

rewrite-everything-in-rust/whatsapp-rust

 
 

Repository files navigation

whatsapp-rust

A high-performance, async Rust library for the WhatsApp Web API. Inspired by whatsmeow (Go) and Baileys (TypeScript).

Features

Authentication

  • QR code pairing
  • Pair code (phone number) linking
  • Persistent sessions with automatic reconnection

Messaging

  • End-to-end encrypted messages (Signal Protocol)
  • One-on-one and group chats
  • Message editing and reactions
  • Quoting/replying to messages
  • Delivery, read, and played receipts

Media

  • Upload and download images, videos, documents, GIFs, and audio
  • Automatic encryption and decryption

Contacts & Groups

  • Check if phone numbers are on WhatsApp
  • Fetch profile pictures and user info
  • Query group metadata and participants
  • List all groups you're participating in

Presence & Chat State

  • Set online/offline presence
  • Typing indicators (composing, recording, paused)
  • Block and unblock contacts

Architecture

  • Modular design - Pluggable storage, transport, and HTTP clients
  • Runtime agnostic - Works with Tokio, async-std, or WASM
  • SQLite included - Default storage backend, easily swappable

Quick Start

use std::sync::Arc;
use whatsapp_rust::bot::Bot;
use whatsapp_rust::store::SqliteStore;
use whatsapp_rust_tokio_transport::TokioWebSocketTransportFactory;
use whatsapp_rust_ureq_http_client::UreqHttpClient;
use wacore::types::events::Event;

#[tokio::main]
async fn main() {
    let backend = Arc::new(SqliteStore::new("whatsapp.db").await.unwrap());

    let mut bot = Bot::builder()
        .with_backend(backend)
        .with_transport_factory(TokioWebSocketTransportFactory::new())
        .with_http_client(UreqHttpClient::new())
        .on_event(|event, client| async move {
            match event {
                Event::PairingQrCode { code, .. } => println!("QR:\n{}", code),
                Event::Message(msg, info) => {
                    println!("Message from {}: {:?}", info.source.sender, msg);
                }
                _ => {}
            }
        })
        .build()
        .await
        .unwrap();

    bot.run().await.unwrap().await.unwrap();
}

Run the included demo bot:

cargo run                          # QR code only
cargo run -- -p 15551234567        # Pair code + QR code
cargo run -- -p 15551234567 -c 12345678 # Custom pair code

Project Structure

whatsapp-rust/
├── src/                    # Main client library
├── wacore/                 # Platform-agnostic core (no_std compatible)
│   ├── binary/             # WhatsApp binary protocol
│   ├── libsignal/          # Signal Protocol implementation
│   └── appstate/           # App state management
├── waproto/                # Protocol Buffers definitions
├── storages/sqlite-storage # SQLite backend
├── transports/tokio-transport
└── http_clients/ureq-client

Custom Backends

Implement your own storage, transport, or HTTP client by implementing the respective traits. See the default implementations for reference.

Disclaimer

This is an unofficial, open-source reimplementation. Using custom WhatsApp clients may violate Meta's Terms of Service and could result in account suspension. Use at your own risk.

Acknowledgements

About

Whatsapp client written purely in Rust based on whatsmeow and baileys

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 99.9%
  • Dockerfile 0.1%