Compare commits

...
131 Commits
Author SHA1 Message Date
allburov faf8d053dd [docs] Index
Release / amd64 - chrome - chrome (push) Waiting to run
Release / amd64 - chromium - latest (push) Waiting to run
Release / linux/arm64 - chromium - arm (push) Waiting to run
Release / amd64 - none - noweb (push) Waiting to run
Release / linux/arm64 - none - noweb-arm (push) Waiting to run
2024-05-03 18:00:12 +07:00
allburov 5ece56f9b0 [docs] Add WAHA Dashboard, Hub 2024-05-03 17:44:37 +07:00
allburov c4d9474f34 [docs] update swagger 2024-05-03 16:37:55 +07:00
allburov 3b8481ccac [docs] Dashboard stub 2024-05-03 16:33:41 +07:00
allburov a31d0215f5 [core] Correct plus docker-compose.yaml 2024-05-03 16:31:25 +07:00
allburov f6cce68553 [core] Bump version 2024.5.2 2024-05-03 16:31:25 +07:00
allburov 636b100b9f [core] Bump version to 2024.5.1 2024-05-03 11:56:29 +07:00
allburov 7a3574eaa0 [core] Update WEBJS version 2024-05-03 11:56:29 +07:00
allburov 9cd6176e60 [core] Change default password to waha/waha 2024-05-03 11:56:29 +07:00
allburov f2641029cb [core] nest cli 2024-05-02 14:39:18 +07:00
allburov 6350e191f8 [core] Ignore dashboard 2024-05-02 14:38:54 +07:00
allburov c570ba3488 [core] Correct dashboard 2024-05-02 12:05:22 +07:00
allburov b64abd24c8 [core] Configure dashboard right 2024-05-02 12:03:46 +07:00
allburov 13c9ab3962 [core] Adjust dashboard stub 2024-05-02 12:03:46 +07:00
allburov b9f1c6ee79 [core] Adjust swagger 2024-05-02 12:03:46 +07:00
allburov 938170a957 [core] Add Dashboard 2024-05-02 12:03:46 +07:00
allburov ca0a28c0cf [core] Logout if logout is true 2024-05-02 09:42:25 +07:00
allburov c3967173a1 [core] Enable cors 2024-04-28 17:35:52 +07:00
allburov 9ebbd9a1fd [docs] no MOBILE yet 2024-04-23 11:03:39 +07:00
allburov 16e343ca19 [docs] Labels 2024-04-21 18:54:55 +07:00
allburov 1de9132f16 [core] Remove ignore 2024-04-21 18:49:53 +07:00
allburov dad54a8e47 [core] Pin WEBJS version to 2.2412.54 2024-04-21 17:30:16 +07:00
allburov 7d73b96b78 [core] Fix send voice 2024-04-21 17:08:08 +07:00
allburov 1260fe34aa [core] Bump version to 2024.4.4 2024-04-21 16:35:43 +07:00
allburov 3b4678e059 [core] Add GET /api/sessions/{session} endpoint 2024-04-21 16:35:28 +07:00
allburov ff8294b5db [core] Add patron portal link 2024-04-21 16:14:54 +07:00
allburov 7e94e19f5d [core] NOWEB - add GET /api/contacts/profile-picture 2024-04-21 16:14:54 +07:00
allburov ae18e2575a [docs] Add tier 2024-04-21 16:01:35 +07:00
allburov a5c493a29c [docs] Add tier 2024-04-17 13:45:14 +07:00
allburov 8ee89fe51c [docs] pro tier 2024-04-15 09:21:46 +07:00
allburov b4909847bf [docs] link 2024-04-15 09:16:32 +07:00
allburov 568be88127 [docs] tiers
Release / amd64 - chrome - chrome (push) Waiting to run
Release / amd64 - chromium - latest (push) Waiting to run
Release / linux/arm64 - chromium - arm (push) Waiting to run
Release / amd64 - none - noweb (push) Waiting to run
Release / linux/arm64 - none - noweb-arm (push) Waiting to run
2024-04-14 19:15:59 +07:00
allburov 67144c1d08 [docs] 2024-04-14 18:56:20 +07:00
allburov 285c78d41a [docs] no row 2024-04-14 18:50:26 +07:00
allburov 7d15735444 [docs] discord 2024-04-14 18:18:05 +07:00
allburov 4191749564 [docs] Crypto 2024-04-12 21:34:44 +07:00
allburov 9e68dbbf09 [docs] No advanced 2024-04-12 13:36:53 +07:00
allburov f02ad5b051 [docs] Add http requests in index 2024-04-09 17:30:55 +07:00
allburov 08e20a25ed [core] Bump version to 2024.4.3 2024-04-09 11:45:44 +07:00
allburov ee0468038d [core] Update puppetter 2024-04-09 11:45:44 +07:00
allburov 04afc297d9 [core] Update WEBJS 2024-04-09 11:45:43 +07:00
allburov ed06ca76e0 [core] Bump to 2024.4.2 2024-04-08 18:17:04 +07:00
allburov a68510a814 [core] Fix NOWEB india 2024-04-08 18:16:35 +07:00
allburov 4040efab01 [docs] Alway show sidebar 2024-04-06 13:14:59 +07:00
allburov f08cc1061e [docs] Fix favicon 2024-04-06 13:01:40 +07:00
allburov 3b5b11891e [docs] Fix logo 2024-04-06 12:52:22 +07:00
allburov 72427c9309 [docs] Fix logo 2024-04-06 12:51:29 +07:00
allburov befe2068fd [docs] Fix send file example 2024-04-05 13:54:24 +07:00
allburov c7a3ef32fa [core] Add mongodb example 2024-04-02 17:42:30 +07:00
allburov 51d394f4ef [core] Bump version to 2024.4.1 2024-04-02 14:22:03 +07:00
allburov 8db341dd70 [core] Fix NOWEB engine restart 2024-04-02 14:22:02 +07:00
allburov 5cd7fec3ab [docs] Add what can it do 2024-04-01 16:06:08 +07:00
allburov f672ecbb45 [docs] try it now 2024-04-01 13:33:20 +07:00
allburov 9a12b2c9b6 [docs] Add prices at the top 2024-04-01 10:12:27 +07:00
allburov c31407fd87 [docs] add caption 2024-04-01 10:03:25 +07:00
allburov 646c81f136 [docs] message.reactions 2024-04-01 09:44:01 +07:00
allburov aca6232d2a [docs] changelog 2024-04-01 09:37:14 +07:00
allburov c61da10523 [core] Pin Web version
Release / amd64 - chrome - chrome (push) Waiting to run
Release / amd64 - chromium - latest (push) Waiting to run
Release / linux/arm64 - chromium - arm (push) Waiting to run
Release / amd64 - none - noweb (push) Waiting to run
Release / linux/arm64 - none - noweb-arm (push) Waiting to run
2024-04-01 09:31:08 +07:00
allburov 1f53d65ac2 [docs] fix card in article 2024-03-31 18:43:31 +07:00
allburov 844ab1287e [docs] fix links 2024-03-31 18:39:39 +07:00
allburov d6d318b23b [docs] Are you a visual 2024-03-31 16:04:26 +07:00
allburov 7504ffd934 [docs] quick start second 2024-03-31 16:00:06 +07:00
allburov e8078908c9 [docs] http api 2024-03-31 15:56:37 +07:00
allburov 431848280f [docs] Fix debug 2024-03-29 16:06:31 +07:00
allburov 2e0c575512 [core] Bump version to 2024.3.14 2024-03-29 15:57:15 +07:00
allburov ebf0d99417 [core] Add "debug" flag to session config 2024-03-29 15:56:50 +07:00
allburov 423d893fee [docs] No hover 2024-03-29 14:37:21 +07:00
allburov 56fe0d3b04 [docs] Limit 2024-03-29 14:22:36 +07:00
allburov 7172d9d203 [docs] Green icons 2024-03-29 14:21:20 +07:00
allburov bd770a6902 [docs] Fix index 2024-03-29 14:06:56 +07:00
allburov 628508faed [docs] ktor 2024-03-29 13:55:27 +07:00
allburov 826634f061 [docs] Add js, php for future 2024-03-29 13:37:23 +07:00
allburov c7ed959a71 [docs] Add kotlin 2024-03-29 13:32:15 +07:00
allburov aea6befc1e [docs] Add NOWEB feedback 2024-03-29 10:08:30 +07:00
allburov 7bb3484788 [docs] Add python example 2024-03-28 08:51:38 +07:00
allburov 4eafc67a7e [core] Bump 2024.3.13 2024-03-27 17:09:29 +07:00
allburov b5197b6f20 [core] log page logs 2024-03-27 17:09:29 +07:00
allburov d306304195 [core] One line log 2024-03-27 17:09:29 +07:00
allburov 35f47dae4f [docs] Boosty instead of Patreon 2024-03-27 13:52:00 +07:00
allburov f1be4810d5 [core] Bump to 2024.3.12 2024-03-27 13:27:39 +07:00
allburov d4f9406869 [core] Update NOWEB 2024-03-27 13:27:36 +07:00
allburov a41b81d724 [docs] Add funding 2024-03-26 16:54:09 +07:00
allburov da56b86102 [docs] Boosty first 2024-03-26 16:51:58 +07:00
allburov f12d2c9be0 [docs] Add gtag 2024-03-25 11:54:21 +07:00
allburov 322b9b4c25 [docs] Correct changelog 2024-03-24 20:52:26 +07:00
allburov fb7fe410f9 [core] Bump to 2024.3.11 2024-03-24 20:43:27 +07:00
allburov ee392a079c [core] Update swagger 2024-03-24 20:43:27 +07:00
allburov 0502579d50 [core] Edit and delete messages 2024-03-24 20:43:27 +07:00
allburov f10f3175d9 [core] add new swagger 2024-03-24 18:00:36 +07:00
allburov f155af99f1 [core] Bump 2024.3.10 2024-03-24 17:58:32 +07:00
allburov 0fbf3575a6 [core] NOWEB sendVCard 2024-03-24 17:58:30 +07:00
allburov f6b9b5f54e [core] Bump to 2024.3.9 2024-03-22 18:56:54 +07:00
allburov 2dadd9d8c9 [docs] Add caption to sendfile 2024-03-22 18:56:40 +07:00
allburov 5786b3cdfe [docs] Adjust cards style 2024-03-22 10:18:26 +07:00
allburov 769fc30c0c [docs] Adjust cards style 2024-03-22 10:09:21 +07:00
allburov fb2dad9c6f [core] bump version to 2024.3.8 2024-03-22 09:47:04 +07:00
allburov c43d308a2d [core] Add star unstar
Fix #240
2024-03-22 09:46:25 +07:00
allburov 742a12ce6a [core] Fix reactions 2024-03-22 09:25:23 +07:00
allburov d953f27865 [core] Update openapi.json 2024-03-20 12:18:53 +07:00
allburov 4719cded95 [core] get engine info 2024-03-19 14:16:45 +07:00
allburov 9d489bdb69 [core] add Patron Portal 2024-03-18 18:37:20 +07:00
allburov 537c307550 [core] No mobile engine anymore 2024-03-18 18:27:11 +07:00
allburov d5575e0323 [core] Fix index 2024-03-18 18:22:38 +07:00
allburov 592962bbc8 [core] Use vars.DOCKER_IMAGE 2024-03-18 15:25:39 +07:00
allburov 7a371c86dc [core] Images 2024-03-18 15:19:20 +07:00
allburov 0e295bebde [core] Don't push each version 2024-03-18 15:06:19 +07:00
allburov 8d98759be6 Revert "[core] Update WEBJS with 2.2300 fix"
This reverts commit 924317b01b.
2024-03-18 14:56:07 +07:00
allburov 924317b01b [core] Update WEBJS with 2.2300 fix 2024-03-18 14:55:50 +07:00
allburov a08a601dc3 [core] manual push 2024-03-18 14:54:22 +07:00
allburov e652c15d6c [core] Add manual jobs 2024-03-18 14:45:57 +07:00
allburov 4534eb60de [core] Add manual jobs 2024-03-18 14:44:43 +07:00
allburov 54c6c0c24c [core] Read more about Security 2024-03-18 14:21:49 +07:00
allburov 393694ae96 [core] Rm even 2024-03-18 14:17:57 +07:00
allburov 818bb730e4 Revert "[core] fix CI"
This reverts commit 61bd35a192.
2024-03-18 14:05:54 +07:00
allburov 61bd35a192 [core] fix CI 2024-03-18 14:02:59 +07:00
allburov 81f9df000a [core] fix CI
Release / amd64 - chrome - chrome (push) Waiting to run
Release / amd64 - chromium - latest (push) Waiting to run
Release / linux/arm64 - chromium - arm (push) Waiting to run
Release / amd64 - none - noweb (push) Waiting to run
Release / linux/arm64 - none - noweb-arm (push) Waiting to run
2024-03-18 13:48:46 +07:00
allburov 0dcb31c108 [core] Bump to 2024.3.6 2024-03-18 13:46:32 +07:00
allburov cd4140fda9 [core] Add exact version (tag) 2024-03-18 13:46:30 +07:00
allburov 117cc25cdb [core] Bump version to 2024.3.5 2024-03-17 19:17:32 +07:00
allburov 832ad26151 [core] Add /messages-admin-only
fix #274
2024-03-17 19:17:14 +07:00
allburov 5a344cd8ad [core] Bump version to 2024.3.4 2024-03-15 17:45:23 +07:00
allburov 0b0a67cdad [core] Update WEBJS engine 2024-03-15 17:45:21 +07:00
allburov a326a240f0 [core] Bump version 2024.3.3 2024-03-15 15:15:13 +07:00
allburov dfdb033769 [core] Add message.reaction webhook 2024-03-15 15:14:48 +07:00
allburov a31af45d97 [core] Change code on main 2024-03-13 17:49:52 +07:00
allburov cae955c483 [core] Bump to 2024.3.2
Release / amd64 - chrome - chrome (push) Waiting to run
Release / amd64 - chromium - latest (push) Waiting to run
Release / linux/arm64 - chromium - arm (push) Waiting to run
Release / amd64 - none - noweb (push) Waiting to run
Release / linux/arm64 - none - noweb-arm (push) Waiting to run
2024-03-07 19:28:12 +07:00
allburov 0bfff5259e [core] Use ubuntu in NOWEB 2024-03-07 19:27:45 +07:00
allburov 0fa83e603b [core] No more MOBILE engine 2024-03-04 23:14:28 +07:00
allburov 906b03804f [core] Update WEBJS
Release / amd64 - chrome - chrome (push) Waiting to run
Release / amd64 - chromium - latest (push) Waiting to run
Release / linux/arm64 - chromium - arm (push) Waiting to run
Release / amd64 - none - noweb (push) Waiting to run
Release / linux/arm64 - none - noweb-arm (push) Waiting to run
2024-03-02 18:08:52 +07:00
allburov 1ed7a61bea [core] Use fork for WEBJS in Makefile 2024-03-02 18:08:31 +07:00
allburov ad6ae7ab05 [core] Bump version to 2024.3.1 2024-03-02 18:02:30 +07:00
98 changed files with 2799 additions and 349 deletions

No files matched your search

