Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
568be88127 | ||
|
|
67144c1d08 | ||
|
|
285c78d41a | ||
|
|
7d15735444 | ||
|
|
4191749564 | ||
|
|
9e68dbbf09 | ||
|
|
f02ad5b051 | ||
|
|
08e20a25ed | ||
|
|
ee0468038d | ||
|
|
04afc297d9 | ||
|
|
ed06ca76e0 | ||
|
|
a68510a814 | ||
|
|
4040efab01 | ||
|
|
f08cc1061e | ||
|
|
3b5b11891e | ||
|
|
72427c9309 | ||
|
|
befe2068fd | ||
|
|
c7a3ef32fa | ||
|
|
51d394f4ef | ||
|
|
8db341dd70 | ||
|
|
5cd7fec3ab | ||
|
|
f672ecbb45 | ||
|
|
9a12b2c9b6 | ||
|
|
c31407fd87 | ||
|
|
646c81f136 | ||
|
|
aca6232d2a | ||
|
|
c61da10523 | ||
|
|
1f53d65ac2 | ||
|
|
844ab1287e | ||
|
|
d6d318b23b | ||
|
|
7504ffd934 | ||
|
|
e8078908c9 | ||
|
|
431848280f | ||
|
|
2e0c575512 | ||
|
|
ebf0d99417 | ||
|
|
423d893fee | ||
|
|
56fe0d3b04 | ||
|
|
7172d9d203 | ||
|
|
bd770a6902 | ||
|
|
628508faed | ||
|
|
826634f061 | ||
|
|
c7ed959a71 | ||
|
|
aea6befc1e | ||
|
|
7bb3484788 | ||
|
|
4eafc67a7e | ||
|
|
b5197b6f20 | ||
|
|
d306304195 | ||
|
|
35f47dae4f | ||
|
|
f1be4810d5 | ||
|
|
d4f9406869 | ||
|
|
a41b81d724 | ||
|
|
da56b86102 | ||
|
|
f12d2c9be0 | ||
|
|
322b9b4c25 | ||
|
|
fb7fe410f9 | ||
|
|
ee392a079c | ||
|
|
0502579d50 | ||
|
|
f10f3175d9 | ||
|
|
f155af99f1 | ||
|
|
0fbf3575a6 | ||
|
|
f6b9b5f54e | ||
|
|
2dadd9d8c9 | ||
|
|
5786b3cdfe | ||
|
|
769fc30c0c | ||
|
|
fb2dad9c6f | ||
|
|
c43d308a2d | ||
|
|
742a12ce6a | ||
|
|
d953f27865 | ||
|
|
4719cded95 | ||
|
|
9d489bdb69 | ||
|
|
537c307550 | ||
|
|
d5575e0323 | ||
|
|
592962bbc8 | ||
|
|
7a371c86dc | ||
|
|
0e295bebde | ||
|
|
8d98759be6 | ||
|
|
924317b01b | ||
|
|
a08a601dc3 | ||
|
|
e652c15d6c | ||
|
|
4534eb60de | ||
|
|
54c6c0c24c | ||
|
|
393694ae96 | ||
|
|
818bb730e4 | ||
|
|
61bd35a192 |
No files matched your search
@@ -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/
|
||||
@@ -51,11 +51,10 @@ 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 }}
|
||||
type=raw,value={{tag}}-${{ matrix.tag }}
|
||||
|
||||
- name: Login to image repository
|
||||
if: github.ref_type == 'tag'
|
||||
|
||||
@@ -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 }}
|
||||
@@ -31,6 +31,26 @@ services:
|
||||
- WHATSAPP_API_HOSTNAME=localhost
|
||||
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_DEFAULT_ENGINE=WEBJS
|
||||
- WHATSAPP_API_KEY=321
|
||||
- WHATSAPP_SWAGGER_USERNAME=admin
|
||||
- WHATSAPP_SWAGGER_PASSWORD=123
|
||||
- WHATSAPP_API_HOSTNAME=localhost
|
||||
- WHATSAPP_SESSIONS_MONGO_URL=mongodb://mongodb:27017
|
||||
restart: always
|
||||
|
||||
mongodb:
|
||||
image: mongo
|
||||
container_name: 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"
|
||||
|
||||
@@ -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
|
||||
---
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||
 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