+14
View File
@@ -0,0 +1,14 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: wa_http_api
open_collective: # doks Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom:
- https://boosty.to/wa-http-api
- https://portal.devlike.pro/
-5
View File
@@ -1,8 +1,3 @@
ignore:
teams:
- no-labels
users:
- allburov
teamLabels:
- team: waha-patrons-pro
label: patron:PRO
+1 -1
View File
@@ -51,7 +51,7 @@ jobs:
id: meta
uses: docker/metadata-action@v4
with:
images: ${{ secrets.DOCKER_IMAGE }}
images: ${{ vars.DOCKER_IMAGE }}
flavor: latest=false
tags: |
type=raw,value=${{ matrix.tag }}
+84
View File
@@ -0,0 +1,84 @@
name: Manual push
on:
workflow_dispatch:
inputs:
tag:
description: 'Tag to push'
required: true
default: 'dev'
push:
description: 'Push to registry'
required: true
type: boolean
default: true
jobs:
docker-build:
runs-on: ${{ matrix.runner }}
name: ${{ matrix.platform }} - ${{ matrix.browser }} - ${{ matrix.tag }}
strategy:
matrix:
include:
# Chromium
- runner: 'buildjet-4vcpu-ubuntu-2204'
tag: 'latest'
platform: 'amd64'
browser: 'chromium'
- runner: 'buildjet-4vcpu-ubuntu-2204-arm'
tag: 'arm'
platform: 'linux/arm64'
browser: 'chromium'
# Chrome
- runner: 'buildjet-4vcpu-ubuntu-2204'
tag: 'chrome'
platform: 'amd64'
browser: 'chrome'
# Chrome is not supported on arm64
# - runner: "buildjet-4vcpu-ubuntu-2204-arm"
# tag: "chrome-arm"
# platform: "linux/arm64"
# browser: "chrome"
# No browser
- runner: 'buildjet-4vcpu-ubuntu-2204'
tag: 'noweb'
platform: 'amd64'
browser: 'none'
- runner: 'buildjet-4vcpu-ubuntu-2204-arm'
tag: 'noweb-arm'
platform: 'linux/arm64'
browser: 'none'
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: ${{ vars.DOCKER_IMAGE }}
flavor: latest=false
tags: |
type=raw,value=${{ inputs.tag }}-${{ matrix.tag }}
- name: Login to image repository
if: github.ref_type == 'tag'
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
file: Dockerfile
platforms: ${{ matrix.platform }}
build-args: |
USE_BROWSER=${{ matrix.browser }}
push: ${{ inputs.push }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
+1
View File
@@ -1,3 +1,4 @@
exclude: '^src/dashboard'
repos:
- repo: local
hooks:
+1 -1
View File
@@ -35,7 +35,7 @@ update-swagger:
wget http://localhost:3000/-json -O ./docs/site/static/swagger/openapi.json
update-dependencies:
. ${NVM_DIR}/nvm.sh && nvm exec yarn up whatsapp-web.js@https://github.com/pedroslopez/whatsapp-web.js
. ${NVM_DIR}/nvm.sh && nvm exec yarn up whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js#main-fork
. ${NVM_DIR}/nvm.sh && nvm exec yarn up @adiwajshing/baileys@github:WhiskeySockets/Baileys
. ${NVM_DIR}/nvm.sh && nvm exec yarn up venom-bot
+33 -6
View File
@@ -21,14 +21,41 @@ services:
- './.sessions:/app/.sessions'
environment:
# Environment variables from https://waha.devlike.pro/docs/how-to/config/
- WHATSAPP_RESTART_ALL_SESSIONS=True
- WHATSAPP_HOOK_URL=https://httpbin.org/post
- WHATSAPP_HOOK_EVENTS=message
# - WHATSAPP_RESTART_ALL_SESSIONS=True
# - WHATSAPP_HOOK_URL=https://httpbin.org/post
# - WHATSAPP_HOOK_EVENTS=message
# - WHATSAPP_API_HOSTNAME=localhost
- WHATSAPP_DEFAULT_ENGINE=WEBJS
- WHATSAPP_API_KEY=321
- WHATSAPP_SWAGGER_USERNAME=admin
- WHATSAPP_SWAGGER_PASSWORD=123
- WHATSAPP_API_HOSTNAME=localhost
# Username and password for Swagger
- WHATSAPP_SWAGGER_USERNAME=swagger
- WHATSAPP_SWAGGER_PASSWORD=admin
# Username and password for WAHA Dashboard
# you can use the same username and password for both Swagger and Dashboard
- WAHA_DASHBOARD_USERNAME=dashboard
- WAHA_DASHBOARD_PASSWORD=admin
restart: always
whatsapp-http-api-plus--mongodb:
image: devlikeapro/whatsapp-http-api-plus
container_name: whatsapp-http-api-plus--mongodb
ports:
- '3000:3000/tcp'
volumes:
- './.sessions:/app/.sessions'
environment:
# Environment variables from https://waha.devlike.pro/docs/how-to/config/
# - WHATSAPP_RESTART_ALL_SESSIONS=True
# - WHATSAPP_HOOK_URL=https://httpbin.org/post
# - WHATSAPP_HOOK_EVENTS=message
# - WHATSAPP_API_KEY=321
# - WHATSAPP_SWAGGER_USERNAME=admin
# - WHATSAPP_SWAGGER_PASSWORD=123
# - WAHA_DASHBOARD_USERNAME=admin
# - WAHA_DASHBOARD_PASSWORD=123
# - WHATSAPP_API_HOSTNAME=localhost
- WHATSAPP_DEFAULT_ENGINE=WEBJS
- WHATSAPP_SESSIONS_MONGO_URL=mongodb://mongodb:27017
restart: always
mongodb:
@@ -85,13 +85,13 @@
[[main]]
name = "Get on Patreon ->"
weight = 50
weight = 60
url = "https://patreon.com/wa_http_api"
parent = "waha-plus"
[[main]]
name = "Get on Boosty ->"
weight = 60
weight = 50
url = "https://boosty.to/wa-http-api"
parent = "waha-plus"
@@ -104,9 +104,14 @@
[[main]]
name = "Python ->"
weight = 21
url = "https://github.com/devlikeapro/whatsapp-http-api/tree/core/examples/python"
url = "/docs/examples/python"
parent = "examples"
[[main]]
name = "Kotlin ->"
weight = 22
url = "/docs/examples/kotlin"
parent = "examples"
[[social]]
name = "GitHub"
+1 -1
View File
@@ -110,4 +110,4 @@ lastMod = false
[menu]
[menu.section]
auto = true
collapsibleSidebar = true
collapsibleSidebar = false
@@ -0,0 +1,115 @@
---
title: "Kotlin"
description: "WhatsApp HTTP API + Kotlin examples."
lead: "WhatsApp HTTP API + Kotlin examples."
date: 2020-10-06T08:49:31+00:00
lastmod: 2020-10-06T08:49:31+00:00
draft: false
images: ["/images/kotlin-whatsapp.png"]
menu:
docs:
parent: "help"
weight: 630
toc: true
---
![](/images/kotlin-whatsapp.png)
We've created a few examples on how to interact with WAHA WhatsApp HTTP API with Kotlin (ktor).
You can find the examples in
[examples folder on GitHub with detailed instructions in README.md ->](https://github.com/devlikeapro/waha-kotlin)
## Installation
We assume that you have installed software:
1. Kotlin + JVM
2. Docker
### Download and start image
First of all, you must run WhatsApp HTTP API locally (which under the hood it
runs real WhatsApp Web instance and expose HTTP API for interaction).
Here are the steps from
[Quick Start](https://waha.devlike.pro/docs/overview/quick-start/):
Download and start WhatsApp HTTP API docker container
```bash
# Download the image
docker pull devlikeapro/whatsapp-http-api
# Run the docker container
docker run -it --rm --network=host -e WHATSAPP_HOOK_URL=http://localhost:5000/bot -e "WHATSAPP_HOOK_EVENTS=*" --name whatsapp-http-api devlikeapro/whatsapp-http-api
# It prints logs and the last line must be
# WhatsApp HTTP API is running on: http://[::1]:3000
```
#### Download image - ARM
If you're using ARM (like Apple Silicon, Apple M1, etc.) - use following
commands to download the image
![](/images/versions/core.png) For Core version the command is
```bash
# Download the image
docker pull devlikeapro/whatsapp-http-api:arm
# Rename it, so you can use devlikeapro/whatsapp-http-api image in other place
docker tag devlikeapro/whatsapp-http-api:arm devlikeapro/whatsapp-http-api
# Run the docker container
docker run -it --rm --network=host -e WHATSAPP_HOOK_URL=http://localhost:5000/bot -e "WHATSAPP_HOOK_EVENTS=*" --name whatsapp-http-api devlikeapro/whatsapp-http-api
# It prints logs and the last line must be
# WhatsApp HTTP API is running on: http://[::1]:3000
```
### Start session and scan QR
2. Open Swagger API in the browser http://localhost:3000/
3. Start session and scan QR code in swagger
1. Find `POST /api/session/start` request press **Try it out** and
**Execute** it with `default` session name
2. Find `GET /api/screenshot` and execute it - it must show QR code
3. Scan QR code on your mobile WhatsApp application (that installed on your
phone)
4. Execute `GET /api/screenshot` once again - it must show the screenshot
from WhatsApp Web.
4. Send test text message - find `POST /api/sendText` and execute it with
payload (change `12132132130` in the `chatId` to phone number that is
registered in WhatsApp).
```json
{
"chatId": "12132132130@c.us",
"text": "Hi there!",
"session": "default"
}
```
If you see **Hi there!** message then you're ready to run bots!
## WhatsApp Echo Bot
The WhatsApp Echo Bot is a sample ktor webhook server application that echoes
back to you whatever you send it. It can serve as a basic reference for how to
set up webhooks and reply to incoming messages.
```bash
# Clone the git repository with example
git clone https://github.com/devlikeapro/waha-kotlin.git
# Build and run the app
./gradlew build
./gradlew run
```
Open http://127.0.0.1:5000/bot - if you see **WhatsApp Echo Bot is ready!** then
the bot is ready to receive message!
Send message to the WhatsApp (that you used to scan QR code) and it'll echo text
back to you!
@@ -1,18 +0,0 @@
---
title: "Python"
description: "WhatsApp HTTP API Python examples."
lead: "WhatsApp HTTP API Python examples."
date: 2020-10-06T08:49:31+00:00
lastmod: 2020-10-06T08:49:31+00:00
draft: false
images: []
menu:
docs:
parent: "help"
weight: 630
toc: true
---
We've created a few examples on how to interact with WAHA WhatsApp HTTP API with Python.
You can find the examples in [examples folder on GitHub with detailed instructions in README.md](https://github.com/devlikeapro/whatsapp-http-api/tree/core/examples/python)
@@ -0,0 +1,148 @@
---
title: "Python"
description: "WhatsApp HTTP API + Python examples."
lead: "WhatsApp HTTP API + Python examples."
date: 2020-10-06T08:49:31+00:00
lastmod: 2020-10-06T08:49:31+00:00
draft: false
images: ["/images/python-whatsapp.png"]
menu:
docs:
parent: "help"
weight: 630
toc: true
---
![](/images/python-whatsapp.png)
We've created a few examples on how to interact with WAHA WhatsApp HTTP API with Python.
You can find the examples in [examples folder on GitHub with detailed instructions in README.md ->](https://github.com/devlikeapro/whatsapp-http-api/tree/core/examples/python)
## Installation
We assume that you have installed software:
1. Python 3
2. Docker
### Download and start image
First of all, you must run WhatsApp HTTP API locally (which under the hood it
runs real WhatsApp Web instance and expose HTTP API for interaction).
Here are the steps from
[Quick Start](https://waha.devlike.pro/docs/overview/quick-start/):
Download and start WhatsApp HTTP API docker container
```bash
# Download the image
docker pull devlikeapro/whatsapp-http-api
# Run the docker container
docker run -it --rm --network=host -e WHATSAPP_HOOK_URL=http://localhost:5000/bot -e "WHATSAPP_HOOK_EVENTS=*" --name whatsapp-http-api devlikeapro/whatsapp-http-api
# It prints logs and the last line must be
# WhatsApp HTTP API is running on: http://[::1]:3000
```
#### Download image - ARM
If you're using ARM (like Apple Silicon, Apple M1, etc.) - use following
commands to download the image
![](/images/versions/core.png) For Core version the command is
```bash
# Download the image
docker pull devlikeapro/whatsapp-http-api:arm
# Rename it, so you can use devlikeapro/whatsapp-http-api image in other place
docker tag devlikeapro/whatsapp-http-api:arm devlikeapro/whatsapp-http-api
# Run the docker container
docker run -it --rm --network=host -e WHATSAPP_HOOK_URL=http://localhost:5000/bot -e "WHATSAPP_HOOK_EVENTS=*" --name whatsapp-http-api devlikeapro/whatsapp-http-api
# It prints logs and the last line must be
# WhatsApp HTTP API is running on: http://[::1]:3000
```
### Start session and scan QR
2. Open Swagger API in the browser http://localhost:3000/
3. Start session and scan QR code in swagger
1. Find `POST /api/session/start` request press **Try it out** and
**Execute** it with `default` session name
2. Find `GET /api/screenshot` and execute it - it must show QR code
3. Scan QR code on your mobile WhatsApp application (that installed on your
phone)
4. Execute `GET /api/screenshot` once again - it must show the screenshot
from WhatsApp Web.
4. Send test text message - find `POST /api/sendText` and execute it with
payload (change `12132132130` in the `chatId` to phone number that is
registered in WhatsApp).
```json
{
"chatId": "12132132130@c.us",
"text": "Hi there!",
"session": "default"
}
```
If you see **Hi there!** message then you're ready to run bots!
## WhatsApp Echo Bot
The WhatsApp Echo Bot is a sample flask webhook server application that echoes
back to you whatever you send it. It can serve as a basic reference for how to
set up webhooks and reply to incoming messages.
```bash
# Clone the git repository with example
git clone https://github.com/devlikeapro/whatsapp-http-api.git
# Open python example folder
cd whatsapp-http-api/examples/python
# Install requirements
python -mpip install -r requirements.txt
# Run the bot
FLASK_APP=whatsapp_echo_bot.py flask run
```
Open http://127.0.0.1:5000/bot - if you see **WhatsApp Echo Bot is ready!** then
the bot is ready to receive message!
Send message to the WhatsApp (that you used to scan QR code) and it'll echo text
back to you!
## WhatsApp Download Files Bot
The WhatsApp Download Image Bot downloads all files people send to your WhatsApp
and log the path for the file.
**The bot works only with WAHA Plus version** available with donations. Visit
[read more about difference between Core and Plus versions](https://waha.devlike.pro/docs/how-to/plus-version/).
Download **WAHA Plus** version:
```bash
# Download the image
docker pull devlikeapro/whatsapp-http-api-plus
# Run the docker container
docker run -it --rm --network=host -e WHATSAPP_HOOK_URL=http://localhost:5000/bot -e "WHATSAPP_HOOK_EVENTS=*" --name whatsapp-http-api devlikeapro/whatsapp-http-api-plus
```
Run the WhatsApp Download Files bot:
```bash
# Clone the git repository with example
git clone https://github.com/devlikeapro/whatsapp-http-api.git
# Open python example folder
cd whatsapp-http-api/examples/python
# Install requirements
python -mpip install -r requirements.txt
# Run the bot
FLASK_APP=whatsapp_download_files_bot.py flask run
```
Open http://127.0.0.1:5000/bot - if you see **WhatsApp Download Files Bot!**
then the bot is ready to receive message with files!
@@ -26,6 +26,7 @@ The following environment variables can be used to configure the WAHA.
### Common
- `DEBUG=1`: Set this variable to any value to enable debug and verbose logs.
- You can also do it for a **specific session** by setting `config.debug` field to `true` when starting a session.
- `WHATSAPP_API_PORT=3000`: The port number that the HTTP server will listen on. The default value is `3000`.
- `WHATSAPP_API_HOSTNAME=localhost`: The hostname for the HTTP server. The default value is `localhost`.
@@ -6,7 +6,7 @@ date: 2020-10-06T08:48:45+00:00
lastmod: 2020-10-06T08:48:45+00:00
draft: false
images: [ ]
weight: 899
weight: 898
---
This page provides useful information to assist you in deploying the project.
@@ -47,18 +47,14 @@ Not running Chromium saves you CPU and Memory, so you can run more instances on
️Working with the engine requires more attention, because it's easy to be blocked with it!
⚠ Read the article before using **NOWEB** engine
Quotes from the users:
> The server has **2 CPU and 8GB** of memory. Today we have **85 sessions** in this instance.
> **400** sessions with **4CPU and 32RAM**. It's working fine.
[How to avoid blocking ->]({{< relref " /docs/overview/how-to-avoid-blocking" >}}).
### MOBILE (experimental)
{{< alert icon="👉" text="<b>Experimental engine!</b><br/>Please contact us on <a href='https://www.patreon.com/wa_http_api' target='_blank'>Patreon -></a> or <a href='https://boosty.to/wa-http-api' target='_blank'>Boosty -></a> if you're interested in using it.<br>Available for <a href='https://waha.devlike.pro/docs/how-to/plus-version/#tiers' target='_blank'>PRO</a> subscribers only" />}}
- `WHATSAPP_DEFAULT_ENGINE=MOBILE`
- [https://github.com/WhiskeySockets/Baileys](https://github.com/WhiskeySockets/Baileys)
**MOBILE** engine **does not require a browser and a mobile device** to work with WhatsApp, it does so directly using a WebSocket.
You don't have to use a mobile device to run this engine.
### VENOM
- `WHATSAPP_DEFAULT_ENGINE=VENOM`
@@ -69,17 +65,30 @@ It uses Puppeteer to run a real instance of Whatsapp Web to avoid getting blocke
## Docker images
WAHA provides few docker images with different setup.
{{< alert icon="👉" text="Use `devlikeapro/whatsapp-http-api` instead of `devlikeapro/whatsapp-http-api-plus` to get **WAHA Plus** version." />}}
For **x86** processors use following images:
- `devlikeapro/whatsapp-http-api:latest` - latest version of WAHA, using **Chromium** (does not support video receiving and receiving in Plus version)
- `devlikeapro/whatsapp-http-api:chrome` - latest version of WAHA, using **Chrome** (supports video receiving and receiving in Plus version)
- `devlikeapro/whatsapp-http-api:noweb`- latest version of WAHA, **no browser installed** - use it only for **NOWEB** engine
| Image | CPU | Browser |
|---------------------------------------------------------|-----|-------------------------|
| [WAHA Plus]({{< relref "/docs/how-to/plus-version" >}}) | | |
| `devlikeapro/whatsapp-http-api-plus:latest` | x86 | Chromium |
| `devlikeapro/whatsapp-http-api-plus:chrome` | x86 | Chrome (supports video) |
| `devlikeapro/whatsapp-http-api-plus:noweb` | x86 | None |
| `devlikeapro/whatsapp-http-api-plus:arm` | ARM | Chromium |
| `devlikeapro/whatsapp-http-api-plus:noweb-arm` | ARM | None |
| **WAHA Core** | | |
| `devlikeapro/whatsapp-http-api:latest` | x86 | Chromium |
| `devlikeapro/whatsapp-http-api:chrome` | x86 | Chrome |
| `devlikeapro/whatsapp-http-api:noweb` | x86 | None |
| `devlikeapro/whatsapp-http-api:arm` | ARM | Chromium |
| `devlikeapro/whatsapp-http-api:noweb-arm` | ARM | None |
For **ARM** processors use following images:
- `devlikeapro/whatsapp-http-api:arm` - **Chromium**
- `devlikeapro/whatsapp-http-api:noweb-arm`- **no browser installed**
Browsers:
- **Chromium** - is the default browser for **WAHA**. It's a good choice for most cases.
- **Chrome** - is a good choice if you need to receive videos in Plus version.
- **None** - is a good choice if you want to use **NOWEB** engine.
CPU:
- **x86** - is a good choice for most cases.
- **ARM** - is a good choice if you're using ARM processors (like Apple Silicon, Apple M1, etc.)
{{< alert icon="💡" text="Chrome version is not available in ARM" />}}
## Features
@@ -96,7 +105,7 @@ Here, you will find a list of supported endpoints and webhooks per engine.
If you don't specify `WHATSAPP_DEFAULT_ENGINE` environment variable - look at **WEBJS** engine,
it's the engine WAHA runs by default.
### Engine
### Protocols
| | WEBJS | NOWEB | VENOM |
|--------------------------------------------------------------|:-----:|:-----:|:-----:|
@@ -120,30 +129,31 @@ please [create an issue](https://github.com/devlikeapro/whatsapp-http-api/issues
| `POST /api/{session}/auth/qr` | ✔️ | ✔️ | ✔️ |
| `POST /api/{session}/auth/request-code` | ➖ | ✔️ | ➖ |
| `POST /api/{session}/auth/authorize-code` | ➖ | ➖️<br>[#113](https://github.com/devlikeapro/whatsapp-http-api/issues/113) | ➖ |
| `GET /api/{session}/auth/captcha` <br>Only in **MOBILE** engine | ➖ | ➖ | ➖ |
| `POST /api/{session}/auth/captcha` <br>Only in **MOBILE** engine | ➖ | ➖ | ➖ |
| **Screenshot** | | | |
| `POST /api/screenshot` | ✔️ | ➖ | ✔️ |
| **Chatting** | WEBJS | NOWEB | VENOM |
|------------------------------------------------------|:-----:|:-----:|:-----:|
| `GET /api/checkNumberStatus` | ✔️ | ✔️ | ✔️ |
| `GET /api/sendContactVcard` | ➖ | ➖ | ✔️ |
| `GET /api/sendText` | ✔️ | ✔️ | ✔️ |
| `POST /api/sendText` | ✔️ | ✔️ | ✔️ |
| `POST /api/sendPoll` | ➖ | ✔️ | ➖ |
| `POST /api/sendLocation` | ✔️ | ✔️ | ✔️ |
| `POST /api/sendLinkPreview` | ➖ | ✔️ | ✔️ |
| `POST /api/sendImage` ![](/images/versions/plus.png) | ✔️ | ✔️ | ✔️ |
| `POST /api/sendFile` ![](/images/versions/plus.png) | ✔️ | ✔️ | ✔️ |
| `POST /api/sendVoice` ![](/images/versions/plus.png) | ✔️ | ✔️ | ✔️ |
| `POST /api/sendVideo` ![](/images/versions/plus.png) | ✔️ | ✔️ | ➖ |
| `POST /api/reply` | ✔️ | ✔️ | ✔️ |
| `POST /api/sendSeen` | ✔️ | ✔️ | ✔️ |
| `POST /api/startTyping` | ✔️ | ✔️ | ✔️ |
| `POST /api/stopTyping` | ✔️ | ✔️ | ➖ |
| `POST /api/reaction` | ✔️ | ✔️ | ➖ |
| `GET /api/messages` | ✔️ | ➖ | ✔️ |
| **Chatting** | WEBJS | NOWEB | VENOM |
|-------------------------------------------------------------|:-----:|:-----:|:-----:|
| `GET /api/checkNumberStatus` | ✔️ | ✔️ | ✔️ |
| `GET /api/sendContactVcard` | ➖ | ✔️ | ➖ |
| `GET /api/sendText` | ✔️ | ✔️ | ✔️ |
| `POST /api/sendText` | ✔️ | ✔️ | ✔️ |
| `POST /api/reply` | ✔️ | ✔️ | ✔️ |
| `PUT /api/{session}/chats/{chatId}/messages/{messageId}` | ✔️ | ✔️ | ➖ |
| `DELETE /api/{session}/chats/{chatId}/messages/{messageId}` | ✔️ | ✔️ | ➖ |
| `POST /api/sendPoll` | ➖ | ✔️ | ➖ |
| `POST /api/sendLocation` | ✔️ | ✔️ | ✔️ |
| `POST /api/sendLinkPreview` | ➖ | ✔️ | ✔️ |
| `POST /api/sendImage` ![](/images/versions/plus.png) | ✔️ | ✔️ | ✔️ |
| `POST /api/sendFile` ![](/images/versions/plus.png) | ✔️ | ✔️ | ✔️ |
| `POST /api/sendVoice` ![](/images/versions/plus.png) | ✔️ | ✔️ | ✔️ |
| `POST /api/sendVideo` ![](/images/versions/plus.png) | ✔️ | ✔️ | ➖ |
| `POST /api/sendSeen` | ✔️ | ✔️ | ✔️ |
| `POST /api/startTyping` | ✔️ | ✔️ | ✔️ |
| `POST /api/stopTyping` | ✔️ | ✔️ | ➖ |
| `POST /api/reaction` | ✔️ | ✔️ | ➖ |
| `POST /api/star` | ✔️ | ✔️ | ➖ |
| `GET /api/messages` | ✔️ | ➖ | ✔️ |
| | WEBJS | NOWEB | VENOM |
|-------------------------------------------------------------------|:-----:|:-----:|:-----:|
@@ -157,33 +167,37 @@ please [create an issue](https://github.com/devlikeapro/whatsapp-http-api/issues
| `DELETE /api/{session}/chats/{chatId}` | ✔️ | ➖ | ➖ |
| `GET /api/{session}/chats/{chatId}/messages` | ✔️ | ➖ | ✔️ |
| `DELETE /api/{session}/chats/{chatId}/messages` | ✔️ | ➖ | ➖ |
| `PUT /api/{session}/chats/{chatId}/messages/{messageId}` | ✔️ | ✔️ | ➖ |
| `DELETE /api/{session}/chats/{chatId}/messages/{messageId}` | ✔️ | ✔️ | ➖ |
| **Contacts** | | | |
| `GET /api/contacts` | ✔️ | ➖ | ➖ |
| `GET /api/contacts/all` | ✔️ | ➖ | ➖ |
| `GET /api/contacts/check-exists` | ✔️ | ✔️ | ✔️ |
| `GET /api/contacts/about` | ✔️ | ➖ | ➖ |
| `GET /api/contacts/profile-picture` | ✔️ | ➖ | ➖ |
| `GET /api/contacts/profile-picture` | ✔️ | ✔️ | ➖ |
| `POST /api/contacts/block` | ✔️ | ➖ | ➖ |
| `POST /api/contacts/unblock` | ✔️ | ➖ | ➖ |
| **Groups** | WEBJS | NOWEB | VENOM |
|--------------------------------------------------------------------|:-----:|:-----:|:-----:|
| `POST /api/{session}/groups` | ✔️ | ✔️ | ➖ |
| `GET /api/{session}/groups` | ✔️ | ✔️ | ➖ |
| `GET /api/{session}/groups/{id}` | ✔️ | ✔️ | ➖ |
| `DELETE /api/{session}/groups/{id}` | ✔️ | ➖ | ➖ |
| `GET /api/{session}/groups/{id}/settings/security/info-admin-only` | ✔️ | ➖ | ➖ |
| `PUT /api/{session}/groups/{id}/settings/security/info-admin-only` | ✔️ | ➖ | ➖ |
| `POST /api/{session}/groups/{id}/leave` | ✔️ | ✔️ | ➖ |
| `PUT /api/{session}/groups/{id}/description` | ✔️ | ✔️ | ➖ |
| `PUT /api/{session}/groups/{id}/subject` | ✔️ | ✔️ | ➖ |
| `GET /api/{session}/groups/{id}/invite-code` | ✔️ | ✔️ | ➖ |
| `POST /api/{session}/groups/{id}/invite-code/revoke` | ✔️ | ✔️ | ➖ |
| `GET /api/{session}/groups/{id}/participants` | ✔️ | ✔️ | ➖ |
| `POST /api/{session}/groups/{id}/participants/add` | ✔️ | ✔️ | ➖ |
| `POST /api/{session}/groups/{id}/participants/remove` | ✔️ | ✔️ | ➖ |
| `POST /api/{session}/groups/{id}/admin/promote` | ✔️ | ✔️ | ➖ |
| `POST /api/{session}/groups/{id}/admin/demote` | ✔️ | ✔️ | ➖ |
| **Groups** | WEBJS | NOWEB | VENOM |
|------------------------------------------------------------------------|:-----:|:-----:|:-----:|
| `POST /api/{session}/groups` | ✔️ | ✔️ | ➖ |
| `GET /api/{session}/groups` | ✔️ | ✔️ | ➖ |
| `GET /api/{session}/groups/{id}` | ✔️ | ✔️ | ➖ |
| `DELETE /api/{session}/groups/{id}` | ✔️ | ➖ | ➖ |
| `GET /api/{session}/groups/{id}/settings/security/info-admin-only` | ✔️ | ➖ | ➖ |
| `PUT /api/{session}/groups/{id}/settings/security/info-admin-only` | ✔️ | ➖ | ➖ |
| `GET /api/{session}/groups/{id}/settings/security/messages-admin-only` | ✔️ | ➖ | ➖ |
| `PUT /api/{session}/groups/{id}/settings/security/messages-admin-only` | ✔️ | ➖ | ➖ |
| `POST /api/{session}/groups/{id}/leave` | ✔️ | ✔️ | ➖ |
| `PUT /api/{session}/groups/{id}/description` | ✔️ | ✔️ | ➖ |
| `PUT /api/{session}/groups/{id}/subject` | ✔️ | ✔️ | ➖ |
| `GET /api/{session}/groups/{id}/invite-code` | ✔️ | ✔️ | ➖ |
| `POST /api/{session}/groups/{id}/invite-code/revoke` | ✔️ | ✔️ | ➖ |
| `GET /api/{session}/groups/{id}/participants` | ✔️ | ✔️ | ➖ |
| `POST /api/{session}/groups/{id}/participants/add` | ✔️ | ✔️ | ➖ |
| `POST /api/{session}/groups/{id}/participants/remove` | ✔️ | ✔️ | ➖ |
| `POST /api/{session}/groups/{id}/admin/promote` | ✔️ | ✔️ | ➖ |
| `POST /api/{session}/groups/{id}/admin/demote` | ✔️ | ✔️ | ➖ |
| | WEBJS | NOWEB | VENOM |
|---------------------------------------------------|:-----:|:-----:|:-----:|
@@ -196,10 +210,13 @@ please [create an issue](https://github.com/devlikeapro/whatsapp-http-api/issues
| `GET /api/version` | ➖ | ✔️ | ➖ |
| `GET /health` ![](/images/versions/plus.png) | ✔️ | ✔️ | ✔️ |
### Webhooks
| **Webhooks** | WEBJS | NOWEB | VENOM |
|-----------------------------------------------------|:-----:|:-----:|:-----:|
| `message` | ✔️ | ✔️ | ✔️ |
| `message` with files ![](/images/versions/plus.png) | ✔️ | ✔️ | ✔️ |
| `message.reaction` | ✔️ | ✔️ | ➖ |
| `message.any` | ✔️ | ✔️ | ✔️ |
| `message.ack` | ✔️ | ✔️ | ✔️ |
| `message.revoked` | ✔️ | ➖ | ➖ |
@@ -87,22 +87,47 @@ Request:
}
```
### Settings
#### Security for group info
### Security - update group info
Updates the group settings to only allow admins to edit group info (title, description, photo).
`PUT /api/{session}/groups/{groupId}/settings/security/info-admin-only`
```json
{
"adminsOnly": true
}
```
Get the group settings to only allow admins to edit group info (title, description, photo).
`GET /api/{session}/groups/{groupId}/settings/security/info-admin-only`
```json
{
"adminsOnly": true
}
```
`PUT /api/{session}/groups/{groupId}/settings/security/info-admin-only`
The request doesn't require any request's body and
**can't be used to disable the security setting (allow ANY to edit group info)**.
If you wish to have that ability - please [create an issue](https://github.com/devlikeapro/whatsapp-http-api/issues)
Returns `true` if the setting was properly updated. This can return false if the user does not have the necessary permissions.
### Security - who can send messages
Updates the group settings to only allow admins to send messages.
`PUT /api/{session}/groups/{groupId}/settings/security/messages-admin-only`
```json
{
"adminsOnly": true
}
```
Returns `true` if the setting was properly updated. This can return false if the user does not have the necessary permissions.
Get the group settings to only allow admins to send messages.
`GET /api/{session}/groups/{groupId}/settings/security/messages-admin-only`
```json
{
"adminsOnly": true
}
```
### Participants
#### Get participants
@@ -49,26 +49,48 @@ Treat **WAHA Plus** it as an additional episode, behind-the-scenes videos, our n
We donate most of the donations down to the stream to the underlying libraries and tools - JS-community, Node, other libraries authors, personal contributors.
By donating to the **WAHA** you donate to the Open Source world!
### Tiers
## Tiers
The more you support the project - the more you get!
| | Core | Plus | Advanced | Pro |
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------|---------|:--------:|:-------:|
| Messages limit | **∞** | **∞** | **∞** | **∞** |
| [Send and receive text messages ->]({{< relref "/docs/how-to/send-messages" >}}) | ✔️ | ✔️ | ✔️ | ✔️ |
| No license checks on installed instances | ✔️ | ✔️ | ✔️ | ✔️ |
| [Sessions limit ->]({{< relref "/docs/how-to/sessions" >}}) | **1** | **∞** | **∞** | **∞** |
| [Send and receive files ->]({{< relref "/docs/how-to/send-messages" >}}) | ➖️ | ✔️ | ✔️ | ✔️ |
| [Built-in Security ->]({{< relref "/docs/how-to/security" >}}) | ➖️ | ✔️ | ✔️ | ✔️ |
| [**Webhook retries** →]({{< relref "/docs/how-to/receive-messages#retries" >}}) | ➖️ | ✔️ | ✔️ | ✔️ |
| [MongoDB support ->]({{< relref "/docs/how-to/storages" >}}) | ➖️ | ✔️ | ✔️ | ✔️ |
| Access to **WAHA Plus** ![](/images/versions/plus.png) docker image with a personal key. | ➖️ | ✔️ | ✔️ | ✔️ |
| Special badge ([![patron:TIER](https://img.shields.io/badge/patron-TIER-188a42)](https://waha.devlike.pro/docs/how-to/plus-version/#tiers)) and labels (`patron:TIER`) on [project's issues, PRs and Discussion](https://github.com/devlikeapro/whatsapp-http-api) to highlight your support to the project! | | ✔️ | ✔️ | ✔️ |
| An invitation to **a private Github repository** so you have the **WAHA Plus** source code. | ➖️ | ➖️ | ✔️ | ✔️️ |
| Access to a Telegram group where we provide support and assistance. | ➖️ | ➖️ | ➖ | ✔️ |
| Access to an [experimental MOBILE engine]({{< relref "/docs/how-to/plus-version#tiers" >}})!. | ➖️ | ➖️ | ➖ | ✔️ |
| **Donation** | **FREE** | **$19** | **$39** | **$99** |
### Core
| Essential product for your needs! | |
|----------------------------------------------------------------------------------|----------|
| [Send and receive text messages ->]({{< relref "/docs/how-to/send-messages" >}}) | ✔️ |
| [Webhooks ->]({{< relref "/docs/how-to/webhooks" >}}) | ✔️ |
| No license checks on installed instances | ✔️ |
| Messages limit | **∞** |
| [Sessions limit ->]({{< relref "/docs/how-to/sessions" >}}) | **1** |
| **Donation** | **FREE** |
### Plus
| Optimize your experience with extra perks! | |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|
| All in **Core** | ✔️ |
| [Sessions limit ->]({{< relref "/docs/how-to/sessions" >}}) | **∞** |
| [Send and receive files ->]({{< relref "/docs/how-to/send-messages" >}}) | ✔️ |
| [Built-in Security ->]({{< relref "/docs/how-to/security" >}}) | ✔️ |
| [Webhook retries →]({{< relref "/docs/how-to/receive-messages#retries" >}}) | ✔️ |
| [MongoDB support ->]({{< relref "/docs/how-to/storages" >}}) | ✔️ |
| Access to **WAHA Plus** docker image with a personal key. | ✔️ |
| [![patron:PLUS](https://img.shields.io/badge/patron-PLUS-a0e6ba)](https://waha.devlike.pro/docs/how-to/plus-version/#tiers) badge and `patron:PLUS` label on [project's issues, PRs and Discussion](https://github.com/devlikeapro/whatsapp-http-api) to highlight your support to the project! | ✔️ |
| Built-in [WAHA Dashboard]({{< relref "/docs/how-to/waha-dashboard" >}}) - UI to manage your sessions! | ✔️ |
| Access to the **WAHA Plus** **source code** (in a private Github repository). | ➖ |
| Membership to the **WAHA Discord server** for receiving personal support, and sharing your experiences with other professionals. | ➖ |
| [WAHA Hub]({{< relref "/docs/waha-hub/introduction" >}}) - a single place to manage multiple servers! | ➖ |
| **Donation** | **$19** |
### Pro
| Exclusive perks for the PROfessionals! | |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|
| All in **Plus** | ✔️ |
| [![patron:PRO](https://img.shields.io/badge/patron-PRO-188a42)](https://waha.devlike.pro/docs/how-to/plus-version/#tiers) badge and `patron:PRO` label on [project's issues, PRs and Discussion](https://github.com/devlikeapro/whatsapp-http-api) to highlight your support to the project! | ✔️ |
| Access to the **WAHA Plus** **source code** (in a private Github repository). | ✔️ |
| Membership to the **WAHA Discord server** for receiving personal support, and sharing your experiences with other professionals. | ✔️ |
| [WAHA Hub]({{< relref "/docs/waha-hub/introduction" >}}) - a single place to manage multiple servers! | ✔️ |
| **Donation** | **$99** |
For **$19** donation you get:
1. **Secret password** for Docker Hub to download Plus image: `devlikeapro/whatsapp-http-api-plus`.
@@ -79,40 +101,28 @@ For **$19** donation you get:
{{< alert icon="💡" text="If you stay subscribed - the donation amount will never change for you and always be $19 to get monthly updates!" />}}
### Why WAHA?
## Why WAHA?
What is the difference between **WAHA Plus** and **other SaaS solutions** for WhatsApp HTTP API?
| | WAHA Plus | Others |
|--------------------|:-------------------------------------------------:|----------------------------------------------------------------------------------:|
| **Sessions** | ✔️ No limits on **accounts** or **servers**! | ➖ One account for $50/month. |
| **Infrastructure** | ✔️ On-Premise - your server, your infrastructure! | ➖ Insecure cloud solution. |
| **Security** | ✔️ No data leaks! | ➖ You have to give access to customers' data - phone number, name, your messages. |
| **License Term** | ✔️ No license checks! | ➖ One month |
| **Message price** | ✔️ All messages are Free! | ➖ Some solutions have a price for messages - $1/100 messages. |
| **Expenses** | ✔️ $19 **donation**! | ➖ Monthly payment starts from $50 |
| WAHA Plus | Others |
|:-------------------------------------------------:|----------------------------------------------------------------------------------:|
| ✔️ No limits on **accounts** or **servers**! | ➖ One account for $50/month. |
| ✔️ On-Premise - your server, your infrastructure! | ➖ Insecure cloud solution. |
| ✔️ No data leaks! | ➖ You have to give access to customers' data - phone number, name, your messages. |
| ✔️ No license checks! | ➖ One month |
| ✔️ All messages are **Free**! | ➖ Some solutions have a price for messages - $1/100 messages. |
| ✔️ $19 **donation**! | ➖ Monthly payment starts from $50 |
{{< alert icon="💡" text="If you stay subscribed - the donation amount will never change for you and always be $19 to get monthly updates!" />}}
## Get Plus ![](/images/versions/plus.png)
### Patreon
<p align="center">
<img src="patreon.png" alt="Patreon" />
</p>
Support the project and get WAHA Plus version on
<a href="https://patreon.com/wa_http_api" target="_blank">
<b>
Patreon ->
</b>
</a>
Go ahead and get your own WhatsApp HTTP API!
{{< alert icon="💡" text="If you stay subscribed - the donation amount will never change for you and always be $19 to get monthly updates!" />}}
### Boosty
<p align="center">
<img src="boosty.svg" alt="Patreon" />
<img src="boosty.svg" alt="Patreon" style='width: 40%'/>
<br/>
<br/>
</p>
@@ -126,7 +136,53 @@ Boosty ->
Go ahead and get your own WhatsApp HTTP API!
## Install Plus
### Patreon
<p align="center">
<img src="patreon.png" alt="Patreon" style='width: 40%'/>
</p>
{{< alert icon="🙏" text="Please consider using Boosty instead of Patreon due to its lower fees 🙏" />}}
Support the project and get WAHA Plus version on
<a href="https://patreon.com/wa_http_api" target="_blank">
<b>
Patreon ->
</b>
</a>
Go ahead and get your own WhatsApp HTTP API!
### Crypto
<p align="center">
<img src="tether-usdt-logo.svg" alt="Tether Logo" style='width: 40%'/>
</p>
If you wish to donate in crypto - please contact us at [crypto@devlike.pro](mailto:crypto@devlike.pro)
with the desired **amount**, **currency** and **network**.
> e.g. "I want to donate $99 in USDT using TRC20 network."
## Patron Portal
<p align="center">
<img src="patron-portal.png" alt="Patron Portal" />
<br/>
<br/>
</p>
After subscribing on Patreon or Boosty, you will get access to the [WAHA Patron Portal ->](https://portal.devlike.pro/)
where you will get the password to download the Plus image and manage your perks!
Read more about Patron Portal in
**<a href="https://www.patreon.com/posts/waha-patron-97637416" target="_blank">Patreon -> </a>**
or
**<a href="https://boosty.to/wa-http-api/posts/8319079f-dac1-4179-b954-fcc559097c76" target="_blank">Boosty -></a>**
posts.
### Install Plus
After you get the password, get your login to Docker Hub in [Patron Portal ->](https://portal.devlike.pro/)
and run the commands:
```bash
Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

@@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 339.43 295.27"><title>tether-usdt-logo</title><path d="M62.15,1.45l-61.89,130a2.52,2.52,0,0,0,.54,2.94L167.95,294.56a2.55,2.55,0,0,0,3.53,0L338.63,134.4a2.52,2.52,0,0,0,.54-2.94l-61.89-130A2.5,2.5,0,0,0,275,0H64.45a2.5,2.5,0,0,0-2.3,1.45h0Z" style="fill:#50af95;fill-rule:evenodd"/><path d="M191.19,144.8v0c-1.2.09-7.4,0.46-21.23,0.46-11,0-18.81-.33-21.55-0.46v0c-42.51-1.87-74.24-9.27-74.24-18.13s31.73-16.25,74.24-18.15v28.91c2.78,0.2,10.74.67,21.74,0.67,13.2,0,19.81-.55,21-0.66v-28.9c42.42,1.89,74.08,9.29,74.08,18.13s-31.65,16.24-74.08,18.12h0Zm0-39.25V79.68h59.2V40.23H89.21V79.68H148.4v25.86c-48.11,2.21-84.29,11.74-84.29,23.16s36.18,20.94,84.29,23.16v82.9h42.78V151.83c48-2.21,84.12-11.73,84.12-23.14s-36.09-20.93-84.12-23.15h0Zm0,0h0Z" style="fill:#fff;fill-rule:evenodd"/></svg>

After

Width:  |  Height:  |  Size: 874 B

@@ -115,6 +115,43 @@ Fired on all message creations, including your own. The payload is the same as f
}
```
### message.reaction
Receive events when a message is reacted to by a user (or **yourself** reacting to a message).
- `payload.reaction.text` - emoji that was used to react to the message. It'll be an empty string if the reaction was removed.
- `payload.reaction.messageId` - id of the message that was reacted to.
```json
{
"event": "message.reaction",
"session": "default",
"me": {
"id": "79222222222@c.us",
"pushName": "WAHA"
},
"payload": {
"id": "false_79111111@c.us_11111111111111111111111111111111",
"from": "79111111@c.us",
"fromMe": false,
"participant": "79111111@c.us",
"to": "79111111@c.us",
"timestamp": 1710481111.853,
"reaction": {
"text": "🙏",
"messageId": "true_79111111@c.us_11111111111111111111111111111111"
}
},
"engine": "WEBJS",
"environment": {
"version": "2024.3.3",
"engine": "WEBJS",
"tier": "PLUS",
"browser": "/usr/bin/google-chrome-stable"
}
}
```
{{< alert icon="👉" text="NOWEB engine note - reactions were sent in 'message' and 'message.any' events, not it's available only in 'message.reaction'!" />}}
### message.ack
Receive events when server or recipient gets the message, read or played it.
@@ -15,7 +15,9 @@ We do not recommend exposing the API on any public networks!
Either protect the API with [Api Key](https://www.fortinet.com/resources/cyberglossary/api-key) or deny access by using
firewalls.
## Swagger Security ![](/images/versions/plus.png)
👉 Security options are available in [**WAHA Plus**]({{< relref "plus-version#plus" >}}) ![](/images/versions/plus.png) version only.
## Swagger Security
### Username and password
If you want to hide the project Swagger panel under the password - run the following command to hide under `admin/admin`
login and password.
@@ -35,8 +37,15 @@ You also can hide swagger completely by setting `WHATSAPP_SWAGGER_ENABLED=false`
{{< alert icon="👉" text="Disabling Swagger does not protect the API, please use API security as well" />}}
## Dashboard Security
When running WAHA you can set the following environment variables to configure the dashboard:
- `WAHA_DASHBOARD_ENABLED=true` - enable or disable the dashboard, by default `true`. Set to `false` to disable the dashboard.
- `WAHA_DASHBOARD_USERNAME=waha` - username used to log in, by default `waha`.
- `WAHA_DASHBOARD_PASSWORD=waha` - password used to log in, by default `waha`.
## API security ![](/images/versions/plus.png)
Read more about [**Dashboard ->**]({{< relref "/docs/how-to/waha-dashboard" >}})
## API security
You can protect the API by requiring Api Key in a request's headers.
@@ -72,7 +81,7 @@ headers = {
requests.get("http://localhost:3000/api/sessions", headers=headers)
```
## Webhook security ![](/images/versions/plus.png)
## Webhook security
To make sure that you get a webhook from your WAHA instance - you can use **HMAC authentication**.
Read more about it on [Webhooks page ->]({{< relref "/docs/how-to/webhooks#hmac-authentication" >}})
@@ -57,6 +57,7 @@ To send text message - use `POST /api/sendText` with example payload.
"text": "Hi there!"
}
```
#### Mention contact
If you send a message in a group and want to mention a participant in the message -
use `mentions` field for that in `POST /api/sendText` request.
@@ -75,11 +76,6 @@ also mention it in `mentions` in format `2132132130@c.us`
}
```
### Send poll
We have a dedicated page [how to send polls and receive votes]({{< relref "/docs/how-to/polls" >}})!
![](poll-example.jpg)
### Reply on message
To reply on a message - use `POST /api/reply` with example payload.
```json
@@ -94,6 +90,46 @@ To reply on a message - use `POST /api/reply` with example payload.
#### Reply files ![](/images/versions/plus-soon.png)
WAHA does not support reply with files (images, voice, etc.). If you're interested in it - please create an issue in GitHub.
### Edit message
You can edit **text** messages or **"caption"** in media messages.
```
PUT /api/{session}/chats/{chatId}/messages/{messageId}
```
👉 Remember to escape `@` in `chatId` and `messageId` with `%40`.
So if you want to edit `true_123@c.us_AAA` message in `123@c.us` chat you need to send request to:
```
PUT /api/{session}/chats/123%40c.us/messages/true_123%40c.us_AAA
```
**Payload:**
```json
{
"text": "Hello, world!"
}
```
### Delete message
You can delete messages from the chat.
```
DELETE /api/{session}/chats/{chatId}/messages/{messageId}
```
👉 Remember to escape `@` in `chatId` and `messageId` with `%40`.
So if you want to delete `true_123@c.us_AAA` message in `123@c.us` chat you need to send request to:
```
DELETE /api/{session}/chats/123%40c.us/messages/true_123%40c.us_AAA
```
### Send poll
We have a dedicated page [how to send polls and receive votes]({{< relref "/docs/how-to/polls" >}})!
![](poll-example.jpg)
### Add a reaction
Use `PUT /api/reaction` method to set reaction to a message.
@@ -116,6 +152,85 @@ To remove reaction from a message - send empty string in the reaction request.
}
```
### Star and unstar message
Use `PUT /api/star` method to star or unstar a message.
{{< alert icon="👉" text="Star API uses PUT, not POST request! Please make sure you send right request." />}}
**Star:**
```json
{
"messageId": "false_71111111111@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"chatId": "71111111111@c.us",
"star": true,
"session": "default"
}
```
**Unstar:**
```json
{
"messageId": "false_71111111111@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"chatId": "71111111111@c.us",
"star": false,
"session": "default"
}
```
### Send contact (vcard)
Use `POST /api/sendContactVcard` to send contact (vcard).
You can use fields this way:
```json
{
"session": "default",
"chatId": "79111111@c.us",
"contacts": [
{
"fullName": "John Doe",
"organization": "Company Name",
"phoneNumber": "+91 11111 11111",
"whatsappId": "911111111111"
}
]
}
```
Or provide a vCard file content:
```json
{
"session": "default",
"chatId": "79111111@c.us",
"contacts": [
{
"vcard": "BEGIN:VCARD\nVERSION:3.0\nFN:Jane Doe\nORG:Company Name;\nTEL;type=CELL;type=VOICE;waid=911111111111:+91 11111 11111\nEND:VCARD"
}
]
}
```
Or even combine it:
```json
{
"chatId": "79111111@c.us",
"contacts": [
{
"vcard": "BEGIN:VCARD\nVERSION:3.0\nFN:Jane Doe\nORG:Company Name;\nTEL;type=CELL;type=VOICE;waid=911111111111:+91 11111 11111\nEND:VCARD"
},
{
"fullName": "John Doe",
"organization": "Company Name",
"phoneNumber": "+91 11111 11111",
"whatsappId": "911111111111"
}
],
"session": "default"
}
```
### Send image ![](/images/versions/plus.png)
Use `POST /api/sendImage` to send images.
@@ -158,6 +273,8 @@ You can send voice messages in two ways:
1. Provide a URL for the voice.
2. Encode the whole file content into base64 and send it in the request body.
Please make sure your file has **OPUS** encoding and packed in OGG container.
#### URL
```json
{
@@ -165,8 +282,7 @@ You can send voice messages in two ways:
"chatId": "11111111111@c.us",
"file": {
"mimetype": "audio/ogg; codecs=opus",
"filename": "voice-message.mp3",
"url": "https://github.com/devlikeapro/whatsapp-http-api/raw/core/examples/dev.likeapro.mp3"
"url": "https://github.com/devlikeapro/whatsapp-http-api/raw/core/examples/dev.likeapro.opus"
},
"caption": "string"
}
@@ -204,7 +320,7 @@ You can send voice messages in two ways:
"file": {
"mimetype": "video/mp4",
"filename": "video.mp4",
"url": "https://github.com/devlikeapro/whatsapp-http-api/raw/core/examples/dev.likeapro.mp3"
"url": "https://github.com/devlikeapro/whatsapp-http-api/raw/core/examples/video.mp4"
}
}
```
@@ -233,13 +349,14 @@ You can send files in two ways:
#### URL
```json
{
"session": "default",
"caption": "Check this out!",
"chatId": "11111111111@c.us",
"file": {
"mimetype": "image/jpeg",
"filename": "filename.jpeg",
"url": "https://github.com/devlikeapro/whatsapp-http-api/raw/main/docs/dev.likeapro.jpg"
},
"session": "default"
"url": "https://raw.githubusercontent.com/devlikeapro/whatsapp-http-api/core/examples/video.mp4"
}
}
```
@@ -84,6 +84,20 @@ Read more about it in [Autostart section](#autostart).
You can configure proxy when for all sessions by set up environment variables.
Read more about it on [**Configuration page** ->]({{< relref "/docs/how-to/config#proxy" >}}).
#### Enable debug
You can enable debug mode for a session by setting `config.debug` field to `true`.
It'll show you more logs in the console.
Can be useful for debugging purposes when you're experiencing some issues.
```json
{
"name": "default",
"config": {
"debug": true
}
}
```
### List
To get session list - call `GET /api/sessions`.
@@ -94,7 +108,30 @@ The response:
[
{
"name": "default",
"status": "STARTING"
"status": "WORKING",
"config": {
"proxy": null,
"webhooks": [
{
"url": "https://httpbin.org/post",
"events": [
"message",
"session.status"
],
"hmac": null,
"retries": null,
"customHeaders": null
}
],
"debug": false
},
"me": {
"id": "79111111@c.us",
"pushName": "WAHA"
},
"engine": {
"engine": "NOWEB"
}
}
]
```
@@ -103,6 +140,38 @@ You can add `?all=true` parameter to the request `GET /api/session?all=True` it'
including **STOPPED**,
so you can know which one will be restarted if you set `WHATSAPP_RESTART_ALL_SESSIONS=True` environment variable.
### Get session
To get information about a specific session - call `GET /api/sessions/{session}`.
```json
{
"name": "default",
"status": "WORKING",
"config": {
"proxy": null,
"webhooks": [
{
"url": "https://httpbin.org/post",
"events": [
"message",
"session.status"
],
"hmac": null,
"retries": null,
"customHeaders": null
}
],
"debug": false
},
"me": {
"id": "79111111@c.us",
"pushName": "WAHA"
},
"engine": {
"engine": "NOWEB"
}
}
```
### Stop
In order to stop a new session - call `POST /api/sessions/stop`
@@ -0,0 +1,63 @@
---
title: "Dashboard"
description: "Dashboard"
lead: ""
date: 2020-10-06T08:48:45+00:00
lastmod: 2020-10-06T08:48:45+00:00
draft: false
images: [ ]
weight: 110
---
## Overview
**WAHA Dashboard** is a UI to manage your WhatsApp sessions!
![WAHA Dashboard](waha-dashboard.png)
<div class="text-center">
<a href="./waha-dashboard.png" target="_blank">See full size image</a>
</div>
<br/>
👉 **WAHA Dashboard** is available in [**WAHA Plus**]({{< relref "plus-version#plus" >}}) ![](/images/versions/plus.png) version only.
You can access **WAHA Dashboard** by running the project and opening
<a href="http://localhost:3000/dashboard" target="_blank">http://localhost:3000/dashboard</a>
(or similar, but with <a href="/dashboard" target="_blank">/dashboard</a> at the end).
ℹ️ **Default username and password**: `waha/waha`
```bash
docker run -it -p 3000:3000/tcp devlikeapro/whatsapp-http-api-plus
```
If you're using [API Key]({{< relref "security" >}}), remember to set up the key in the dashboard.
![WAHA Dashboard with API Key](waha-dashboard-key.png)
<div class="text-center">
<a href="./waha-dashboard-key.png" target="_blank">See full size image</a>
</div>
<br/>
## Configuration
When running WAHA you can set the following environment variables to configure the dashboard:
- `WAHA_DASHBOARD_ENABLED=true` - enable or disable the dashboard, by default `true`. Set to `false` to disable the
dashboard.
- `WAHA_DASHBOARD_USERNAME=waha` - username used to log in, by default `waha`.
- `WAHA_DASHBOARD_PASSWORD=waha` - password used to log in, by default `waha`.
```bash
docker run -it -p 3000:3000/tcp -e WAHA_DASHBOARD_USERNAME=waha -e WAHA_DASHBOARD_PASSWORD=waha devlikeapro/whatsapp-http-api-plus
```
## Multiple servers
If you wish to connect, control and manage multiple servers in a single "dashboard", consider using
[WAHA Hub]({{< relref "/docs/waha-hub/introduction" >}}) - central management server to help you build reliable infrastructure!
## Bug reports and feature requests
If you're experiencing any issues or have a feature request, please create an issue in the
[WAHA GitHub](https://github.com/devlikeapro/whatsapp-http-api/issues)
Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

@@ -226,6 +226,43 @@ Fired on all message creations, including your own. The payload is the same as f
}
```
### message.reaction
Receive events when a message is reacted to by a user (or **yourself** reacting to a message).
- `payload.reaction.text` - emoji that was used to react to the message. It'll be an empty string if the reaction was removed.
- `payload.reaction.messageId` - id of the message that was reacted to.
```json
{
"event": "message.reaction",
"session": "default",
"me": {
"id": "79222222222@c.us",
"pushName": "WAHA"
},
"payload": {
"id": "false_79111111@c.us_11111111111111111111111111111111",
"from": "79111111@c.us",
"fromMe": false,
"participant": "79111111@c.us",
"to": "79111111@c.us",
"timestamp": 1710481111.853,
"reaction": {
"text": "🙏",
"messageId": "true_79111111@c.us_11111111111111111111111111111111"
}
},
"engine": "WEBJS",
"environment": {
"version": "2024.3.3",
"engine": "WEBJS",
"tier": "PLUS",
"browser": "/usr/bin/google-chrome-stable"
}
}
```
{{< alert icon="👉" text="NOWEB engine note - reactions were sent in 'message' and 'message.any' events, not it's available only in 'message.reaction'!" />}}
### message.ack
Receive events when server or recipient gets the message, read or played it.
@@ -19,6 +19,85 @@ If you wish to get and read Release Notes - read them on one of our platforms, *
You even can **subscribe to get new updates** there!
## 2024.4
### 🎉 New
----
Add `GET /api/sessions/{session}` endpoint to get information about a specific session.
- Read more about [Get session information]({{< relref "/docs/how-to/sessions#get-session" >}})
- Issue: [#300](https://github.com/devlikeapro/whatsapp-http-api/issues/300)
----
Implement `GET /api/contacts/profile-picture` for **NOWEB** engine.
- Issue: [#298](https://github.com/devlikeapro/whatsapp-http-api/issues/298)
----
## 2024.3
### 🎉 New
----
Add `message.reaction` webhook in **WEBJS** and **NOWEB** engines
- Read more about [message.reaction]({{< relref "/docs/how-to/webhooks#messagereaction" >}}) event
- Issue: [#275](https://github.com/devlikeapro/whatsapp-http-api/issues/275)
👉 **NOWEB** engine note - reactions were sent in `'message'` and `'message.any'` events, not it's available **only** in `'message.reaction'`!
----
Add star and unstar message endpoint `PUT /api/star`
- Read [Star and unstar message]({{< relref "/docs/how-to/send-messages#star-and-unstar-message" >}}) documentation
- Issue: [#273](https://github.com/devlikeapro/whatsapp-http-api/issues/240)
----
Add `PUT /api/{session}/chats/{chatId}/messages/{messageId}` endpoint to **edit** the message.
- Read more about [Edit message]({{< relref "/docs/how-to/send-messages#edit-message" >}})
- Issue: [#241](https://github.com/devlikeapro/whatsapp-http-api/issues/241)
----
Add `DELETE /api/{session}/chats/{chatId}/messages/{messageId}` endpoint to **delete** the message.
- Read more about [Delete message]({{< relref "/docs/how-to/send-messages#delete-message" >}})
- Issue: [#209](https://github.com/devlikeapro/whatsapp-http-api/issues/209)
----
Add `POST /api/sendContactVcard` support for **NOWEB** engine.
- Read more about [Send Contact vCard]({{< relref "/docs/how-to/send-messages#send-contact-vcard" >}})
- Issue: [#276](https://github.com/devlikeapro/whatsapp-http-api/issues/256)
----
Handles `caption` and `filename` right in `POST /api/sendFile`
- Issue: [#94](https://github.com/devlikeapro/whatsapp-http-api/issues/94)
- Issue: [#133](https://github.com/devlikeapro/whatsapp-http-api/issues/133)
----
Add security settings for who can send messages `PUT /api/{session}/groups/{groupId}/settings/security/messages-admin-only`
- Read [Security - who can send messages]({{< relref "/docs/how-to/groups##security---who-can-send-messages" >}})
- Issue: [#274](https://github.com/devlikeapro/whatsapp-http-api/issues/274)
----
Add `config.debug` field to `POST /api/session/start` to enable debug and verbose logs for the session.
----
### 👉 Breaking changes
- **NOWEB** - reactions were sent in `'message'` and `'message.any'` events, not it's available **only** in `'message.reaction'`!
- Add **required body** in `PUT /api/{session}/groups/{groupId}/settings/security/info-admin-only` endpoint.
```json
{
"adminsOnly": false
}
```
- `POST /api/sendContactVcard` doesn't work in **VENOM** anymore (use **NOWEB** engine).
## 2024.2
- Add support for [MongoDB as storage for Session data]({{< relref "/docs/how-to/storages" >}})
- Support persistent file storage for media files - [now you can save media files between container restarts]({{< relref "/docs/how-to/storages#media" >}})
+5 -3
View File
@@ -30,7 +30,9 @@ communicate with it to prevent blocking from WhatsApp. It's the reason why it's
### NOWEB
If you're looking for less resource demanded engine - [have a look at **NOWEB** engine ->]({{< relref "/docs/how-to/engines" >}})
The quote from the user:
> The server has 2 CPU and 8GB of memory.
> Today we have 85 session in this instance.
Quotes from the users:
> The server has **2 CPU and 8GB** of memory. Today we have **85 sessions** in this instance.
> **400** sessions with **4CPU and 32RAM**. It's working fine.
@@ -15,7 +15,7 @@ toc: true
**WAHA** - **W**hats**A**pp **H**TTP **A**PI that you can install on your own server and run in less than 5 minutes!
<div class="d-flex justify-content-center my-4">
<img src="/images/logo.png"/>
<img src="/images/logo.svg" style='border-radius: 50%' width='150'/>
</div>
## Get started
@@ -9,7 +9,7 @@ images: []
menu:
docs:
parent: "overview"
weight: 110
weight: 101
toc: true
---
@@ -36,18 +36,21 @@ Also, Docker makes installation and update processes so simple, just one command
We will guide you through the necessary steps to successfully send your first text message using WhatsApp HTTP API.
**If you find it easier to follow a video** tutorial, we've got you covered!
A 3-minute video tutorial is available to help you navigate WhatsApp HTTP API smoothly.
<div class='article-card'>
<b class='h4'>Are you a visual learner?</b>
<div class="d-flex justify-content-center my-4">
<iframe
width="560" height="315"
src="https://www.youtube.com/embed/RFerMyAUPRg"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
We've got you covered! Watch the video below to see how to send your first message using <b>WAHA</b>.
<div class="d-flex justify-content-center my-4">
<iframe
width="560" height="315"
src="https://www.youtube.com/embed/RFerMyAUPRg"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
</div>
</div>
### 1. Download image
@@ -107,6 +110,9 @@ Open the link in your browser [http://localhost:3000/](http://localhost:3000/) a
(Swagger).
{{< alert icon="👉" text="We don't recommend expose the API in the internet without authentication!" />}}
[Read more about Security ->]({{< relref "/docs/how-to/security" >}})
<br/>
![](swagger.png)
@@ -183,8 +189,9 @@ curl -d "{\"chatId\": \"${PHONE}@c.us\", \"text\": \"Hello from WhatsApp HTTP AP
```
## What is next?
- Right now you've sent simple text message, but you can send more! [Send messages →]({{< relref "/docs/how-to/send-messages" >}})
- Read how to receive and response to messages [Receive messages →]({{< relref "/docs/how-to/receive-messages" >}})
- Learn about the easiest way to manage your WhatsApp sessions - [WAHA Dashboard ->]({{< relref "/docs/how-to/waha-dashboard" >}})
- Right now you've sent simple text message, but you can send more! [Send messages ->]({{< relref "/docs/how-to/send-messages" >}})
- Read how to receive and response to messages [Receive messages ->]({{< relref "/docs/how-to/receive-messages" >}})
- [Save session information, so you don't have to scan QR after container restart ->]({{< relref "/docs/how-to/sessions" >}})
- Make sure your [API is properly protected ->]({{< relref "/docs/how-to/security" >}})
@@ -0,0 +1,10 @@
---
title : "WAHA Hub"
description: "WAHA Hub"
lead: ""
date: 2020-10-06T08:48:45+00:00
lastmod: 2020-10-06T08:48:45+00:00
draft: false
images: []
weight: 300
---
@@ -0,0 +1,42 @@
---
title: "WAHA Hub"
description: "WAHA Hub"
lead: ""
date: 2020-10-06T08:48:57+00:00
lastmod: 2020-10-06T08:48:57+00:00
draft: false
images: [ ]
menu:
docs:
parent: "overview"
weight: 100
toc: true
---
⚠️ The project in **DEVELOPMENT** yet... Subscribe to [**WAHA PRO**]({{< relref "plus-version#pro" >}}) to speed up the
development!
---
## Overview
**WAHA Hub** - central management solution to help your build reliable infrastructure with multiple WAHA servers!
While [WAHA Dashboard]({{< relref "/docs/how-to/waha-dashboard" >}}) is a UI to manage your WhatsApp sessions on
**single server**, **WAHA Hub** is a central management server to control and manage **multiple servers** in a single
place.
👉 **WAHA Hub** is available in [**WAHA PRO**]({{< relref "plus-version#pro" >}}) version only.
![WAHA Dashboard](waha-dashboard.png)
<div class="text-center">
<a href="waha-dashboard.png" target="_blank">See full size image</a>
</div>
## Features
- Control and manage multiple servers in a single Hub.
- Monitor the status of your servers
- And more!
Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

+180 -40
View File
@@ -6,14 +6,12 @@
</div>
<div class='col-lg-9 col-xl-9 text-center'>
<div class='mb-4'>
<img src='/images/logo.png' title='WhatsApp HTTP API' alt='logo' width='100' />
<img src='/images/logo.svg' title='WhatsApp HTTP API' alt='logo' width='100' style='border-radius: 50%'/>
</div>
<p class='lead'>{{ .Params.lead | safeHTML }}</p>
<code>
docker run -it -p 3000:3000/tcp devlikeapro/whatsapp-http-api
</code>
<br />
<br />
<div class='code-block highlight'>
<pre tabindex='0' class='chroma'><code class='language-bash' data-lang='bash' style='padding: 0'>docker run -it -p 3000:3000/tcp devlikeapro/whatsapp-http-api</code></pre>
</div>
<a class='btn btn-primary btn-lg px-4 mb-2'
href='/docs/{{ if .Site.Params.options.docsVersioning }}{{ .Site.Params.docsVersion }}/{{ end }}overview/introduction/'
role='button'>Get Started</a>
@@ -25,48 +23,150 @@
{{ define "sidebar-prefooter" }}
<section class='section section-sm'>
<div class='container'>
<div class='container hr'>
<div class='row justify-content-center text-center'>
<div class='col-lg-5'>
<img src='/images/icons/free.png' alt='Free' style='width: 5rem'>
<h2 class='h4'>It's free!</h2>
<div class='col-12'>
<h2>
WAHA Features
</h2>
</div>
<div class='col-12 col-lg-4 pros-card'>
<img src='/images/icons/message-green.png' alt='Free' style='width: 5rem'>
<h2 class='h4 color-accent'>Send and Receive<br />Messages</h2>
<p>
You can
<a href='https://waha.devlike.pro/docs/how-to/send-messages/'>send</a>
and
<a href='https://waha.devlike.pro/docs/how-to/receive-messages/'>receive</a>
messages from WhatsApp using HTTP API.
</p>
<div class='code-block highlight' style='text-align: left'>
<pre tabindex='0' class='chroma m-0'>
<code class='language-json' data-lang='json' style='padding: 1rem!important; border-radius: 0.5rem'>POST /api/sendText
{
"session": "default",
"chatId": "12132132130@c.us",
"text": "Hi there!"
}
</code>
</pre>
</div>
</div>
<div class='col-12 col-lg-4 pros-card'>
<img src='/images/icons/file-check-green.svg' alt='Servers' style='width: 5rem'>
<h2 class='h4'>Send and Receive<br />Files</h2>
<p>
You can
<a href='https://waha.devlike.pro/docs/how-to/send-messages/'>send</a>
and
<a href='https://waha.devlike.pro/docs/how-to/receive-messages/'>receive</a>
files from WhatsApp using HTTP API.
</p>
<div class='code-block highlight' style='text-align: left'>
<pre tabindex='0' class='chroma m-0'>
<code class='language-json' data-lang='json' style='padding: 1rem!important; border-radius: 0.5rem'>POST /api/sendFile
{
"session": "default",
"chatId": "12132132130@c.us",
"file": {
"url": "https://d.com/invoice.pdf"
}
}</code>
</pre>
</div>
</div>
<div class='col-12 col-lg-4 pros-card'>
<img src='/images/icons/button-green.png' alt='API' style='width: 5rem'>
<h2 class='h4'>
WAHA can do<br />a lot more
</h2>
<p>
Check out
<a href='https://waha.devlike.pro/docs/overview/introduction/#features'>
the documentation
</a>
to see all the features.
</p>
<div class='code-block highlight' style='text-align: left'>
<pre tabindex='0' class='chroma m-0'>
<code class='language-json' data-lang='json' style='padding: 1rem!important; border-radius: 0.5rem'>POST /api/{session}/groups
{
"name": "Group name",
"participants": [
{"id": "123123123123@c.us"}
]
}
</code>
</pre>
</div>
</div>
<div class='col-12 pros-card' style='width: 80%'>
<h2 class='h4 color-accent'>Swagger documentation and OpenApi schema!</h2>
<p>
<a href='https://waha.devlike.pro/docs/how-to/plus-version/#core' target='_blank'>
<b>WAHA Core</b>
</a>
and
<a href='https://waha.devlike.pro/docs/how-to/plus-version/#plus' target='_blank'>
<b>WAHA Plus</b>
</a>
provide
<a href='https://waha.devlike.pro/swagger' target='_blank'>
Swagger documentation and OpenApi schema.
</a>
<br>
</p>
<img src='/images/swagger.png' alt='Swagger' style='max-width: 100%'>
</div>
<div class='col-12 pros-card' style='width: 80%'>
<h2 class='h4 color-accent'>WAHA Dashboard</h2>
<p>
<a href='https://waha.devlike.pro/docs/how-to/plus-version/#plus' target='_blank'>
<b>WAHA Plus</b>
</a>
provides
<a href='https://waha.devlike.pro/docs/how-to/waha-dashboard' target='_blank'>
WAHA Dashboard
</a> - a web interface to easily manage your WhatsApp sessions!
<br>
</p>
<img src='/images/waha-dashboard.png' alt='WAHA Dashboard' style='max-width: 100%'>
</div>
</div>
</div>
</section>
<section class='section section-sm'>
<div class='container hr'>
<div class='row justify-content-center text-center'>
<div class='col-12'>
<h2>
Why WAHA?
</h2>
</div>
<div class='col-12 col-lg-4 pros-card'>
<img src='/images/icons/free-green.png' alt='Free' style='width: 5rem'>
<h2 class='h4 color-accent'>It's free!</h2>
<p>
<a href='https://waha.devlike.pro/docs/how-to/plus-version/#tiers' target='_blank'>
<b>WAHA Core</b>
</a>
version is always free!
version is always free, <b>no limits in messages</b> or time!
<br>
Even
<a href='https://waha.devlike.pro/docs/how-to/plus-version/#tiers' target='_blank'>
<b>WAHA Plus</b>
</a>
version have no licence expiration!
</p>
</div>
<div class='col-lg-5'>
<img src='/images/icons/api.png' alt='API' style='width: 5rem'>
<h2 class='h4'>Language agnostic</h2>
<p>
Use your own favorite language - Python, JavaScript, PHP, C#, Clojure, or PowerShell.
<br />
<small class='text-muted'>
PowerShell, really? Are you insane?! Choose another language, dude.
</small>
</p>
</div>
<div class='col-lg-5'>
<img src='/images/icons/document.png' alt='Document' style='width: 5rem'>
<h2 class='h4'>Well documented</h2>
<p>
<a href='https://waha.devlike.pro/docs/overview/introduction/' target='_blank'>
Documentation
</a>
has a lof examples and how-to guides.</p>
</div>
</div>
<div class='row justify-content-center text-center'>
<div class='col-lg-5'>
<img src='/images/icons/servers.png' alt='Servers' style='width: 5rem'>
<div class='col-12 col-lg-4 pros-card'>
<img src='/images/icons/servers-green.png' alt='Servers' style='width: 5rem'>
<h2 class='h4'>Self-hosted solution</h2>
<p>
<a href='https://waha.devlike.pro/docs/how-to/plus-version/#why-waha' target='_blank'>
@@ -75,8 +175,30 @@
Install it on your own server!
</p>
</div>
<div class='col-lg-5'>
<img src='/images/icons/easy.png' alt='Easy' style='width: 5rem'>
<div class='col-12 col-lg-4 pros-card'>
<img src='/images/icons/api-green.png' alt='API' style='width: 5rem'>
<h2 class='h4'>HTTP API</h2>
<p>
Use your own favorite language - Python, JavaScript, PHP, C#, Clojure, or PowerShell.
<br />
<small class='text-muted'>
PowerShell, really? Are you insane?! Choose another language, dude.
</small>
</p>
</div>
</div>
<div class='row justify-content-center text-center'>
<div class='col-12 col-lg-4 pros-card'>
<img src='/images/icons/document-green.png' alt='Document' style='width: 5rem'>
<h2 class='h4'>Well documented</h2>
<p>
<a href='https://waha.devlike.pro/docs/overview/introduction/' target='_blank'>
Documentation
</a>
has a lof examples and how-to guides.</p>
</div>
<div class='col-12 col-lg-4 pros-card'>
<img src='/images/icons/easy-green.png' alt='Easy' style='width: 5rem'>
<h2 class='h4'>Quick installation</h2>
<p>
You need to install Docker and
@@ -89,8 +211,8 @@
</small>
</p>
</div>
<div class='col-lg-5'>
<img src='/images/icons/checked.png' alt='Checked' style='width: 5rem'>
<div class='col-12 col-lg-4 pros-card'>
<img src='/images/icons/checked-green.png' alt='Checked' style='width: 5rem'>
<h2 class='h4'>No blocking</h2>
<p>
<a href='https://waha.devlike.pro/docs/how-to/engines/' target='_blank'>
@@ -104,6 +226,24 @@
</small>
</p>
</div>
</div>
</div>
</section>
<section class='section section-sm'>
<div class='container hr'>
<div class='text-center mt-4'>
<h2>
Try it now!
</h2>
<div class='mb-4'>
<img src='/images/logo.png' title='WhatsApp HTTP API' alt='logo' width='100' />
</div>
<a class='btn btn-primary btn-lg px-4 mb-2'
href='/docs/{{ if .Site.Params.options.docsVersioning }}{{ .Site.Params.docsVersion }}/{{ end }}overview/introduction/'
role='button'>Get Started</a>
<p class='meta'><a href='https://github.com/devlikeapro/whatsapp-http-api'>Source code in GitHub.</a></p>
</div>
</div>
</section>
@@ -1,17 +1,63 @@
<!-- Yandex.Metrika counter -->
<script type="text/javascript" >
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
m[i].l=1*new Date();
for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
<script type='text/javascript'>
(function(m, e, t, r, i, k, a) {
m[i] = m[i] || function() {
(m[i].a = m[i].a || []).push(arguments);
};
m[i].l = 1 * new Date();
for (var j = 0; j < document.scripts.length; j++) {
if (document.scripts[j].src === r) {
return;
}
}
k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a);
})
(window, document, 'script', 'https://mc.yandex.ru/metrika/tag.js', 'ym');
ym(91185978, "init", {
clickmap:true,
trackLinks:true,
accurateTrackBounce:true,
webvisor:true
});
ym(91185978, 'init', {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true,
});
</script>
<noscript><div><img src="https://mc.yandex.ru/watch/91185978" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<noscript>
<div><img src='https://mc.yandex.ru/watch/91185978' style='position:absolute; left:-9999px;' alt='' /></div>
</noscript>
<!-- /Yandex.Metrika counter -->
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-2XLLXRJ1KF"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-2XLLXRJ1KF');
</script>
<!-- /Google tag (gtag.js) -->
<!-- Main page cards -->
<style>
.pros-card {
border: 1px solid #e9ecef;
border-radius: 0.5rem;
padding: 1.5rem;
margin: 1rem;
background-color: #fff;
box-shadow: 0 0 1rem 0 rgba(0, 0, 0, 0.1);
}
.article-card {
border: 1px solid #e9ecef;
border-radius: 0.5rem;
padding: 1.5rem;
background-color: #fff;
box-shadow: 0 0 1rem 0 #4aae2050;
}
.hr {
border-top: 1px solid #e9ecef;
}
</style>
<!-- /Main page cards -->
Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

+289
View File
@@ -0,0 +1,289 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Dashboard | WAHA</title>
<link rel="icon" href="./favicon.ico" />
<style>
:root {
--surface-card: #1f2937;
--surface-border: #374151;
--card-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
}
body,
html {
height: 100%;
padding: 0;
margin: 0;
}
* {
box-sizing: border-box;
}
.bg-image {
/* The image used */
background-image: url('./waha-dashboard.png');
/* Add the blur effect */
filter: blur(2px);
-webkit-filter: blur(2px);
/* Full height */
height: 100%;
/* Center and scale the image nicely */
background-position: center;
background-repeat: no-repeat;
background-size: cover;
}
body {
background-color: #111827;
color: rgba(255, 255, 255, 0.87);
}
svg {
width: 100px;
height: 100px;
}
.message {
font-size: 20px;
margin: 20px;
}
a {
color: rgb(158, 158, 255);
text-decoration-color: rgb(158, 158, 255);
}
.upgrade-link {
text-decoration: none;
font-size: 1.5rem;
}
.link-button {
background-color: #4ade80;
padding: 10px 20px;
border-radius: 5px;
color: #052e16;
text-decoration: none;
margin-top: 50px;
}
.card {
min-width: 25rem;
background: var(--surface-card);
border: 1px solid var(--surface-border);
box-shadow: var(--card-shadow);
padding: 2rem;
border-radius: 12px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 2;
text-align: center;
}
</style>
</head>
<body>
<div class="bg-image"></div>
<div class="card">
<svg
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="1080"
height="1080"
viewBox="0 0 1080 1080"
xml:space="preserve"
>
<desc>Created with Fabric.js 5.2.4</desc>
<defs></defs>
<g
transform="matrix(1 0 0 1 540 540)"
id="c3cb5d1b-8350-492a-8567-8c1ee2307b9a"
></g>
<g
transform="matrix(1 0 0 1 540 540)"
id="054ae9ae-db12-4435-8648-8bfb02267690"
>
<rect
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(255, 255, 255);
fill-rule: nonzero;
opacity: 1;
visibility: hidden;
"
vector-effect="non-scaling-stroke"
x="-540"
y="-540"
rx="0"
ry="0"
width="1080"
height="1080"
/>
</g>
<g transform="matrix(1 0 0 1 540 540)">
<rect
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(255, 255, 255);
fill-rule: nonzero;
opacity: 1;
visibility: hidden;
"
vector-effect="non-scaling-stroke"
x="-540"
y="-540"
rx="0"
ry="0"
width="1080"
height="1080"
/>
</g>
<g transform="matrix(2.02 0 0 2.02 540 540)">
<rect
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(255, 255, 255);
fill-rule: nonzero;
opacity: 1;
visibility: hidden;
"
vector-effect="non-scaling-stroke"
x="-540"
y="-540"
rx="0"
ry="0"
width="1080"
height="1080"
/>
</g>
<g transform="matrix(3.68 0 0 3.68 540.38 540.48)">
<path
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(74, 173, 32);
fill-rule: nonzero;
opacity: 1;
"
vector-effect="non-scaling-stroke"
transform=" translate(-392.21, -570.16)"
d="M 392.26 705.96 C 376.77 705.96 361.28999999999996 706.0400000000001 345.8 705.95 C 318.16 705.7900000000001 297.6 685.2700000000001 297.22 657.57 C 297.15000000000003 652.24 297.07000000000005 646.9100000000001 297.25 641.59 C 297.36 638.23 296.3 636.6 292.72 636.89 C 290.24 637.09 287.73 636.98 285.23 636.9 C 277.1 636.63 271.70000000000005 631.65 271.38 623.49 C 271.06 615.1800000000001 271.06 606.83 271.37 598.52 C 271.69 590.05 277.04 585.23 285.58 585.01 C 297.21 584.72 297.19 584.72 297.21999999999997 573.01 C 297.22999999999996 567.36 297.14 561.72 297.97999999999996 556.0699999999999 C 301.25999999999993 533.93 320.72999999999996 516.4599999999999 343.09 516.04 C 355.07 515.81 367.07 515.86 379.04999999999995 516.02 C 382.72999999999996 516.0699999999999 384.02 514.87 383.96 511.15 C 383.77 500.65999999999997 383.76 490.16999999999996 383.96999999999997 479.67999999999995 C 384.04999999999995 476.00999999999993 382.96 473.65999999999997 379.92999999999995 471.37999999999994 C 372.23999999999995 465.5799999999999 369.78 456.25999999999993 373.06999999999994 447.7199999999999 C 376.18999999999994 439.5999999999999 385.13999999999993 433.7399999999999 393.4599999999999 434.3599999999999 C 402.63999999999993 435.0399999999999 410.43999999999994 441.3499999999999 412.4599999999999 450.2199999999999 C 414.4799999999999 459.0299999999999 411.7099999999999 466.4299999999999 404.4699999999999 471.7899999999999 C 401.8699999999999 473.7199999999999 400.9199999999999 475.69999999999993 400.9699999999999 478.8299999999999 C 401.1199999999999 489.1499999999999 401.2499999999999 499.4799999999999 400.9299999999999 509.79999999999995 C 400.7899999999999 514.5 402.0299999999999 516.24 406.9999999999999 516.0799999999999 C 417.8099999999999 515.7299999999999 428.6399999999999 515.91 439.4699999999999 515.9899999999999 C 466.5199999999999 516.2099999999999 486.7199999999999 536.2299999999999 487.2399999999999 563.3 C 487.3399999999999 568.29 487.2599999999999 573.29 487.2799999999999 578.29 C 487.2999999999999 585 487.3099999999999 585 493.7899999999999 585.02 C 495.94999999999993 585.03 498.1199999999999 584.96 500.2799999999999 585.06 C 507.94999999999993 585.43 512.9999999999999 590.42 513.1499999999999 598.1199999999999 C 513.3199999999998 606.6099999999999 513.3099999999998 615.1099999999999 513.1599999999999 623.5999999999999 C 513.0299999999999 631.3599999999999 508.1999999999999 636.31 500.47999999999985 636.8699999999999 C 498.15999999999985 637.0399999999998 495.77999999999986 637.2199999999999 493.49999999999983 636.8899999999999 C 488.1999999999998 636.1299999999999 486.86999999999983 638.5399999999998 487.1999999999998 643.3999999999999 C 487.54999999999984 648.5399999999998 487.3499999999998 653.7199999999999 487.23999999999984 658.8799999999999 C 486.67999999999984 685.6599999999999 466.4599999999998 705.7399999999999 439.71999999999986 705.9599999999999 C 423.9 706.06 408.08 705.95 392.26 705.96 z"
stroke-linecap="round"
/>
</g>
<g transform="matrix(-3.68 0 0 -3.68 546.38 845.01)">
<path
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(56, 134, 22);
fill-rule: nonzero;
opacity: 1;
"
vector-effect="non-scaling-stroke"
transform=" translate(-394.07, -654.42)"
d="M 394.26 632.93 C 404.75 632.93 415.23 632.9 425.71999999999997 632.9399999999999 C 431.92999999999995 632.9599999999999 433.52 634.7399999999999 432.90999999999997 640.7099999999999 C 430.99999999999994 659.66 414.40999999999997 675.2199999999999 395.38 675.91 C 376.87 676.5799999999999 359.57 662.65 356 644.1899999999999 C 355.72 642.7199999999999 355.33 641.26 355.19 639.78 C 354.71 634.9 356.32 633.01 361.3 632.97 C 372.29 632.87 383.28 632.93 394.26 632.93 z"
stroke-linecap="round"
/>
</g>
<g transform="matrix(3.68 0 0 3.68 673.99 594.08)">
<path
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(56, 135, 22);
fill-rule: nonzero;
opacity: 1;
"
vector-effect="non-scaling-stroke"
transform=" translate(-428.75, -584.99)"
d="M 428.83 602 C 419.12 601.96 411.59999999999997 594.6 411.53 585.07 C 411.46999999999997 575.4100000000001 419.21 567.9100000000001 429.16999999999996 567.98 C 438.33 568.0500000000001 445.93999999999994 575.71 445.97999999999996 584.91 C 446.02 594.33 438.29 602.04 428.83 602 z"
stroke-linecap="round"
/>
</g>
<g transform="matrix(3.68 0 0 3.68 406.92 594.18)">
<path
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(56, 135, 22);
fill-rule: nonzero;
opacity: 1;
"
vector-effect="non-scaling-stroke"
transform=" translate(-356.06, -584.99)"
d="M 339.05 584.57 C 339.19 574.94 346.67 567.84 356.53000000000003 567.99 C 366.26000000000005 568.14 373.21000000000004 575.46 373.07000000000005 585.42 C 372.94000000000005 595.16 365.62000000000006 602.13 355.68000000000006 602 C 346.04 601.87 338.91 594.4 339.05 584.57 z"
stroke-linecap="round"
/>
</g>
</svg>
<div class="message">
Sorry,
<a
href="https://waha.devlike.pro/docs/how-to/waha-dashboard"
target="_blank"
>WAHA Dashboard</a
>
is not available in <strong>WAHA Core</strong> version.
<br />
Please consider upgrading to <strong>WAHA Plus</strong>.
</div>
<div style="margin-top: 2rem; margin-bottom: 1rem">
<a
class="upgrade-link link-button"
href="https://waha.devlike.pro/docs/how-to/plus-version/"
target="_blank"
>Upgrade to WAHA Plus</a
>
</div>
</div>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 646 B

After

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M15 19L17 21L21 17M13 3H8.2C7.0799 3 6.51984 3 6.09202 3.21799C5.71569 3.40973 5.40973 3.71569 5.21799 4.09202C5 4.51984 5 5.0799 5 6.2V17.8C5 18.9201 5 19.4802 5.21799 19.908C5.40973 20.2843 5.71569 20.5903 6.09202 20.782C6.51984 21 7.0799 21 8.2 21H11.5M13 3L19 9M13 3V7.4C13 7.96005 13 8.24008 13.109 8.45399C13.2049 8.64215 13.3578 8.79513 13.546 8.89101C13.7599 9 14.0399 9 14.6 9H19M19 9V13.4M9 17H11.5M9 13H15M9 9H10" stroke="#388716" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 747 B

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15 19L17 21L21 17M13 3H8.2C7.0799 3 6.51984 3 6.09202 3.21799C5.71569 3.40973 5.40973 3.71569 5.21799 4.09202C5 4.51984 5 5.0799 5 6.2V17.8C5 18.9201 5 19.4802 5.21799 19.908C5.40973 20.2843 5.71569 20.5903 6.09202 20.782C6.51984 21 7.0799 21 8.2 21H11.5M13 3L19 9M13 3V7.4C13 7.96005 13 8.24008 13.109 8.45399C13.2049 8.64215 13.3578 8.79513 13.546 8.89101C13.7599 9 14.0399 9 14.6 9H19M19 9V13.4M9 17H11.5M9 13H15M9 9H10" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 744 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

+52
View File
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.8.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Слой_1"
width="1000"
height="1000"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="230 260 500 550"
style="background-color: #94DB77" xml:space="preserve">
<style type="text/css">
.st0{fill:#94DB77;}
.st1{fill:#4AAD20;}
.st2{fill:#388616;}
.st3{fill:#388716;}
.st4{fill:#E9F3E4;}
</style>
<g>
<path class="st0" d="M191.12,540.08c0-91.78,0.03-183.55-0.1-275.33c0-3.5,0.49-4.75,5.66-4.75
c187.59,0.13,375.17,0.13,562.76,0.02c4.6,0,5.54,0.74,5.54,4.34c-0.14,183.72-0.14,367.44,0.02,551.16c0,4-1.5,4.47-6.02,4.47
c-187.38-0.09-374.75-0.1-562.13,0.01c-4.78,0-5.86-0.84-5.86-4.59C191.15,723.63,191.12,631.86,191.12,540.08z"/>
<path class="st1" d="M392.26,705.96c-15.49,0-30.97,0.08-46.46-0.01c-27.64-0.16-48.2-20.68-48.58-48.38
c-0.07-5.33-0.15-10.66,0.03-15.98c0.11-3.36-0.95-4.99-4.53-4.7c-2.48,0.2-4.99,0.09-7.49,0.01c-8.13-0.27-13.53-5.25-13.85-13.41
c-0.32-8.31-0.32-16.66-0.01-24.97c0.32-8.47,5.67-13.29,14.21-13.51c11.63-0.29,11.61-0.29,11.64-12
c0.01-5.65-0.08-11.29,0.76-16.94c3.28-22.14,22.75-39.61,45.11-40.03c11.98-0.23,23.98-0.18,35.96-0.02
c3.68,0.05,4.97-1.15,4.91-4.87c-0.19-10.49-0.2-20.98,0.01-31.47c0.08-3.67-1.01-6.02-4.04-8.3c-7.69-5.8-10.15-15.12-6.86-23.66
c3.12-8.12,12.07-13.98,20.39-13.36c9.18,0.68,16.98,6.99,19,15.86c2.02,8.81-0.75,16.21-7.99,21.57c-2.6,1.93-3.55,3.91-3.5,7.04
c0.15,10.32,0.28,20.65-0.04,30.97c-0.14,4.7,1.1,6.44,6.07,6.28c10.81-0.35,21.64-0.17,32.47-0.09
c27.05,0.22,47.25,20.24,47.77,47.31c0.1,4.99,0.02,9.99,0.04,14.99c0.02,6.71,0.03,6.71,6.51,6.73c2.16,0.01,4.33-0.06,6.49,0.04
c7.67,0.37,12.72,5.36,12.87,13.06c0.17,8.49,0.16,16.99,0.01,25.48c-0.13,7.76-4.96,12.71-12.68,13.27
c-2.32,0.17-4.7,0.35-6.98,0.02c-5.3-0.76-6.63,1.65-6.3,6.51c0.35,5.14,0.15,10.32,0.04,15.48
c-0.56,26.78-20.78,46.86-47.52,47.08C423.9,706.06,408.08,705.95,392.26,705.96z"/>
<path class="st1" d="M598.2,362.07c59.99,0.04,108.7,48.78,108.71,108.8c0.01,60.11-49.08,109.12-109.16,108.98
C538.06,579.71,489,530.4,489.14,470.66C489.28,410.82,538.28,362.04,598.2,362.07z"/>
<path class="st2" d="M394.26,632.93c10.49,0,20.97-0.03,31.46,0.01c6.21,0.02,7.8,1.8,7.19,7.77c-1.91,18.95-18.5,34.51-37.53,35.2
c-18.51,0.67-35.81-13.26-39.38-31.72c-0.28-1.47-0.67-2.93-0.81-4.41c-0.48-4.88,1.13-6.77,6.11-6.81
C372.29,632.87,383.28,632.93,394.26,632.93z"/>
<path class="st3" d="M428.83,602c-9.71-0.04-17.23-7.4-17.3-16.93c-0.06-9.66,7.68-17.16,17.64-17.09
c9.16,0.07,16.77,7.73,16.81,16.93C446.02,594.33,438.29,602.04,428.83,602z"/>
<path class="st3" d="M339.05,584.57c0.14-9.63,7.62-16.73,17.48-16.58c9.73,0.15,16.68,7.47,16.54,17.43
c-0.13,9.74-7.45,16.71-17.39,16.58C346.04,601.87,338.91,594.4,339.05,584.57z"/>
<path class="st4" d="M598.39,405.96c35.8-0.01,64.91,29.38,64.43,65.03c-0.49,35.73-30.23,64.62-65.81,63.8
c-8.91-0.21-17.55-2.04-25.56-6.01c-2.93-1.46-5.49-1.58-8.53-0.72c-8.48,2.4-17.03,4.53-25.54,6.84
c-2.86,0.78-3.98,0.46-2.97-2.94c2.37-7.97,4.29-16.07,6.69-24.03c1.07-3.56,0.85-6.48-0.81-9.95
C519.91,455.33,551.14,405.98,598.39,405.96z"/>
<path class="st1" d="M548.99,520.52c1.54-5.81,2.66-10.77,4.2-15.6c0.89-2.79,0.54-4.93-0.91-7.47
c-18.93-33.1,0.22-73.52,37.83-80.02c28.33-4.9,56.38,15.3,60.95,43.88c4.74,29.61-15.08,57.38-43.86,61.82
c-12.32,1.9-23.85,0-34.68-6c-2.55-1.41-4.83-1.63-7.54-0.84C559.94,517.75,554.84,518.98,548.99,520.52z"/>
<path class="st4" d="M615.43,501.21c-7.36-0.22-13.98-3.02-20.17-6.59c-11.52-6.64-20.22-16.22-26.57-27.83
c-4.58-8.38-3.88-16.68,1.39-22.88c4.54-5.35,10.44-4.55,13.13,1.78c0.85,1.99,1.52,4.08,2.57,5.95c2.35,4.2,2.04,7.87-1.68,11.1
c-2.2,1.92-1.79,3.85-0.29,6.12c4.63,6.96,10.62,12.24,18.05,16.08c3.6,1.86,6.4,1.78,8.35-1.92c2.73-5.2,6.35-5.45,10.9-2.5
c1.38,0.9,2.97,1.49,4.46,2.22c6.33,3.1,7.13,9.14,1.71,13.92C623.96,499.62,620.04,501.38,615.43,501.21z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

+1 -1
View File
@@ -1 +1 @@
{"openapi":"3.1.0","paths":{"/api/{session}/auth/qr":{"get":{"operationId":"AuthController_getQR","summary":"Get QR code for pairing WhatsApp Web.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"},{"name":"format","required":true,"in":"query","schema":{"default":"image","enum":["image","raw"],"type":"string"}}],"responses":{"200":{"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Base64File"},{"$ref":"#/components/schemas/QRCodeValue"}]}}},"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/{session}/auth/request-code":{"post":{"operationId":"AuthController_requestCode","summary":"Request authentication code.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCodeRequest"}}}},"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/{session}/auth/authorize-code":{"post":{"operationId":"AuthController_authorizeCode","summary":"Send OTP authentication code.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTPRequest"}}}},"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/sessions/start":{"post":{"operationId":"SessionsController_start","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStartRequest"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionDTO"}}}}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions/stop":{"post":{"operationId":"SessionsController_stop","summary":"Stop session","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStopRequest"}}}},"responses":{"201":{"description":""}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions/logout":{"post":{"operationId":"SessionsController_clean","summary":"Logout from session.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionLogoutRequest"}}}},"responses":{"201":{"description":""}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions":{"get":{"operationId":"SessionsController_list","parameters":[{"name":"all","required":false,"in":"query","example":false,"description":"Return all sessions, including those that are in the STOPPED state.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SessionInfo"}}}}}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions/{session}/me":{"get":{"operationId":"SessionController_getMe","summary":"Get information about the authenticated account","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeInfo"}}}}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/checkNumberStatus":{"get":{"operationId":"ChattingController_checkNumberStatus","summary":"Check number status","parameters":[{"name":"phone","required":true,"in":"query","schema":{"type":"string"}},{"name":"session","required":true,"in":"query","schema":{"default":"default","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WANumberExistResult"}}}}},"tags":["chatting"],"security":[{"api_key":[]}]}},"/api/sendContactVcard":{"post":{"operationId":"ChattingController_sendContactVcard","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageContactVcardRequest"}}}},"responses":{"201":{"description":""}},"tags":["chatting"],"security":[{"api_key":[]}]}},"/api/sendText":{"get":{"operationId":"ChattingController_sendTextGet","summary":"Send a text message","parameters":[{"name":"phone","required":true,"in":"query","schema":{"type":"string"}},{"name":"text","required":true,"in":"query","schema":{"type":"string"}},{"name":"session","required":true,"in":"query","schema":{"default":"default","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["chatting"],"security":[{"api_key":[]}]},"post":{"operationId":"ChattingController_sendText","summary":"Send a text message","parameters":[],"requestBody":{"required":true,Line truncated
{"openapi":"3.1.0","paths":{"/api/{session}/auth/qr":{"get":{"operationId":"AuthController_getQR","summary":"Get QR code for pairing WhatsApp Web.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"},{"name":"format","required":true,"in":"query","schema":{"default":"image","enum":["image","raw"],"type":"string"}}],"responses":{"200":{"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Base64File"},{"$ref":"#/components/schemas/QRCodeValue"}]}}},"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/{session}/auth/request-code":{"post":{"operationId":"AuthController_requestCode","summary":"Request authentication code.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCodeRequest"}}}},"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/{session}/auth/authorize-code":{"post":{"operationId":"AuthController_authorizeCode","summary":"Send OTP authentication code.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTPRequest"}}}},"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/{session}/auth/captcha":{"get":{"operationId":"AuthController_getCaptcha","summary":"Get captcha image.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"responses":{"200":{"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Base64File"}]}}},"description":""}},"tags":["auth"],"security":[{"api_key":[]}]},"post":{"operationId":"AuthController_saveCaptcha","summary":"Enter captcha code.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptchaBody"}}}},"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/sessions/start":{"post":{"operationId":"SessionsController_start","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStartRequest"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionDTO"}}}}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions/stop":{"post":{"operationId":"SessionsController_stop","summary":"Stop session","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStopRequest"}}}},"responses":{"201":{"description":""}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions/logout":{"post":{"operationId":"SessionsController_clean","summary":"Logout from session.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionLogoutRequest"}}}},"responses":{"201":{"description":""}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions":{"get":{"operationId":"SessionsController_list","parameters":[{"name":"all","required":false,"in":"query","example":false,"description":"Return all sessions, including those that are in the STOPPED state.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SessionInfo"}}}}}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions/{session}":{"get":{"operationId":"SessionsController_get","parameters":[{"name":"session","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionInfo"}}}}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions/{session}/me":{"get":{"operationId":"SessionController_getMe","summary":"Get information about the authenticated account","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeInfo"}}}}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/checkNumberStatus":{"get":{"operationId":"ChattingController_checkNumberStatus","summary":"Check number status","parameters":[{"name":"phone","required":true,"in":"query","schema":{"type":"string"}},{"nLine truncated
Binary file not shown.
Binary file not shown.
+3 -1
View File
@@ -2,6 +2,8 @@
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"plugins": ["@nestjs/swagger"]
"plugins": ["@nestjs/swagger"],
"assets": ["dashboard/**"],
"watchAssets": true
}
}
+2 -1
View File
@@ -48,6 +48,7 @@
"mongodb": "^6.3.0",
"passport": "^0.6.0",
"passport-headerapikey": "^1.2.2",
"puppeteer": "^21.0.0",
"qrcode": "^1.5.1",
"qrcode-terminal": "^0.12.0",
"reflect-metadata": "^0.1.13",
@@ -57,7 +58,7 @@
"rxjs": "^7.1.0",
"swagger-ui-express": "^4.1.4",
"venom-bot": "5.0.1",
"whatsapp-web.js": "https://github.com/devlikeapro/whatsapp-web.js#main-fork"
"whatsapp-web.js": "https://github.com/devlikeapro/whatsapp-web.js#main-fork-update"
},
"devDependencies": {
"@nestjs/cli": "^9.0.0",
+44 -2
View File
@@ -1,11 +1,26 @@
import { Controller, Delete, Get, Param, Post, Query } from '@nestjs/common';
import {
Body,
Controller,
Delete,
Get,
Param,
Post,
Put,
Query,
} from '@nestjs/common';
import { ApiOperation, ApiSecurity, ApiTags } from '@nestjs/swagger';
import { SessionManager } from '../core/abc/manager.abc';
import { WhatsappSession } from '../core/abc/session.abc';
import { parseBool } from '../helpers';
import { GetChatMessagesQuery } from '../structures/chats.dto';
import { SessionApiParam, SessionParam } from './helpers';
import { EditMessageRequest } from '../structures/chatting.dto';
import {
ChatIdApiParam,
MessageIdApiParam,
SessionApiParam,
SessionParam,
} from './helpers';
@ApiSecurity('api_key')
@Controller('api/:session/chats')
@@ -51,6 +66,33 @@ class ChatsController {
) {
return session.clearMessages(chatId);
}
@Delete(':chatId/messages/:messageId')
@SessionApiParam
@ChatIdApiParam
@MessageIdApiParam
@ApiOperation({ summary: 'Deletes a message from the chat' })
deleteMessage(
@SessionParam session: WhatsappSession,
@Param('chatId') chatId: string,
@Param('messageId') messageId: string,
) {
return session.deleteMessage(chatId, messageId);
}
@Put(':chatId/messages/:messageId')
@SessionApiParam
@ChatIdApiParam
@MessageIdApiParam
@ApiOperation({ summary: 'Edits a message in the chat' })
editMessage(
@SessionParam session: WhatsappSession,
@Param('chatId') chatId: string,
@Param('messageId') messageId: string,
@Body() body: EditMessageRequest,
) {
return session.editMessage(chatId, messageId, body);
}
}
export { ChatsController };
+9
View File
@@ -14,6 +14,7 @@ import {
MessagePollRequest,
MessageReactionRequest,
MessageReplyRequest,
MessageStarRequest,
MessageTextQuery,
MessageTextRequest,
MessageVideoRequest,
@@ -157,6 +158,14 @@ export class ChattingController {
return whatsapp.setReaction(request);
}
@Put('/star')
@ApiOperation({ summary: 'Star or unstar a message' })
async setStar(@Body() request: MessageStarRequest) {
const whatsapp = this.manager.getSession(request.session);
await whatsapp.setStar(request);
return;
}
@Get('/messages')
@ApiOperation({ summary: 'Get messages in a chat' })
getMessages(@Query() query: GetMessageQuery) {
+29 -2
View File
@@ -56,11 +56,12 @@ export class GroupsController {
summary:
'Updates the group settings to only allow admins to edit group info (title, description, photo).',
})
setGroupAdminOnly(
setInfoAdminOnly(
@SessionParam session: WhatsappSession,
@Param('id') id: string,
@Body() request: SettingsSecurityChangeInfo,
) {
return session.setInfoAdminsOnly(id, true);
return session.setInfoAdminsOnly(id, request.adminsOnly);
}
@Get(':id/settings/security/info-admin-only')
@@ -76,6 +77,32 @@ export class GroupsController {
return session.getInfoAdminsOnly(id);
}
@Put(':id/settings/security/messages-admin-only')
@SessionApiParam
@ApiOperation({
summary:
'Updates the group settings to only allow admins to send messages.',
})
setMessagesAdminOnly(
@SessionParam session: WhatsappSession,
@Param('id') id: string,
@Body() request: SettingsSecurityChangeInfo,
) {
return session.setMessagesAdminsOnly(id, request.adminsOnly);
}
@Get(':id/settings/security/messages-admin-only')
@SessionApiParam
@ApiOperation({
summary: 'Gets the group settings to only allow admins to send messages.',
})
getMessagesAdminOnly(
@SessionParam session: WhatsappSession,
@Param('id') id: string,
): Promise<SettingsSecurityChangeInfo> {
return session.getMessagesAdminsOnly(id);
}
@Delete(':id')
@SessionApiParam
@ApiOperation({ summary: 'Delete the group.' })
+16
View File
@@ -48,6 +48,22 @@ export const SessionApiParam = ApiParam({
*/
export const SessionParam = Param('session', SessionPipe);
export const ChatIdApiParam = ApiParam({
name: 'chatId',
required: true,
type: 'string',
description: 'Chat ID',
example: '123456789@c.us',
});
export const MessageIdApiParam = ApiParam({
name: 'messageId',
required: true,
type: 'string',
description: 'Message ID',
example: 'true_123456789@c.us_BAE6A33293978B16',
});
function getRefSchemaPaths(models) {
return models.map((model) => {
return { $ref: getSchemaPath(model) };
+21 -2
View File
@@ -1,4 +1,13 @@
import { Body, Controller, Get, Post, Query } from '@nestjs/common';
import {
Body,
Controller,
Delete,
Get,
NotFoundException,
Param,
Post,
Query,
} from '@nestjs/common';
import {
ApiExtraModels,
ApiOperation,
@@ -39,9 +48,10 @@ class SessionsController {
@Post('/stop/')
@ApiOperation({ summary: 'Stop session' })
async stop(@Body() request: SessionStopRequest): Promise<void> {
await this.manager.stop(request);
if (request.logout) {
await this.manager.logout(request);
} else {
await this.manager.stop(request);
}
return;
}
@@ -57,6 +67,15 @@ class SessionsController {
const all = parseBool(query.all);
return this.manager.getSessions(all);
}
@Get('/:session')
async get(@Param('session') name: string): Promise<SessionInfo> {
const session = this.manager.getSessionInfo(name);
if (session === null) {
throw new NotFoundException('Session not found');
}
return session;
}
}
@ApiSecurity('api_key')
+34 -2
View File
@@ -8,13 +8,24 @@ import { getEngineName } from './version';
@Injectable()
export class WhatsappConfigService {
public files_uri = '/api/files';
public filesUri = '/api/files';
public dashboardUri = '/dashboard';
public schema = 'http';
constructor(private configService: ConfigService) {}
static noSlash(value: string): string {
if (!value) {
return value;
}
if (value.startsWith('/')) {
return value.slice(1);
}
return value;
}
get filesURL(): string {
return `${this.schema}://${this.hostname}:${this.port}${this.files_uri}/`;
return `${this.schema}://${this.hostname}:${this.port}${this.filesUri}/`;
}
get hostname(): string {
@@ -152,6 +163,27 @@ export class WhatsappConfigService {
return [user, password];
}
getDashboardEnabled(): boolean {
const value = this.configService.get('WAHA_DASHBOARD_ENABLED', 'true');
return parseBool(value);
}
getDashboardUsernamePassword(): [string, string] | null {
if (!this.getDashboardEnabled()) {
return null;
}
const user = this.configService.get('WAHA_DASHBOARD_USERNAME', 'waha');
const password = this.configService.get('WAHA_DASHBOARD_PASSWORD', 'waha');
if (!user || !password) {
console.log(
'Please set up both WAHA_DASHBOARD_USERNAME and WAHA_DASHBOARD_PASSWORD ' +
'to enable swagger authentication.',
);
return null;
}
return [user, password];
}
getSwaggerAdvancedConfigEnabled(): boolean {
return this.configService.get('WHATSAPP_SWAGGER_CONFIG_ADVANCED', false);
}
+2
View File
@@ -37,5 +37,7 @@ export abstract class SessionManager implements OnApplicationShutdown {
abstract getSession(name: string): WhatsappSession;
abstract getSessionInfo(name: string): Promise<SessionInfo | null>;
abstract getSessions(all: boolean): Promise<SessionInfo[]>;
}
+30
View File
@@ -6,6 +6,7 @@ import { MessageId } from 'whatsapp-web.js';
import {
ChatRequest,
CheckNumberStatusQuery,
EditMessageRequest,
GetMessageQuery,
MessageContactVcardRequest,
MessageFileRequest,
@@ -15,6 +16,7 @@ import {
MessagePollRequest,
MessageReactionRequest,
MessageReplyRequest,
MessageStarRequest,
MessageTextRequest,
MessageVideoRequest,
MessageVoiceRequest,
@@ -265,6 +267,10 @@ export abstract class WhatsappSession {
abstract setReaction(request: MessageReactionRequest);
setStar(request: MessageStarRequest): Promise<void> {
throw new NotImplementedByEngineError();
}
/**
* Chats methods
*/
@@ -284,6 +290,18 @@ export abstract class WhatsappSession {
throw new NotImplementedByEngineError();
}
public deleteMessage(chatId: string, messageId: string) {
throw new NotImplementedByEngineError();
}
public editMessage(
chatId: string,
messageId: string,
request: EditMessageRequest,
) {
throw new NotImplementedByEngineError();
}
public clearMessages(chatId) {
throw new NotImplementedByEngineError();
}
@@ -338,6 +356,14 @@ export abstract class WhatsappSession {
throw new NotImplementedByEngineError();
}
public getMessagesAdminsOnly(id): Promise<SettingsSecurityChangeInfo> {
throw new NotImplementedByEngineError();
}
public setMessagesAdminsOnly(id, value) {
throw new NotImplementedByEngineError();
}
public deleteGroup(id) {
throw new NotImplementedByEngineError();
}
@@ -417,6 +443,10 @@ export abstract class WhatsappSession {
throw new NotImplementedByEngineError();
}
public async getEngineInfo(): Promise<any> {
return {};
}
/**
* END - Methods for API
*/
+14 -3
View File
@@ -3,6 +3,7 @@ import { ConfigModule } from '@nestjs/config';
import { PassportModule } from '@nestjs/passport';
import { ServeStaticModule } from '@nestjs/serve-static';
import { TerminusModule } from '@nestjs/terminus';
import { join } from 'path';
import { AuthController } from '../api/auth.controller';
import { ChatsController } from '../api/chats.controller';
@@ -33,12 +34,20 @@ export const IMPORTS = [
extraProviders: [WhatsappConfigService],
inject: [WhatsappConfigService],
useFactory: (config: WhatsappConfigService) => {
return [
const options = [
// Serve files (media)
{
rootPath: config.filesFolder,
serveRoot: config.files_uri,
serveRoot: config.filesUri,
},
];
if (config.getDashboardEnabled()) {
options.push({
rootPath: join(__dirname, '..', 'dashboard'),
serveRoot: config.dashboardUri,
});
}
return options;
},
}),
PassportModule,
@@ -76,4 +85,6 @@ const PROVIDERS = [
controllers: CONTROLLERS,
providers: PROVIDERS,
})
export class AppModuleCore {}
export class AppModuleCore {
constructor(protected config: WhatsappConfigService) {}
}
+114 -7
View File
@@ -15,6 +15,7 @@ import makeWASocket, {
} from '@adiwajshing/baileys';
import { UnprocessableEntityException } from '@nestjs/common';
import * as Buffer from 'buffer';
import { request } from 'express';
import * as fs from 'fs/promises';
import { Agent } from 'https';
import * as lodash from 'lodash';
@@ -24,6 +25,8 @@ import { flipObject, splitAt } from '../../../helpers';
import {
ChatRequest,
CheckNumberStatusQuery,
EditMessageRequest,
MessageContactVcardRequest,
MessageDestination,
MessageFileRequest,
MessageImageRequest,
@@ -32,6 +35,7 @@ import {
MessagePollRequest,
MessageReactionRequest,
MessageReplyRequest,
MessageStarRequest,
MessageTextRequest,
MessageVoiceRequest,
SendSeenRequest,
@@ -55,7 +59,10 @@ import {
WAHAChatPresences,
WAHAPresenceData,
} from '../../../structures/presence.dto';
import { WAMessage } from '../../../structures/responses.dto';
import {
WAMessage,
WAMessageReaction,
} from '../../../structures/responses.dto';
import { MeInfo } from '../../../structures/sessions.dto';
import { BROADCAST_ID, TextStatus } from '../../../structures/status.dto';
import {
@@ -73,6 +80,7 @@ import {
AvailableInPlusVersion,
NotImplementedByEngineError,
} from '../../exceptions';
import { toVcard } from '../../helpers';
import { createAgentProxy } from '../../helpers.proxy';
import { QR } from '../../QR';
import { NowebAuthFactoryCore } from './NowebAuthFactoryCore';
@@ -104,6 +112,7 @@ const ToEnginePresenceStatus = flipObject(PresenceStatuses);
export class WhatsappSessionNoWebCore extends WhatsappSession {
engine = WAHAEngine.NOWEB;
authFactory = new NowebAuthFactoryCore();
private restartTimeoutId: null | ReturnType<typeof setTimeout> = null;
get listenConnectionEventsFromTheStart() {
return true;
@@ -133,7 +142,7 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
keys: makeCacheableSignalKeyStore(state.keys, logger),
},
printQRInTerminal: true,
browser: Browsers.macOS('Chrome'),
browser: Browsers.ubuntu('Chrome'),
logger: logger,
mobile: false,
defaultQueryTimeoutMs: undefined,
@@ -200,15 +209,31 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
protected listenEngineEventsInDebugMode() {
this.sock.ev.process((events) => {
this.log.debug(`Received NOWEB events`, events);
this.log.debug(`NOWEB events: ${JSON.stringify(events)}`);
});
}
private restartClient() {
if (this.restartTimeoutId) {
this.log.log(
'Request to restart is already in progress, ignoring this request',
);
return;
}
this.log.log('Setting up client restart in 2 seconds...');
this.restartTimeoutId = setTimeout(() => {
this.restartTimeoutId = undefined;
this.buildClient();
}, 2 * SECOND);
}
protected listenConnectionEvents() {
this.log.debug(`Start listening ${BaileysEvents.CONNECTION_UPDATE}...`);
this.sock.ev.on(BaileysEvents.CONNECTION_UPDATE, async (update) => {
const { connection, lastDisconnect, qr } = update;
if (connection === 'open') {
const { connection, lastDisconnect, qr, isNewLogin } = update;
if (isNewLogin) {
this.restartClient();
} else if (connection === 'open') {
this.qr.save('');
this.status = WAHASessionStatus.WORKING;
this.resubscribeToKnownPresences();
@@ -226,7 +251,7 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
this.qr.save('');
// reconnect if not logged out
if (shouldReconnect) {
setTimeout(() => this.buildClient(), 2 * SECOND);
this.restartClient();
} else {
this.status = WAHASessionStatus.FAILED;
}
@@ -345,6 +370,37 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
return this.sock.sendMessage(chatId, message);
}
public deleteMessage(chatId: string, messageId: string) {
const jid = toJID(this.ensureSuffix(chatId));
const key = parseMessageId(messageId);
return this.sock.sendMessage(jid, { delete: key });
}
public editMessage(
chatId: string,
messageId: string,
request: EditMessageRequest,
) {
const jid = toJID(this.ensureSuffix(chatId));
const key = parseMessageId(messageId);
const message = {
text: request.text,
mentions: request.mentions?.map(toJID),
edit: key,
};
return this.sock.sendMessage(jid, message);
}
async sendContactVCard(request: MessageContactVcardRequest) {
const chatId = this.ensureSuffix(request.chatId);
const contacts = request.contacts.map((el) => ({ vcard: toVcard(el) }));
await this.sock.sendMessage(chatId, {
contacts: {
contacts: contacts,
},
});
}
async sendPoll(request: MessagePollRequest) {
const requestPoll = request.poll;
const poll = {
@@ -431,6 +487,19 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
return this.sock.sendMessage(key.remoteJid, reactionMessage);
}
async setStar(request: MessageStarRequest) {
const key = parseMessageId(request.messageId);
await this.sock.chatModify(
{
star: {
messages: [{ id: key.id, fromMe: key.fromMe }],
star: request.star,
},
},
toJID(request.chatId),
);
}
/**
* Contacts methods
*/
@@ -447,7 +516,9 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
}
public async getContactProfilePicture(query: ContactQuery) {
throw new NotImplementedByEngineError();
const contact = this.ensureSuffix(query.contactId);
const url = await this.sock.profilePictureUrl(contact, 'image');
return { profilePictureURL: url };
}
public async blockContact(request: ContactRequest) {
@@ -585,6 +656,12 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
this.handleIncomingMessages(messages, handler, false);
});
return true;
case WAHAEvents.MESSAGE_REACTION:
this.sock.ev.on(BaileysEvents.MESSAGES_UPSERT, ({ messages }) => {
const reactions = this.processMessageReaction(messages);
reactions.map(handler);
});
return true;
case WAHAEvents.MESSAGE_ANY:
this.sock.ev.on(BaileysEvents.MESSAGES_UPSERT, ({ messages }) =>
this.handleIncomingMessages(messages, handler, true),
@@ -641,6 +718,8 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
// if there is no text or media message
if (!message) return;
if (!message.message) return;
// Ignore reactions, we have dedicated handler for that
if (message.message.reactionMessage) return;
// Ignore poll votes, we have dedicated handler for that
if (message.message.pollUpdateMessage) return;
// Do not include my messages
@@ -651,6 +730,34 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
}
}
private processMessageReaction(messages: any[]): WAMessageReaction[] {
const reactions = [];
for (const message of messages) {
if (!message) return [];
if (!message.message) return [];
if (!message.message.reactionMessage) return [];
const id = buildMessageId(message.key);
const fromToParticipant = getFromToParticipant(message);
const reactionMessage = message.message.reactionMessage;
const messageId = buildMessageId(reactionMessage.key);
const reaction: WAMessageReaction = {
id: id,
timestamp: message.messageTimestamp,
from: toCusFormat(fromToParticipant.from),
fromMe: message.key.fromMe,
to: toCusFormat(fromToParticipant.to),
participant: toCusFormat(fromToParticipant.participant),
reaction: {
text: reactionMessage.text,
messageId: messageId,
},
};
reactions.push(reaction);
}
return reactions;
}
private processIncomingMessage(message) {
return this.downloadMedia(message)
.then(this.toWAMessage)
@@ -6,7 +6,6 @@ import {
ChatRequest,
CheckNumberStatusQuery,
GetMessageQuery,
MessageContactVcardRequest,
MessageFileRequest,
MessageImageRequest,
MessageLinkPreviewRequest,
@@ -164,14 +163,6 @@ export class WhatsappSessionVenomCore extends WhatsappSession {
}
}
sendContactVCard(request: MessageContactVcardRequest) {
return this.whatsapp.sendContactVcard(
request.chatId,
request.contactsId,
request.name,
);
}
sendText(request: MessageTextRequest) {
return this.whatsapp.sendText(
this.ensureSuffix(request.chatId),
+112 -10
View File
@@ -8,18 +8,21 @@ import {
GroupChat,
Location,
Message,
Reaction,
} from 'whatsapp-web.js';
import { Message as MessageInstance } from 'whatsapp-web.js/src/structures';
import {
ChatRequest,
CheckNumberStatusQuery,
EditMessageRequest,
GetMessageQuery,
MessageFileRequest,
MessageImageRequest,
MessageLocationRequest,
MessageReactionRequest,
MessageReplyRequest,
MessageStarRequest,
MessageTextRequest,
MessageVoiceRequest,
SendSeenRequest,
@@ -39,7 +42,10 @@ import {
ParticipantsRequest,
SettingsSecurityChangeInfo,
} from '../../../structures/groups.dto';
import { WAMessage } from '../../../structures/responses.dto';
import {
WAMessage,
WAMessageReaction,
} from '../../../structures/responses.dto';
import { MeInfo } from '../../../structures/sessions.dto';
import { WAMessageRevokedBody } from '../../../structures/webhooks.dto';
import { IEngineMediaProcessor } from '../../abc/media.abc';
@@ -67,14 +73,24 @@ export class WhatsappSessionWebJSCore extends WhatsappSession {
this.qr = new QR();
}
protected async buildClient() {
const clientOptions: ClientOptions = {
protected getClientOptions(): ClientOptions {
return {
puppeteer: {
headless: true,
executablePath: this.getBrowserExecutablePath(),
args: this.getBrowserArgsForPuppeteer(),
},
webVersion: '2.2412.54',
webVersionCache: {
type: 'remote',
remotePath:
'https://raw.githubusercontent.com/wppconnect-team/wa-version/main/html/{version}.html',
},
};
}
protected async buildClient() {
const clientOptions = this.getClientOptions();
this.addProxyConfig(clientOptions);
return new Client(clientOptions);
}
@@ -112,6 +128,15 @@ export class WhatsappSessionWebJSCore extends WhatsappSession {
this.status = WAHASessionStatus.FAILED;
this.log.error('The WhatsApp Web page has been closed');
});
if (this.isDebugEnabled()) {
this.log.debug("Logging 'console' event for web page");
this.whatsapp.pupPage.on('console', (msg) =>
this.log.debug(`WEBJS page log: ${msg.text()}`),
);
this.whatsapp.pupPage.evaluate(() =>
console.log(`url is ${location.href}`),
);
}
})
.catch((error) => {
this.status = WAHASessionStatus.FAILED;
@@ -150,7 +175,8 @@ export class WhatsappSessionWebJSCore extends WhatsappSession {
for (const key in Events) {
const event = Events[key];
this.whatsapp.on(event, (...data: any[]) => {
this.log.debug(`Received WEBJS event`, { event: event, data: data });
const log = { event: event, data: data };
this.log.debug(`WEBJS event: ${JSON.stringify(log)}`);
});
}
}
@@ -231,6 +257,24 @@ export class WhatsappSessionWebJSCore extends WhatsappSession {
);
}
public deleteMessage(chatId: string, messageId: string) {
const message = this.recreateMessage(messageId);
return message.delete(true);
}
public editMessage(
chatId: string,
messageId: string,
request: EditMessageRequest,
) {
const message = this.recreateMessage(messageId);
const options = {
// It's fine to sent just ids instead of Contact object
mentions: request.mentions as unknown as string[],
};
return message.edit(request.text, options);
}
reply(request: MessageReplyRequest) {
const options = {
quotedMessageId: request.reply_to,
@@ -279,15 +323,30 @@ export class WhatsappSessionWebJSCore extends WhatsappSession {
}
async setReaction(request: MessageReactionRequest) {
const messageId = this.deserializeId(request.messageId);
// Recreate instance to react on it
const message = new MessageInstance(this.whatsapp);
message.id = messageId;
message._data = { id: messageId };
const message = this.recreateMessage(request.messageId);
return message.react(request.reaction);
}
/**
* Recreate message instance from id
*/
private recreateMessage(msgId: string): MessageInstance {
const messageId = this.deserializeId(msgId);
const data = {
id: messageId,
};
return new MessageInstance(this.whatsapp, data);
}
async setStar(request: MessageStarRequest) {
const message = this.recreateMessage(request.messageId);
if (request.star) {
await message.star();
} else {
await message.unstar();
}
}
/**
* Chats methods
*/
@@ -377,6 +436,7 @@ export class WhatsappSessionWebJSCore extends WhatsappSession {
public async getInfoAdminsOnly(id): Promise<SettingsSecurityChangeInfo> {
const groupChat = (await this.whatsapp.getChatById(id)) as GroupChat;
return {
// Undocumented property, can be changed in the future
// @ts-ignore
adminsOnly: groupChat.groupMetadata.restrict,
};
@@ -387,6 +447,21 @@ export class WhatsappSessionWebJSCore extends WhatsappSession {
return groupChat.setInfoAdminsOnly(value);
}
public async getMessagesAdminsOnly(id): Promise<SettingsSecurityChangeInfo> {
const groupChat = (await this.whatsapp.getChatById(id)) as GroupChat;
// @ts-ignore
return {
// Undocumented property, can be changed in the future
// @ts-ignore
adminsOnly: groupChat.groupMetadata.announce,
};
}
public async setMessagesAdminsOnly(id, value) {
const groupChat = (await this.whatsapp.getChatById(id)) as GroupChat;
return groupChat.setMessagesAdminsOnly(value);
}
public getGroups() {
return this.whatsapp
.getChats()
@@ -520,6 +595,11 @@ export class WhatsappSessionWebJSCore extends WhatsappSession {
},
);
return true;
case WAHAEvents.MESSAGE_REACTION:
this.whatsapp.on('message_reaction', (message) =>
handler(this.processMessageReaction(message)),
);
return true;
case WAHAEvents.MESSAGE_ANY:
this.whatsapp.on(Events.MESSAGE_CREATE, (message) =>
this.processIncomingMessage(message).then(handler),
@@ -557,6 +637,21 @@ export class WhatsappSessionWebJSCore extends WhatsappSession {
return await this.toWAMessage(message);
}
private processMessageReaction(reaction: Reaction): WAMessageReaction {
return {
id: reaction.id._serialized,
from: reaction.senderId,
fromMe: reaction.id.fromMe,
participant: reaction.senderId,
to: reaction.id.remote,
timestamp: reaction.timestamp,
reaction: {
text: reaction.reaction,
messageId: reaction.msgId._serialized,
},
};
}
protected toWAMessage(message: Message): Promise<WAMessage> {
// @ts-ignore
return Promise.resolve({
@@ -582,6 +677,13 @@ export class WhatsappSessionWebJSCore extends WhatsappSession {
});
}
public async getEngineInfo() {
return {
WWebVersion: await this.whatsapp?.getWWebVersion(),
state: await this.whatsapp?.getState(),
};
}
protected toWAContact(contact: Contact) {
// @ts-ignore
contact.id = contact.id._serialized;
+21
View File
@@ -0,0 +1,21 @@
export function toVcard(data): string {
if (data.vcard) {
return data.vcard;
}
const parts = [];
parts.push('BEGIN:VCARD');
parts.push('VERSION:3.0');
parts.push(`FN:${data.fullName}`);
if (data.organization) {
parts.push(`ORG:${data.organization};`);
}
if (data.whatsappId) {
parts.push(
`TEL;type=CELL;type=VOICE;waid=${data.whatsappId}:${data.phoneNumber}`,
);
} else {
parts.push(`TEL;type=CELL;type=VOICE:${data.phoneNumber}`);
}
parts.push('END:VCARD');
return parts.join('\n');
}
+30 -4
View File
@@ -1,6 +1,7 @@
import {
ConsoleLogger,
Injectable,
LogLevel,
NotFoundException,
UnprocessableEntityException,
} from '@nestjs/common';
@@ -38,8 +39,8 @@ export class OnlyDefaultSessionIsAllowed extends UnprocessableEntityException {
}
}
export function buildLogger(name) {
return new ConsoleLogger(name, { logLevels: getLogLevels() });
export function buildLogger(name: string, levels: LogLevel[]) {
return new ConsoleLogger(name, { logLevels: levels });
}
@Injectable()
@@ -107,12 +108,13 @@ export class SessionManagerCore extends SessionManager {
const name = request.name;
this.log.log(`'${name}' - starting session...`);
const log = buildLogger(`WhatsappSession - ${name}`);
const levels = getLogLevels(request.config?.debug);
const log = buildLogger(`WhatsappSession - ${name}`, levels);
const mediaManager = new CoreMediaManager(
new MediaStorageCore(),
this.config.mimetypes,
);
const webhookLog = buildLogger(`Webhook - ${name}`);
const webhookLog = buildLogger(`Webhook - ${name}`, levels);
const webhook = new this.WebhookConductorClass(webhookLog);
const proxyConfig = this.getProxyConfig(request);
const sessionConfig: SessionParams = {
@@ -184,6 +186,18 @@ export class SessionManagerCore extends SessionManager {
}
async logout(request: SessionLogoutRequest) {
const name = request.name;
this.onlyDefault(request.name);
this.stop({ name: name, logout: false })
.then(() => {
this.log.log(`Session '${name}' has been stopped.`);
})
.catch((err) => {
this.log.error(
`Error while stopping session '${name}' while logging out`,
err,
);
});
await this.sessionAuthRepository.clean(request.name);
}
@@ -213,13 +227,25 @@ export class SessionManagerCore extends SessionManager {
];
}
const me = await this.session.getSessionMeInfo().catch((err) => null);
const engine = {
engine: this.session?.engine,
...(await this.session?.getEngineInfo().catch((err) => ({}))),
};
return [
{
name: this.session.name,
status: this.session.status,
config: this.session.sessionConfig,
me: me,
engine: engine,
},
];
}
async getSessionInfo(name: string): Promise<SessionInfo | null> {
if (name !== this.DEFAULT) {
return null;
}
return this.getSessions(true).then((sessions) => sessions[0]);
}
}
+8 -2
View File
@@ -13,18 +13,24 @@ export class SwaggerModuleCore {
.setTitle('WAHA - WhatsApp HTTP API')
.setDescription(
'WhatsApp HTTP API that you can run in a click!<br/>' +
'<br/>' +
'Learn more:' +
'<ul>' +
'<li><a href="https://waha.devlike.pro/" target="_blank">Documentation</a></li>' +
'<li><a href="https://waha.devlike.pro/docs/how-to/engines/#features" target="_blank">Supported features in engines</a></li>' +
'<li><a href="https://github.com/devlikeapro/whatsapp-http-api" target="_blank">GitHub - WAHA Core</a></li>' +
'<li><a href="https://github.com/devlikeapro/whatsapp-http-api-plu' + // Separate line to pass pre-commit check
's" target="_blank">GitHub - WAHA Plus</a></li>' +
'<li><b>NEW!</b> - <a href="/dashboard">WAHA Dashboard</a></li>' +
'<li><b>NEW!</b> - <a href="https://waha.devlike.pro/docs/how-to/waha-dashboard">WAHA Dashboard Documentation</a></li>' +
'</ul>' +
'<br/>' +
'Support the project and get WAHA Plus version!' +
'<p>Support the project and get WAHA Plus version!</p>' +
'<ul>' +
'<li><a href="https://waha.devlike.pro/docs/how-to/plu' + // Separate line to pass pre-commit check
's-version/" target="_blank">WAHA Plus</a></li>' +
'<li><a href="https://patreon.com/wa_http_api/" target="_blank">Patreon</a></li>' +
'<li><a href="https://boosty.to/wa-http-api/" target="_blank">Boosty</a></li>' +
'<li><a href="https://portal.devlike.pro/" target="_blank">Patron Portal</a></li>' +
'</ul>',
)
.setExternalDoc('WAHA', 'https://waha.devlike.pro/')
+1 -1
View File
@@ -19,7 +19,7 @@ export class WebhookSenderCore extends WebhookSender {
return;
}
this.log.log(`POST request was sent with status code: ${res.statusCode}`);
this.log.verbose(`Response: ${JSON.stringify(body)}`);
this.log.debug(`Response: ${body}`);
});
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

+289
View File
@@ -0,0 +1,289 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Dashboard | WAHA</title>
<link rel="icon" href="./favicon.ico" />
<style>
:root {
--surface-card: #1f2937;
--surface-border: #374151;
--card-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
}
body,
html {
height: 100%;
padding: 0;
margin: 0;
}
* {
box-sizing: border-box;
}
.bg-image {
/* The image used */
background-image: url('./waha-dashboard.png');
/* Add the blur effect */
filter: blur(2px);
-webkit-filter: blur(2px);
/* Full height */
height: 100%;
/* Center and scale the image nicely */
background-position: center;
background-repeat: no-repeat;
background-size: cover;
}
body {
background-color: #111827;
color: rgba(255, 255, 255, 0.87);
}
svg {
width: 100px;
height: 100px;
}
.message {
font-size: 20px;
margin: 20px;
}
a {
color: rgb(158, 158, 255);
text-decoration-color: rgb(158, 158, 255);
}
.upgrade-link {
text-decoration: none;
font-size: 1.5rem;
}
.link-button {
background-color: #4ade80;
padding: 10px 20px;
border-radius: 5px;
color: #052e16;
text-decoration: none;
margin-top: 50px;
}
.card {
min-width: 25rem;
background: var(--surface-card);
border: 1px solid var(--surface-border);
box-shadow: var(--card-shadow);
padding: 2rem;
border-radius: 12px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 2;
text-align: center;
}
</style>
</head>
<body>
<div class="bg-image"></div>
<div class="card">
<svg
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="1080"
height="1080"
viewBox="0 0 1080 1080"
xml:space="preserve"
>
<desc>Created with Fabric.js 5.2.4</desc>
<defs></defs>
<g
transform="matrix(1 0 0 1 540 540)"
id="c3cb5d1b-8350-492a-8567-8c1ee2307b9a"
></g>
<g
transform="matrix(1 0 0 1 540 540)"
id="054ae9ae-db12-4435-8648-8bfb02267690"
>
<rect
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(255, 255, 255);
fill-rule: nonzero;
opacity: 1;
visibility: hidden;
"
vector-effect="non-scaling-stroke"
x="-540"
y="-540"
rx="0"
ry="0"
width="1080"
height="1080"
/>
</g>
<g transform="matrix(1 0 0 1 540 540)">
<rect
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(255, 255, 255);
fill-rule: nonzero;
opacity: 1;
visibility: hidden;
"
vector-effect="non-scaling-stroke"
x="-540"
y="-540"
rx="0"
ry="0"
width="1080"
height="1080"
/>
</g>
<g transform="matrix(2.02 0 0 2.02 540 540)">
<rect
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(255, 255, 255);
fill-rule: nonzero;
opacity: 1;
visibility: hidden;
"
vector-effect="non-scaling-stroke"
x="-540"
y="-540"
rx="0"
ry="0"
width="1080"
height="1080"
/>
</g>
<g transform="matrix(3.68 0 0 3.68 540.38 540.48)">
<path
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(74, 173, 32);
fill-rule: nonzero;
opacity: 1;
"
vector-effect="non-scaling-stroke"
transform=" translate(-392.21, -570.16)"
d="M 392.26 705.96 C 376.77 705.96 361.28999999999996 706.0400000000001 345.8 705.95 C 318.16 705.7900000000001 297.6 685.2700000000001 297.22 657.57 C 297.15000000000003 652.24 297.07000000000005 646.9100000000001 297.25 641.59 C 297.36 638.23 296.3 636.6 292.72 636.89 C 290.24 637.09 287.73 636.98 285.23 636.9 C 277.1 636.63 271.70000000000005 631.65 271.38 623.49 C 271.06 615.1800000000001 271.06 606.83 271.37 598.52 C 271.69 590.05 277.04 585.23 285.58 585.01 C 297.21 584.72 297.19 584.72 297.21999999999997 573.01 C 297.22999999999996 567.36 297.14 561.72 297.97999999999996 556.0699999999999 C 301.25999999999993 533.93 320.72999999999996 516.4599999999999 343.09 516.04 C 355.07 515.81 367.07 515.86 379.04999999999995 516.02 C 382.72999999999996 516.0699999999999 384.02 514.87 383.96 511.15 C 383.77 500.65999999999997 383.76 490.16999999999996 383.96999999999997 479.67999999999995 C 384.04999999999995 476.00999999999993 382.96 473.65999999999997 379.92999999999995 471.37999999999994 C 372.23999999999995 465.5799999999999 369.78 456.25999999999993 373.06999999999994 447.7199999999999 C 376.18999999999994 439.5999999999999 385.13999999999993 433.7399999999999 393.4599999999999 434.3599999999999 C 402.63999999999993 435.0399999999999 410.43999999999994 441.3499999999999 412.4599999999999 450.2199999999999 C 414.4799999999999 459.0299999999999 411.7099999999999 466.4299999999999 404.4699999999999 471.7899999999999 C 401.8699999999999 473.7199999999999 400.9199999999999 475.69999999999993 400.9699999999999 478.8299999999999 C 401.1199999999999 489.1499999999999 401.2499999999999 499.4799999999999 400.9299999999999 509.79999999999995 C 400.7899999999999 514.5 402.0299999999999 516.24 406.9999999999999 516.0799999999999 C 417.8099999999999 515.7299999999999 428.6399999999999 515.91 439.4699999999999 515.9899999999999 C 466.5199999999999 516.2099999999999 486.7199999999999 536.2299999999999 487.2399999999999 563.3 C 487.3399999999999 568.29 487.2599999999999 573.29 487.2799999999999 578.29 C 487.2999999999999 585 487.3099999999999 585 493.7899999999999 585.02 C 495.94999999999993 585.03 498.1199999999999 584.96 500.2799999999999 585.06 C 507.94999999999993 585.43 512.9999999999999 590.42 513.1499999999999 598.1199999999999 C 513.3199999999998 606.6099999999999 513.3099999999998 615.1099999999999 513.1599999999999 623.5999999999999 C 513.0299999999999 631.3599999999999 508.1999999999999 636.31 500.47999999999985 636.8699999999999 C 498.15999999999985 637.0399999999998 495.77999999999986 637.2199999999999 493.49999999999983 636.8899999999999 C 488.1999999999998 636.1299999999999 486.86999999999983 638.5399999999998 487.1999999999998 643.3999999999999 C 487.54999999999984 648.5399999999998 487.3499999999998 653.7199999999999 487.23999999999984 658.8799999999999 C 486.67999999999984 685.6599999999999 466.4599999999998 705.7399999999999 439.71999999999986 705.9599999999999 C 423.9 706.06 408.08 705.95 392.26 705.96 z"
stroke-linecap="round"
/>
</g>
<g transform="matrix(-3.68 0 0 -3.68 546.38 845.01)">
<path
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(56, 134, 22);
fill-rule: nonzero;
opacity: 1;
"
vector-effect="non-scaling-stroke"
transform=" translate(-394.07, -654.42)"
d="M 394.26 632.93 C 404.75 632.93 415.23 632.9 425.71999999999997 632.9399999999999 C 431.92999999999995 632.9599999999999 433.52 634.7399999999999 432.90999999999997 640.7099999999999 C 430.99999999999994 659.66 414.40999999999997 675.2199999999999 395.38 675.91 C 376.87 676.5799999999999 359.57 662.65 356 644.1899999999999 C 355.72 642.7199999999999 355.33 641.26 355.19 639.78 C 354.71 634.9 356.32 633.01 361.3 632.97 C 372.29 632.87 383.28 632.93 394.26 632.93 z"
stroke-linecap="round"
/>
</g>
<g transform="matrix(3.68 0 0 3.68 673.99 594.08)">
<path
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(56, 135, 22);
fill-rule: nonzero;
opacity: 1;
"
vector-effect="non-scaling-stroke"
transform=" translate(-428.75, -584.99)"
d="M 428.83 602 C 419.12 601.96 411.59999999999997 594.6 411.53 585.07 C 411.46999999999997 575.4100000000001 419.21 567.9100000000001 429.16999999999996 567.98 C 438.33 568.0500000000001 445.93999999999994 575.71 445.97999999999996 584.91 C 446.02 594.33 438.29 602.04 428.83 602 z"
stroke-linecap="round"
/>
</g>
<g transform="matrix(3.68 0 0 3.68 406.92 594.18)">
<path
style="
stroke: none;
stroke-width: 1;
stroke-dasharray: none;
stroke-linecap: butt;
stroke-dashoffset: 0;
stroke-linejoin: miter;
stroke-miterlimit: 4;
fill: rgb(56, 135, 22);
fill-rule: nonzero;
opacity: 1;
"
vector-effect="non-scaling-stroke"
transform=" translate(-356.06, -584.99)"
d="M 339.05 584.57 C 339.19 574.94 346.67 567.84 356.53000000000003 567.99 C 366.26000000000005 568.14 373.21000000000004 575.46 373.07000000000005 585.42 C 372.94000000000005 595.16 365.62000000000006 602.13 355.68000000000006 602 C 346.04 601.87 338.91 594.4 339.05 584.57 z"
stroke-linecap="round"
/>
</g>
</svg>
<div class="message">
Sorry,
<a
href="https://waha.devlike.pro/docs/how-to/waha-dashboard"
target="_blank"
>WAHA Dashboard</a
>
is not available in <strong>WAHA Core</strong> version.
<br />
Please consider upgrading to <strong>WAHA Plus</strong>.
</div>
<div style="margin-top: 2rem; margin-bottom: 1rem">
<a
class="upgrade-link link-button"
href="https://waha.devlike.pro/docs/how-to/plus-version/"
target="_blank"
>Upgrade to WAHA Plus</a
>
</div>
</div>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

+5 -4
View File
@@ -33,10 +33,11 @@ function splitAt(str: string, index) {
return [fst.join(''), snd.join('')];
}
function getLogLevels(): LogLevel[] {
return process.env.DEBUG != undefined
? ['log', 'debug', 'error', 'verbose', 'warn']
: ['log', 'error', 'warn', 'verbose'];
function getLogLevels(debug: boolean): LogLevel[] {
const enableDebug = process.env.DEBUG != undefined || debug;
return enableDebug
? ['log', 'error', 'warn', 'debug', 'verbose']
: ['log', 'error', 'warn'];
}
export { flipObject, getLogLevels, parseBool, splitAt };
+2 -1
View File
@@ -31,11 +31,12 @@ async function loadModules(): Promise<
async function bootstrap() {
const [AppModule, SwaggerModule] = await loadModules();
const app = await NestFactory.create(AppModule, {
logger: getLogLevels(),
logger: getLogLevels(false),
});
app.enableShutdownHooks();
app.useGlobalFilters(new AllExceptionsFilter());
app.enableCors();
// Allow to send big body - for images and attachments
app.use(json({ limit: '50mb' }));
+68 -4
View File
@@ -85,9 +85,59 @@ export class MessageRequest extends SessionBaseRequest {
messageId: string;
}
export class VCardContact {
@ApiProperty({
example:
'BEGIN:VCARD\nVERSION:3.0\nFN:Jane Doe\nORG:Company Name;\nTEL;type=CELL;type=VOICE;waid=911111111111:+91 11111 11111\nEND:VCARD',
description: 'The vcard string',
})
vcard: string;
}
export class Contact {
@ApiProperty({
example: 'John Doe',
description: 'The full name of the contact',
})
fullName: string;
@ApiProperty({
example: 'Company Name',
description: 'The organization of the contact',
required: false,
})
organization: string;
@ApiProperty({
example: '+91 11111 11111',
description: 'The phone number of the contact',
})
phoneNumber: string;
@ApiProperty({
example: '911111111111',
description: 'The whatsapp id of the contact. DO NOT add + or @c.us',
required: false,
})
whatsappId: string;
vcard: string = null;
}
@ApiExtraModels(Contact, VCardContact)
export class MessageContactVcardRequest extends ChatRequest {
contactsId: string;
name: string;
@ApiProperty({
type: 'array',
oneOf: [
{
$ref: getSchemaPath(VCardContact),
},
{
$ref: getSchemaPath(Contact),
},
],
})
contacts: (VCardContact | Contact)[];
}
export class MessageTextRequest extends ChatRequest {
@@ -96,6 +146,13 @@ export class MessageTextRequest extends ChatRequest {
mentions?: string[];
}
export class EditMessageRequest {
text = 'Hello, world!';
@ApiHideProperty()
mentions?: string[];
}
export class MessageReplyRequest extends MessageTextRequest {
text = 'Reply text';
@ApiProperty({
@@ -114,8 +171,8 @@ export class MessageLocationRequest extends ChatRequest {
class FileRequest extends ChatRequest {
@ApiProperty({
oneOf: [
{ $ref: getSchemaPath(BinaryFile) },
{ $ref: getSchemaPath(RemoteFile) },
{ $ref: getSchemaPath(BinaryFile) },
],
})
file: BinaryFile | RemoteFile;
@@ -133,8 +190,8 @@ export class MessageFileRequest extends FileRequest {
export class MessageVoiceRequest extends ChatRequest {
@ApiProperty({
oneOf: [
{ $ref: getSchemaPath(VoiceBinaryFile) },
{ $ref: getSchemaPath(VoiceRemoteFile) },
{ $ref: getSchemaPath(VoiceBinaryFile) },
],
})
file: VoiceBinaryFile | VoiceRemoteFile;
@@ -167,6 +224,13 @@ export class MessageReactionRequest extends MessageRequest {
reaction: string;
}
export class MessageStarRequest extends MessageRequest {
@ChatIdProperty()
chatId: string;
star: boolean;
}
export class WANumberExistResult {
numberExists: boolean;
@ApiProperty({
+1
View File
@@ -3,6 +3,7 @@ export const SECOND = 1000;
export enum WAHAEvents {
SESSION_STATUS = 'session.status',
MESSAGE = 'message',
MESSAGE_REACTION = 'message.reaction',
MESSAGE_ANY = 'message.any',
MESSAGE_ACK = 'message.ack',
MESSAGE_REVOKED = 'message.revoked',
+2 -6
View File
@@ -1,4 +1,5 @@
import { ApiProperty } from '@nestjs/swagger';
export class Base64File {
mimetype: string;
data: string;
@@ -70,14 +71,9 @@ export class VoiceRemoteFile {
})
mimetype = 'audio/ogg; codecs=opus';
@ApiProperty({
description: 'Document file name. Optional',
})
filename = 'voice-message.mp3';
@ApiProperty({
example:
'https://github.com/devlikeapro/whatsapp-http-api/raw/core/examples/dev.likeapro.mp3',
'https://github.com/devlikeapro/whatsapp-http-api/raw/core/examples/dev.likeapro.opus',
})
url: string;
}
+1 -1
View File
@@ -9,7 +9,7 @@ export class Participant {
}
export class SettingsSecurityChangeInfo {
adminsOnly: boolean;
adminsOnly: boolean = true;
}
/**
+25 -1
View File
@@ -30,7 +30,7 @@ export class WAMedia {
filename?: string;
}
export class WAMessage {
class WAMessageBase {
@MessageIdProperty()
id: string;
@@ -65,7 +65,9 @@ export class WAMessage {
description: 'For groups - participant who sent the message',
})
participant: string;
}
export class WAMessage extends WAMessageBase {
@ApiProperty({
description: 'Message content',
})
@@ -121,3 +123,25 @@ export class WAMessage {
})
_data?: any;
}
export class WAReaction {
@ApiProperty({
description:
'Reaction to the message. Either the reaction (emoji) or empty string to remove the reaction',
})
text: string;
@ApiProperty({
description: 'Message ID for the message to react to',
example: 'false_11111111111@c.us_AAAAAAAAAAAAAAAAAAAA',
})
messageId: string;
}
export class WAMessageReaction extends WAMessageBase {
@ApiProperty({
description:
'Reaction to the message. Either the reaction (emoji) or empty string to remove the reaction',
})
reaction: WAReaction;
}
+4
View File
@@ -39,10 +39,13 @@ export class ProxyConfig {
export class SessionConfig {
webhooks?: WebhookConfig[];
@ApiProperty({
example: null,
})
proxy?: ProxyConfig;
debug: boolean = false;
}
export class SessionStartRequest {
@@ -79,4 +82,5 @@ export class MeInfo {
export class SessionInfo extends SessionDTO {
me?: MeInfo;
engine?: any;
}
+12 -1
View File
@@ -10,7 +10,7 @@ import {
import { WAHAEnvironment } from './environment.dto';
import { WAHAChatPresences } from './presence.dto';
import { ChatIdProperty, MessageIdProperty } from './properties.dto';
import { WAMessage } from './responses.dto';
import { WAMessage, WAMessageReaction } from './responses.dto';
import { MeInfo } from './sessions.dto';
export class WAMessageAckBody {
@@ -134,6 +134,16 @@ class WAHAWebhookMessage extends WAHAWebhook {
payload: WAMessage;
}
class WAHAWebhookMessageReaction extends WAHAWebhook {
@ApiProperty({
description:
'The event is triggered when a user reacts or removes a reaction.',
})
event = WAHAEvents.MESSAGE_REACTION;
payload: WAMessageReaction;
}
class WAHAWebhookMessageAny extends WAHAWebhook {
@ApiProperty({
description: 'Fired on all message creations, including your own.',
@@ -223,6 +233,7 @@ class WAHAWebhookPollVoteFailed extends WAHAWebhook {
const WAHA_WEBHOOKS = [
WAHAWebhookSessionStatus,
WAHAWebhookMessage,
WAHAWebhookMessageReaction,
WAHAWebhookMessageAny,
WAHAWebhookMessageAck,
WAHAWebhookMessageRevoked,
+1 -1
View File
@@ -33,7 +33,7 @@ export function getEngineName(): string {
}
export const VERSION: WAHAEnvironment = {
version: '2024.2.4',
version: '2024.5.2',
engine: getEngineName(),
tier: getWAHAVersion(),
browser: getBrowserExecutablePath(),
+190 -54
View File
@@ -14,7 +14,7 @@ __metadata:
"@adiwajshing/baileys@github:WhiskeySockets/Baileys":
version: 6.6.0
resolution: "@adiwajshing/baileys@https://github.com/WhiskeySockets/Baileys.git#commit=8ae00256166b72e4d758aae2dfd25c0f92d98f3f"
resolution: "@adiwajshing/baileys@https://github.com/WhiskeySockets/Baileys.git#commit=f5a5eb991a6b14a6efdf48bcfed039966abaec8d"
dependencies:
"@adiwajshing/keyed-db": ^0.2.4
"@hapi/boom": ^9.1.3
@@ -44,7 +44,7 @@ __metadata:
optional: true
sharp:
optional: true
checksum: 044127289093597df1c7cf11bd2634b8fc7a1a5313c44bebe25e952407c3b84b65ee250b21b1ad353811c561a30a5f69c5b8882d458525d8a8d8b91cb260c74a
checksum: 4c824f02decad9b71cc8c1910407de1b62436f1fd9ef39999ece9db205b50c4a227a7366d589b244ac0ef8f7f3f8836632a03c1044998176dfdeef81519d69e7
languageName: node
linkType: hard
@@ -1409,6 +1409,23 @@ __metadata:
languageName: node
linkType: hard
"@puppeteer/browsers@npm:1.9.1":
version: 1.9.1
resolution: "@puppeteer/browsers@npm:1.9.1"
dependencies:
debug: 4.3.4
extract-zip: 2.0.1
progress: 2.0.3
proxy-agent: 6.3.1
tar-fs: 3.0.4
unbzip2-stream: 1.4.3
yargs: 17.7.2
bin:
browsers: lib/cjs/main-cli.js
checksum: 1ea82e34af882dc6d7e8392a88ec4196e206a7f65743be39c196c7068d66b9bdfa370e28c6ab09946bd2baa2182adbcbf445e79cc9bcc5242f05878ae7045b27
languageName: node
linkType: hard
"@sindresorhus/is@npm:^0.14.0":
version: 0.14.0
resolution: "@sindresorhus/is@npm:0.14.0"
@@ -3779,6 +3796,18 @@ __metadata:
languageName: node
linkType: hard
"chromium-bidi@npm:0.5.8":
version: 0.5.8
resolution: "chromium-bidi@npm:0.5.8"
dependencies:
mitt: 3.0.1
urlpattern-polyfill: 10.0.0
peerDependencies:
devtools-protocol: "*"
checksum: 4e4bb8d3907b3a17adf15e95220fc16733e0c4b03d0eccb071010a78ca85d122a0435da95ab657ade6d15e8c9b3cd917088b6128a0aec45e4444916625a4076f
languageName: node
linkType: hard
"ci-info@npm:^2.0.0":
version: 2.0.0
resolution: "ci-info@npm:2.0.0"
@@ -4255,6 +4284,23 @@ __metadata:
languageName: node
linkType: hard
"cosmiconfig@npm:9.0.0":
version: 9.0.0
resolution: "cosmiconfig@npm:9.0.0"
dependencies:
env-paths: ^2.2.1
import-fresh: ^3.3.0
js-yaml: ^4.1.0
parse-json: ^5.2.0
peerDependencies:
typescript: ">=4.9.5"
peerDependenciesMeta:
typescript:
optional: true
checksum: a30c424b53d442ea0bdd24cb1b3d0d8687c8dda4a17ab6afcdc439f8964438801619cdb66e8e79f63b9caa3e6586b60d8bab9ce203e72df6c5e80179b971fe8f
languageName: node
linkType: hard
"cosmiconfig@npm:^7.0.1":
version: 7.1.0
resolution: "cosmiconfig@npm:7.1.0"
@@ -4696,6 +4742,13 @@ __metadata:
languageName: node
linkType: hard
"devtools-protocol@npm:0.0.1045489":
version: 0.0.1045489
resolution: "devtools-protocol@npm:0.0.1045489"
checksum: 670b2ecc8e890358b08da3095b4c927ffc5ef846a39e1526ff99aecaa623b339450dfe308e421e64bf94308441832b8e9497ebda97fb02266fef3f455286742f
languageName: node
linkType: hard
"devtools-protocol@npm:0.0.1147663":
version: 0.0.1147663
resolution: "devtools-protocol@npm:0.0.1147663"
@@ -4703,10 +4756,10 @@ __metadata:
languageName: node
linkType: hard
"devtools-protocol@npm:0.0.981744":
version: 0.0.981744
resolution: "devtools-protocol@npm:0.0.981744"
checksum: 609901bff551f5fbe98e272bdda7269de527e28fab138de371ffd7e9a06fa68ca2eec2e961bd1cd6fd98223ccee562c55b7ce3235d4e37cc8d85d6681bc45593
"devtools-protocol@npm:0.0.1232444":
version: 0.0.1232444
resolution: "devtools-protocol@npm:0.0.1232444"
checksum: b421a3c20506d597211d101c3ed4e550db2ca195d59c3371b2e04a8d057f33be60e732bafc80dc53b34546593a7751857321971e235e9ce9f1c5a9523fd8fa20
languageName: node
linkType: hard
@@ -5004,7 +5057,7 @@ __metadata:
languageName: node
linkType: hard
"env-paths@npm:^2.2.0":
"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1":
version: 2.2.1
resolution: "env-paths@npm:2.2.1"
checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e
@@ -9055,6 +9108,13 @@ __metadata:
languageName: node
linkType: hard
"mitt@npm:3.0.1":
version: 3.0.1
resolution: "mitt@npm:3.0.1"
checksum: b55a489ac9c2949ab166b7f060601d3b6d893a852515ae9eca4e11df01c013876df777ea109317622b5c1c60e8aae252558e33c8c94e14124db38f64a39614b1
languageName: node
linkType: hard
"mixin-deep@npm:^1.2.0":
version: 1.3.2
resolution: "mixin-deep@npm:1.3.2"
@@ -9347,7 +9407,7 @@ __metadata:
languageName: node
linkType: hard
"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.5":
"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.9":
version: 2.7.0
resolution: "node-fetch@npm:2.7.0"
dependencies:
@@ -9416,10 +9476,10 @@ __metadata:
languageName: node
linkType: hard
"node-webpmux@npm:3.1.0":
version: 3.1.0
resolution: "node-webpmux@npm:3.1.0"
checksum: 45041b561d21ab88b81b5eaa1761cf1667dc56118b1ecf1ec1774d5f00ab9fbf473cdada7d5e09577f12dbc765fd22841b81ebeee352ddba5db7b6c5f5980056
"node-webpmux@npm:3.1.7":
version: 3.1.7
resolution: "node-webpmux@npm:3.1.7"
checksum: 7283a76a52f727e9f1266052a0726371283e21d83f0ced71505776378200c1f3a1be2470ccc487d5977e40e56634aca3d4be255af26c1fed809b352841f15d10
languageName: node
linkType: hard
@@ -9790,7 +9850,7 @@ __metadata:
languageName: node
linkType: hard
"pac-proxy-agent@npm:^7.0.0":
"pac-proxy-agent@npm:^7.0.0, pac-proxy-agent@npm:^7.0.1":
version: 7.0.1
resolution: "pac-proxy-agent@npm:7.0.1"
dependencies:
@@ -10077,7 +10137,7 @@ __metadata:
languageName: node
linkType: hard
"pkg-dir@npm:4.2.0, pkg-dir@npm:^4.2.0":
"pkg-dir@npm:^4.2.0":
version: 4.2.0
resolution: "pkg-dir@npm:4.2.0"
dependencies:
@@ -10301,6 +10361,22 @@ __metadata:
languageName: node
linkType: hard
"proxy-agent@npm:6.3.1":
version: 6.3.1
resolution: "proxy-agent@npm:6.3.1"
dependencies:
agent-base: ^7.0.2
debug: ^4.3.4
http-proxy-agent: ^7.0.0
https-proxy-agent: ^7.0.2
lru-cache: ^7.14.1
pac-proxy-agent: ^7.0.1
proxy-from-env: ^1.1.0
socks-proxy-agent: ^8.0.2
checksum: 31030da419da31809340ac2521090c9a5bf4fe47a944843f829b3502883208c8586a468955e64b694140a41d70af6f45cf4793f5efd4a6f3ed94e5ac8023e36d
languageName: node
linkType: hard
"proxy-from-env@npm:1.1.0, proxy-from-env@npm:^1.1.0":
version: 1.1.0
resolution: "proxy-from-env@npm:1.1.0"
@@ -10346,6 +10422,24 @@ __metadata:
languageName: node
linkType: hard
"puppeteer-core@npm:18.2.1":
version: 18.2.1
resolution: "puppeteer-core@npm:18.2.1"
dependencies:
cross-fetch: 3.1.5
debug: 4.3.4
devtools-protocol: 0.0.1045489
extract-zip: 2.0.1
https-proxy-agent: 5.0.1
proxy-from-env: 1.1.0
rimraf: 3.0.2
tar-fs: 2.1.1
unbzip2-stream: 1.4.3
ws: 8.9.0
checksum: 27ed65a7335ee3f4356425ebe4bbb5202f7b39493398643554a12b981922b2243dc331d9a478215706b79696bcf391637dd5e5405d60aff6ba8f94f0c3fea742
languageName: node
linkType: hard
"puppeteer-core@npm:20.9.0":
version: 20.9.0
resolution: "puppeteer-core@npm:20.9.0"
@@ -10365,6 +10459,20 @@ __metadata:
languageName: node
linkType: hard
"puppeteer-core@npm:21.11.0":
version: 21.11.0
resolution: "puppeteer-core@npm:21.11.0"
dependencies:
"@puppeteer/browsers": 1.9.1
chromium-bidi: 0.5.8
cross-fetch: 4.0.0
debug: 4.3.4
devtools-protocol: 0.0.1232444
ws: 8.16.0
checksum: 953018ca679542d747e5974fd732349d73f4c685c0b49dd6027d493ad95d64a23b2d6e3e72f0a0a12c7335d3e08a0b3e6bc9ac3adfb3fb0316fb1ca62f46f129
languageName: node
linkType: hard
"puppeteer-extra-plugin-stealth@npm:^2.11.2":
version: 2.11.2
resolution: "puppeteer-extra-plugin-stealth@npm:2.11.2"
@@ -10465,23 +10573,15 @@ __metadata:
languageName: node
linkType: hard
"puppeteer@npm:^13.0.0":
version: 13.7.0
resolution: "puppeteer@npm:13.7.0"
"puppeteer@npm:^18.2.1":
version: 18.2.1
resolution: "puppeteer@npm:18.2.1"
dependencies:
cross-fetch: 3.1.5
debug: 4.3.4
devtools-protocol: 0.0.981744
extract-zip: 2.0.1
https-proxy-agent: 5.0.1
pkg-dir: 4.2.0
progress: 2.0.3
proxy-from-env: 1.1.0
rimraf: 3.0.2
tar-fs: 2.1.1
unbzip2-stream: 1.4.3
ws: 8.5.0
checksum: 4062b3ac3330e70d58095c1e0c5a46cada39a3fc5608e0e0e204448a400aef4d785a3b21d9e7733b2b2dc8cf686a476abf016f05d2e9108b3753dd41d62b9d1c
puppeteer-core: 18.2.1
checksum: 58ba8c7abd82071dc12e280622fa352a8ac253375a514c7a3527b468672a4ccdfe20b37aa09498774da2f0666bcdd9a47838c6661de483a3d6e10b47ef666113
languageName: node
linkType: hard
@@ -10496,6 +10596,19 @@ __metadata:
languageName: node
linkType: hard
"puppeteer@npm:^21.0.0":
version: 21.11.0
resolution: "puppeteer@npm:21.11.0"
dependencies:
"@puppeteer/browsers": 1.9.1
cosmiconfig: 9.0.0
puppeteer-core: 21.11.0
bin:
puppeteer: lib/esm/puppeteer/node/cli.js
checksum: 0f2e6f6d9269e511022ec8e8478f42bf5f3dbddbdac7b50d31c90504993eaef436e8729a5b3f105576ec2031519de723d4a9d0ad797821d0f16540073fabc37a
languageName: node
linkType: hard
"qoa-format@npm:^1.0.1":
version: 1.0.1
resolution: "qoa-format@npm:1.0.1"
@@ -12976,6 +13089,13 @@ __metadata:
languageName: node
linkType: hard
"urlpattern-polyfill@npm:10.0.0":
version: 10.0.0
resolution: "urlpattern-polyfill@npm:10.0.0"
checksum: 61d890f151ea4ecf34a3dcab32c65ad1f3cda857c9d154af198260c6e5b2ad96d024593409baaa6d4428dd1ab206c14799bf37fe011117ac93a6a44913ac5aa4
languageName: node
linkType: hard
"use@npm:^3.1.0":
version: 3.1.1
resolution: "use@npm:3.1.1"
@@ -13328,6 +13448,7 @@ __metadata:
passport: ^0.6.0
passport-headerapikey: ^1.2.2
prettier: ^1.19.1
puppeteer: ^21.0.0
qrcode: ^1.5.1
qrcode-terminal: ^0.12.0
reflect-metadata: ^0.1.13
@@ -13343,13 +13464,13 @@ __metadata:
tsconfig-paths: ^4.1.0
typescript: ^4.8.4
venom-bot: 5.0.1
whatsapp-web.js: "https://github.com/devlikeapro/whatsapp-web.js#main-fork"
whatsapp-web.js: "https://github.com/devlikeapro/whatsapp-web.js#main-fork-update"
languageName: unknown
linkType: soft
"whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js#main-fork":
version: 1.23.1-alpha.4
resolution: "whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js.git#commit=6ab7270e9a2c86a81efb8831b7817da10daffff2"
"whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js#main-fork-update":
version: 1.23.1-alpha.6
resolution: "whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js.git#commit=d6eff450edf3e8d292cf70eb4243fd32ace61182"
dependencies:
"@pedroslopez/moduleraid": ^5.0.2
adm-zip: ^0.5.10
@@ -13357,9 +13478,9 @@ __metadata:
fluent-ffmpeg: 2.1.2
fs-extra: ^10.1.0
mime: ^3.0.0
node-fetch: ^2.6.5
node-webpmux: 3.1.0
puppeteer: ^13.0.0
node-fetch: ^2.6.9
node-webpmux: 3.1.7
puppeteer: ^18.2.1
unzipper: ^0.10.11
dependenciesMeta:
archiver:
@@ -13368,7 +13489,7 @@ __metadata:
optional: true
unzipper:
optional: true
checksum: e24bef423f722932011ccc91931441fff12c07de05689a78fcde87b6f98d9b7a2eee17011cad8d4a4d2d949245ee87f4f1d4c9e0e0de3da4b594ecb91fc27d45
checksum: 3a34d43b37caddb4544f8ddad885ceb02edb2e2fccf8412574d57631a16e08e3f4b37e7c5c28debad958f7b08a7b33916db60133e47daa5ebbcd9921b9f7455d
languageName: node
linkType: hard
@@ -13623,9 +13744,24 @@ __metadata:
languageName: node
linkType: hard
"ws@npm:8.5.0":
version: 8.5.0
resolution: "ws@npm:8.5.0"
"ws@npm:8.16.0, ws@npm:^8.13.0, ws@npm:^8.8.0":
version: 8.16.0
resolution: "ws@npm:8.16.0"
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ">=5.0.2"
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
checksum: feb3eecd2bae82fa8a8beef800290ce437d8b8063bdc69712725f21aef77c49cb2ff45c6e5e7fce622248f9c7abaee506bae0a9064067ffd6935460c7357321b
languageName: node
linkType: hard
"ws@npm:8.9.0":
version: 8.9.0
resolution: "ws@npm:8.9.0"
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ^5.0.2
@@ -13634,7 +13770,7 @@ __metadata:
optional: true
utf-8-validate:
optional: true
checksum: 76f2f90e40344bf18fd544194e7067812fb1372b2a37865678d8f12afe4b478ff2ebc0c7c0aff82cd5e6b66fc43d889eec0f1865c2365d8f7a66d92da7744a77
checksum: 23aa0f021b2eb65c108ec4c3e08c0d81ba01f82b500432dfe327fd6be36079c1d81fdb0eac6464d2a0eb49904d34a9ab8c59619d673fa07b8346f83aeb0cbf12
languageName: node
linkType: hard
@@ -13653,21 +13789,6 @@ __metadata:
languageName: node
linkType: hard
"ws@npm:^8.13.0, ws@npm:^8.8.0":
version: 8.16.0
resolution: "ws@npm:8.16.0"
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ">=5.0.2"
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
checksum: feb3eecd2bae82fa8a8beef800290ce437d8b8063bdc69712725f21aef77c49cb2ff45c6e5e7fce622248f9c7abaee506bae0a9064067ffd6935460c7357321b
languageName: node
linkType: hard
"xml-name-validator@npm:^3.0.0":
version: 3.0.0
resolution: "xml-name-validator@npm:3.0.0"
@@ -13756,6 +13877,21 @@ __metadata:
languageName: node
linkType: hard
"yargs@npm:17.7.2":
version: 17.7.2
resolution: "yargs@npm:17.7.2"
dependencies:
cliui: ^8.0.1
escalade: ^3.1.1
get-caller-file: ^2.0.5
require-directory: ^2.1.1
string-width: ^4.2.3
y18n: ^5.0.5
yargs-parser: ^21.1.1
checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a
languageName: node
linkType: hard
"yargs@npm:^15.3.1, yargs@npm:^15.4.1":
version: 15.4.1
resolution: "yargs@npm:15.4.1"