|
||||
---
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||
 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`.
|
||||
|
||||
|
||||
@@ -47,6 +47,12 @@ 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" >}}).
|
||||
|
||||
### VENOM
|
||||
@@ -59,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
|
||||
@@ -115,25 +134,28 @@ please [create an issue](https://github.com/devlikeapro/whatsapp-http-api/issues
|
||||
| **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`  | ✔️ | ✔️ | ✔️ |
|
||||
| `POST /api/sendFile`  | ✔️ | ✔️ | ✔️ |
|
||||
| `POST /api/sendVoice`  | ✔️ | ✔️ | ✔️ |
|
||||
| `POST /api/sendVideo`  | ✔️ | ✔️ | ➖ |
|
||||
| `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`  | ✔️ | ✔️ | ✔️ |
|
||||
| `POST /api/sendFile`  | ✔️ | ✔️ | ✔️ |
|
||||
| `POST /api/sendVoice`  | ✔️ | ✔️ | ✔️ |
|
||||
| `POST /api/sendVideo`  | ✔️ | ✔️ | ➖ |
|
||||
| `POST /api/sendSeen` | ✔️ | ✔️ | ✔️ |
|
||||
| `POST /api/startTyping` | ✔️ | ✔️ | ✔️ |
|
||||
| `POST /api/stopTyping` | ✔️ | ✔️ | ➖ |
|
||||
| `POST /api/reaction` | ✔️ | ✔️ | ➖ |
|
||||
| `POST /api/star` | ✔️ | ✔️ | ➖ |
|
||||
| `GET /api/messages` | ✔️ | ➖ | ✔️ |
|
||||
|
||||
| | WEBJS | NOWEB | VENOM |
|
||||
|-------------------------------------------------------------------|:-----:|:-----:|:-----:|
|
||||
@@ -147,6 +169,8 @@ 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` | ✔️ | ➖ | ➖ |
|
||||
|
||||
@@ -49,26 +49,42 @@ 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**  docker image with a personal key. | ➖️ | ✔️ | ✔️ | ✔️ |
|
||||
| Special badge ([](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. | ✔️ |
|
||||
| Special [](https://waha.devlike.pro/docs/how-to/plus-version/#tiers) badge and `patron:TIER` label on [project's issues, PRs and Discussion](https://github.com/devlikeapro/whatsapp-http-api) to highlight your support to the project! | ✔️ |
|
||||
| **Donation** | **$19** |
|
||||
|
||||
### Pro
|
||||
| Exclusive perks for the professionals! | |
|
||||
|---------------------------------------------------------------------------------------------|---------|
|
||||
| All in **Plus** | ✔️ |
|
||||
| An invitation to **a private Github repository** so you have the **WAHA Plus** source code. | ✔️ |
|
||||
| Access to a **Discord Server** where we provide support and assistance. | ✔️ |
|
||||
| **Donation** | **$99** |
|
||||
|
||||
|
||||
For **$19** donation you get:
|
||||
1. **Secret password** for Docker Hub to download Plus image: `devlikeapro/whatsapp-http-api-plus`.
|
||||
@@ -79,40 +95,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 
|
||||
|
||||
|
||||
### 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 +130,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/1011" 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
|
||||
|
||||
|
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.
|
||||
|
||||
|
||||
@@ -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" >}})!
|
||||
|
||||

|
||||
|
||||
### 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 
|
||||
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" >}})!
|
||||
|
||||

|
||||
|
||||
### 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 
|
||||
Use `POST /api/sendImage` to send images.
|
||||
|
||||
@@ -233,13 +348,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`.
|
||||
|
||||
@@ -20,9 +20,57 @@ 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.3
|
||||
- Add [message.reaction]({{< relref "/docs/how-to/webhooks#messagereaction" >}}) webhook in **WEBJS** and **NOWEB** engines ([#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 security settings [Security - who can send messages]({{< relref "/docs/how-to/groups##security---who-can-send-messages" >}}) `PUT /api/{session}/groups/{groupId}/settings/security/messages-admin-only` ([#274](https://github.com/devlikeapro/whatsapp-http-api/issues/274))
|
||||
### 🎉 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'`!
|
||||
@@ -33,6 +81,8 @@ You even can **subscribe to get new updates** there!
|
||||
}
|
||||
```
|
||||
|
||||
- `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" >}})
|
||||
|
||||
@@ -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/>
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
</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>
|
||||
<div class="code-block highlight d-none d-md-block">
|
||||
<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 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/'
|
||||
@@ -23,48 +23,116 @@
|
||||
|
||||
{{ 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>
|
||||
What can WAHA do?
|
||||
</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>
|
||||
</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'>
|
||||
@@ -73,8 +141,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
|
||||
@@ -87,8 +177,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'>
|
||||
@@ -105,6 +195,22 @@
|
||||
</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>
|
||||
{{ end }}
|
||||
|
||||
{{ define "sidebar-footer" }}
|
||||
|
||||
@@ -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 -->
|
||||
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 646 B After Width: | Height: | Size: 807 B |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
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 |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 84 KiB |
@@ -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 |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 90 KiB |
@@ -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}/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":"ChattingContrLine truncated
|
||||
@@ -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-form-update-nodejs"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nestjs/cli": "^9.0.0",
|
||||
|
||||
@@ -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 };
|
||||
@@ -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) {
|
||||
|
||||
@@ -11,7 +11,6 @@ import { ApiOperation, ApiSecurity, ApiTags } from '@nestjs/swagger';
|
||||
|
||||
import { SessionManager } from '../core/abc/manager.abc';
|
||||
import { WhatsappSession } from '../core/abc/session.abc';
|
||||
import { MessageContactVcardRequest } from '../structures/chatting.dto';
|
||||
import {
|
||||
CreateGroupRequest,
|
||||
DescriptionRequest,
|
||||
|
||||
@@ -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) };
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -425,6 +443,10 @@ export abstract class WhatsappSession {
|
||||
throw new NotImplementedByEngineError();
|
||||
}
|
||||
|
||||
public async getEngineInfo(): Promise<any> {
|
||||
return {};
|
||||
}
|
||||
|
||||
/**
|
||||
* END - Methods for API
|
||||
*/
|
||||
|
||||
@@ -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,
|
||||
@@ -76,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';
|
||||
@@ -107,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;
|
||||
@@ -203,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();
|
||||
@@ -229,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;
|
||||
}
|
||||
@@ -348,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 = {
|
||||
@@ -434,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
|
||||
*/
|
||||
@@ -665,9 +731,9 @@ 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;
|
||||
if (!message) return [];
|
||||
if (!message.message) return [];
|
||||
if (!message.message.reactionMessage) return [];
|
||||
|
||||
const id = buildMessageId(message.key);
|
||||
const fromToParticipant = getFromToParticipant(message);
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -15,12 +15,14 @@ import { Message as MessageInstance } from 'whatsapp-web.js/src/structures';
|
||||
import {
|
||||
ChatRequest,
|
||||
CheckNumberStatusQuery,
|
||||
EditMessageRequest,
|
||||
GetMessageQuery,
|
||||
MessageFileRequest,
|
||||
MessageImageRequest,
|
||||
MessageLocationRequest,
|
||||
MessageReactionRequest,
|
||||
MessageReplyRequest,
|
||||
MessageStarRequest,
|
||||
MessageTextRequest,
|
||||
MessageVoiceRequest,
|
||||
SendSeenRequest,
|
||||
@@ -71,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.2411.2',
|
||||
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);
|
||||
}
|
||||
@@ -116,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;
|
||||
@@ -154,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)}`);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -235,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,
|
||||
@@ -283,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
|
||||
*/
|
||||
@@ -622,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;
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
@@ -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 = {
|
||||
@@ -213,12 +215,17 @@ 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,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
@@ -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}`);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 };
|
||||
@@ -31,7 +31,7 @@ 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();
|
||||
|
||||
@@ -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({
|
||||
@@ -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({
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -33,7 +33,7 @@ export function getEngineName(): string {
|
||||
}
|
||||
|
||||
export const VERSION: WAHAEnvironment = {
|
||||
version: '2024.3.6',
|
||||
version: '2024.4.3',
|
||||
engine: getEngineName(),
|
||||
tier: getWAHAVersion(),
|
||||
browser: getBrowserExecutablePath(),
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1302,7 +1302,7 @@ __metadata:
|
||||
|
||||
"@pedroslopez/moduleraid@github:wwebjs/moduleRaid":
|
||||
version: 6.0.2
|
||||
resolution: "@pedroslopez/moduleraid@https://github.com/wwebjs/moduleRaid.git#commit=2ba8baadbc2a73305775ca72325102ed2c629f89"
|
||||
resolution: "@pedroslopez/moduleraid@https://github.com/wwebjs/moduleRaid.git#commit=ecb616c04172dbeb294cef6b63715bfb4fd42d80"
|
||||
checksum: 399d08f1bc7703f73f7ec5e80618139f6ed4a95cd05baa87a9c6c69d8cd0fbd299e1c757414fed2e160c9ec6dfb0f4b8e5fc08261b97bfb7f248dc16c28e9f83
|
||||
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-form-update-nodejs"
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
|
||||
"whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js#main-fork":
|
||||
"whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js#main-form-update-nodejs":
|
||||
version: 1.23.1-alpha.5
|
||||
resolution: "whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js.git#commit=1f9c956cd13cc75c211d14e82cf9b5fd665f9b03"
|
||||
resolution: "whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js.git#commit=616a80a7da5f8ce522c8e6b8a9ee29a94b315d8e"
|
||||
dependencies:
|
||||
"@pedroslopez/moduleraid": "github:wwebjs/moduleRaid"
|
||||
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: 03894e8cf847876aac6a543aada3cccce2010069231fb2165d5895598a32f883d5269f5593afa0b369b2bb93a9399a5214d582b3a37b6cf5bda804edf07912d0
|
||||
checksum: b89226a826a13578a2e01ed27951e87444d0ce4725e17742380d4f373ae5505c34ffd86cb26097f70848643016270ab506af47d0cb41c64f175029d8eaa90afa
|
||||
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"
|
||||
|
||||