Compare commits

..
31 Commits
Author SHA1 Message Date
allburov faf8d053dd [docs] Index
Release / amd64 - chrome - chrome (push) Waiting to run
Release / amd64 - chromium - latest (push) Waiting to run
Release / linux/arm64 - chromium - arm (push) Waiting to run
Release / amd64 - none - noweb (push) Waiting to run
Release / linux/arm64 - none - noweb-arm (push) Waiting to run
2024-05-03 18:00:12 +07:00
allburov 5ece56f9b0 [docs] Add WAHA Dashboard, Hub 2024-05-03 17:44:37 +07:00
allburov c4d9474f34 [docs] update swagger 2024-05-03 16:37:55 +07:00
allburov 3b8481ccac [docs] Dashboard stub 2024-05-03 16:33:41 +07:00
allburov a31d0215f5 [core] Correct plus docker-compose.yaml 2024-05-03 16:31:25 +07:00
allburov f6cce68553 [core] Bump version 2024.5.2 2024-05-03 16:31:25 +07:00
allburov 636b100b9f [core] Bump version to 2024.5.1 2024-05-03 11:56:29 +07:00
allburov 7a3574eaa0 [core] Update WEBJS version 2024-05-03 11:56:29 +07:00
allburov 9cd6176e60 [core] Change default password to waha/waha 2024-05-03 11:56:29 +07:00
allburov f2641029cb [core] nest cli 2024-05-02 14:39:18 +07:00
allburov 6350e191f8 [core] Ignore dashboard 2024-05-02 14:38:54 +07:00
allburov c570ba3488 [core] Correct dashboard 2024-05-02 12:05:22 +07:00
allburov b64abd24c8 [core] Configure dashboard right 2024-05-02 12:03:46 +07:00
allburov 13c9ab3962 [core] Adjust dashboard stub 2024-05-02 12:03:46 +07:00
allburov b9f1c6ee79 [core] Adjust swagger 2024-05-02 12:03:46 +07:00
allburov 938170a957 [core] Add Dashboard 2024-05-02 12:03:46 +07:00
allburov ca0a28c0cf [core] Logout if logout is true 2024-05-02 09:42:25 +07:00
allburov c3967173a1 [core] Enable cors 2024-04-28 17:35:52 +07:00
allburov 9ebbd9a1fd [docs] no MOBILE yet 2024-04-23 11:03:39 +07:00
allburov 16e343ca19 [docs] Labels 2024-04-21 18:54:55 +07:00
allburov 1de9132f16 [core] Remove ignore 2024-04-21 18:49:53 +07:00
allburov dad54a8e47 [core] Pin WEBJS version to 2.2412.54 2024-04-21 17:30:16 +07:00
allburov 7d73b96b78 [core] Fix send voice 2024-04-21 17:08:08 +07:00
allburov 1260fe34aa [core] Bump version to 2024.4.4 2024-04-21 16:35:43 +07:00
allburov 3b4678e059 [core] Add GET /api/sessions/{session} endpoint 2024-04-21 16:35:28 +07:00
allburov ff8294b5db [core] Add patron portal link 2024-04-21 16:14:54 +07:00
allburov 7e94e19f5d [core] NOWEB - add GET /api/contacts/profile-picture 2024-04-21 16:14:54 +07:00
allburov ae18e2575a [docs] Add tier 2024-04-21 16:01:35 +07:00
allburov a5c493a29c [docs] Add tier 2024-04-17 13:45:14 +07:00
allburov 8ee89fe51c [docs] pro tier 2024-04-15 09:21:46 +07:00
allburov b4909847bf [docs] link 2024-04-15 09:16:32 +07:00
44 changed files with 990 additions and 83 deletions

No files matched your search

-5
View File
@@ -1,8 +1,3 @@
ignore:
teams:
- no-labels
users:
- allburov
teamLabels:
- team: waha-patrons-pro
label: patron:PRO
+1
View File
@@ -1,3 +1,4 @@
exclude: '^src/dashboard'
repos:
- repo: local
hooks:
+20 -13
View File
@@ -21,14 +21,19 @@ services:
- './.sessions:/app/.sessions'
environment:
# Environment variables from https://waha.devlike.pro/docs/how-to/config/
- WHATSAPP_RESTART_ALL_SESSIONS=True
- WHATSAPP_HOOK_URL=https://httpbin.org/post
- WHATSAPP_HOOK_EVENTS=message
# - WHATSAPP_RESTART_ALL_SESSIONS=True
# - WHATSAPP_HOOK_URL=https://httpbin.org/post
# - WHATSAPP_HOOK_EVENTS=message
# - WHATSAPP_API_HOSTNAME=localhost
- WHATSAPP_DEFAULT_ENGINE=WEBJS
- WHATSAPP_API_KEY=321
- WHATSAPP_SWAGGER_USERNAME=admin
- WHATSAPP_SWAGGER_PASSWORD=123
- WHATSAPP_API_HOSTNAME=localhost
# Username and password for Swagger
- WHATSAPP_SWAGGER_USERNAME=swagger
- WHATSAPP_SWAGGER_PASSWORD=admin
# Username and password for WAHA Dashboard
# you can use the same username and password for both Swagger and Dashboard
- WAHA_DASHBOARD_USERNAME=dashboard
- WAHA_DASHBOARD_PASSWORD=admin
restart: always
whatsapp-http-api-plus--mongodb:
@@ -40,14 +45,16 @@ services:
- './.sessions:/app/.sessions'
environment:
# Environment variables from https://waha.devlike.pro/docs/how-to/config/
- WHATSAPP_RESTART_ALL_SESSIONS=True
- WHATSAPP_HOOK_URL=https://httpbin.org/post
- WHATSAPP_HOOK_EVENTS=message
# - WHATSAPP_RESTART_ALL_SESSIONS=True
# - WHATSAPP_HOOK_URL=https://httpbin.org/post
# - WHATSAPP_HOOK_EVENTS=message
# - WHATSAPP_API_KEY=321
# - WHATSAPP_SWAGGER_USERNAME=admin
# - WHATSAPP_SWAGGER_PASSWORD=123
# - WAHA_DASHBOARD_USERNAME=admin
# - WAHA_DASHBOARD_PASSWORD=123
# - WHATSAPP_API_HOSTNAME=localhost
- WHATSAPP_DEFAULT_ENGINE=WEBJS
- WHATSAPP_API_KEY=321
- WHATSAPP_SWAGGER_USERNAME=admin
- WHATSAPP_SWAGGER_PASSWORD=123
- WHATSAPP_API_HOSTNAME=localhost
- WHATSAPP_SESSIONS_MONGO_URL=mongodb://mongodb:27017
restart: always
@@ -6,7 +6,7 @@ date: 2020-10-06T08:48:45+00:00
lastmod: 2020-10-06T08:48:45+00:00
draft: false
images: [ ]
weight: 899
weight: 898
---
This page provides useful information to assist you in deploying the project.
@@ -129,8 +129,6 @@ please [create an issue](https://github.com/devlikeapro/whatsapp-http-api/issues
| `POST /api/{session}/auth/qr` | ✔️ | ✔️ | ✔️ |
| `POST /api/{session}/auth/request-code` | ➖ | ✔️ | ➖ |
| `POST /api/{session}/auth/authorize-code` | ➖ | ➖️<br>[#113](https://github.com/devlikeapro/whatsapp-http-api/issues/113) | ➖ |
| `GET /api/{session}/auth/captcha` <br>Only in **MOBILE** engine | ➖ | ➖ | ➖ |
| `POST /api/{session}/auth/captcha` <br>Only in **MOBILE** engine | ➖ | ➖ | ➖ |
| **Screenshot** | | | |
| `POST /api/screenshot` | ✔️ | ➖ | ✔️ |
@@ -176,7 +174,7 @@ please [create an issue](https://github.com/devlikeapro/whatsapp-http-api/issues
| `GET /api/contacts/all` | ✔️ | ➖ | ➖ |
| `GET /api/contacts/check-exists` | ✔️ | ✔️ | ✔️ |
| `GET /api/contacts/about` | ✔️ | ➖ | ➖ |
| `GET /api/contacts/profile-picture` | ✔️ | ➖ | ➖ |
| `GET /api/contacts/profile-picture` | ✔️ | ✔️ | ➖ |
| `POST /api/contacts/block` | ✔️ | ➖ | ➖ |
| `POST /api/contacts/unblock` | ✔️ | ➖ | ➖ |
@@ -65,25 +65,31 @@ The more you support the project - the more you get!
| **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 [![patron:TIER](https://img.shields.io/badge/patron-TIER-188a42)](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** |
| Optimize your experience with extra perks! | |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|
| All in **Core** | ✔️ |
| [Sessions limit ->]({{< relref "/docs/how-to/sessions" >}}) | **∞** |
| [Send and receive files ->]({{< relref "/docs/how-to/send-messages" >}}) | ✔️ |
| [Built-in Security ->]({{< relref "/docs/how-to/security" >}}) | ✔️ |
| [Webhook retries →]({{< relref "/docs/how-to/receive-messages#retries" >}}) | ✔️ |
| [MongoDB support ->]({{< relref "/docs/how-to/storages" >}}) | ✔️ |
| Access to **WAHA Plus** docker image with a personal key. | ✔️ |
| [![patron:PLUS](https://img.shields.io/badge/patron-PLUS-a0e6ba)](https://waha.devlike.pro/docs/how-to/plus-version/#tiers) badge and `patron:PLUS` label on [project's issues, PRs and Discussion](https://github.com/devlikeapro/whatsapp-http-api) to highlight your support to the project! | ✔️ |
| Built-in [WAHA Dashboard]({{< relref "/docs/how-to/waha-dashboard" >}}) - UI to manage your sessions! | ✔️ |
| Access to the **WAHA Plus** **source code** (in a private Github repository). | ➖ |
| Membership to the **WAHA Discord server** for receiving personal support, and sharing your experiences with other professionals. | ➖ |
| [WAHA Hub]({{< relref "/docs/waha-hub/introduction" >}}) - a single place to manage multiple servers! | ➖ |
| **Donation** | **$19** |
### Pro
| Exclusive perks for the professionals! | |
|---------------------------------------------------------------------------------------------|---------|
| All in **Plus** | ✔️ |
| 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** |
| Exclusive perks for the PROfessionals! | |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|
| All in **Plus** | ✔️ |
| [![patron:PRO](https://img.shields.io/badge/patron-PRO-188a42)](https://waha.devlike.pro/docs/how-to/plus-version/#tiers) badge and `patron:PRO` label on [project's issues, PRs and Discussion](https://github.com/devlikeapro/whatsapp-http-api) to highlight your support to the project! | ✔️ |
| Access to the **WAHA Plus** **source code** (in a private Github repository). | ✔️ |
| Membership to the **WAHA Discord server** for receiving personal support, and sharing your experiences with other professionals. | ✔️ |
| [WAHA Hub]({{< relref "/docs/waha-hub/introduction" >}}) - a single place to manage multiple servers! | ✔️ |
| **Donation** | **$99** |
For **$19** donation you get:
@@ -173,7 +179,7 @@ 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>**
**<a href="https://boosty.to/wa-http-api/posts/8319079f-dac1-4179-b954-fcc559097c76" target="_blank">Boosty -></a>**
posts.
### Install Plus
@@ -15,7 +15,9 @@ We do not recommend exposing the API on any public networks!
Either protect the API with [Api Key](https://www.fortinet.com/resources/cyberglossary/api-key) or deny access by using
firewalls.
## Swagger Security ![](/images/versions/plus.png)
👉 Security options are available in [**WAHA Plus**]({{< relref "plus-version#plus" >}}) ![](/images/versions/plus.png) version only.
## Swagger Security
### Username and password
If you want to hide the project Swagger panel under the password - run the following command to hide under `admin/admin`
login and password.
@@ -35,8 +37,15 @@ You also can hide swagger completely by setting `WHATSAPP_SWAGGER_ENABLED=false`
{{< alert icon="👉" text="Disabling Swagger does not protect the API, please use API security as well" />}}
## Dashboard Security
When running WAHA you can set the following environment variables to configure the dashboard:
- `WAHA_DASHBOARD_ENABLED=true` - enable or disable the dashboard, by default `true`. Set to `false` to disable the dashboard.
- `WAHA_DASHBOARD_USERNAME=waha` - username used to log in, by default `waha`.
- `WAHA_DASHBOARD_PASSWORD=waha` - password used to log in, by default `waha`.
## API security ![](/images/versions/plus.png)
Read more about [**Dashboard ->**]({{< relref "/docs/how-to/waha-dashboard" >}})
## API security
You can protect the API by requiring Api Key in a request's headers.
@@ -72,7 +81,7 @@ headers = {
requests.get("http://localhost:3000/api/sessions", headers=headers)
```
## Webhook security ![](/images/versions/plus.png)
## Webhook security
To make sure that you get a webhook from your WAHA instance - you can use **HMAC authentication**.
Read more about it on [Webhooks page ->]({{< relref "/docs/how-to/webhooks#hmac-authentication" >}})
@@ -273,6 +273,8 @@ You can send voice messages in two ways:
1. Provide a URL for the voice.
2. Encode the whole file content into base64 and send it in the request body.
Please make sure your file has **OPUS** encoding and packed in OGG container.
#### URL
```json
{
@@ -280,8 +282,7 @@ You can send voice messages in two ways:
"chatId": "11111111111@c.us",
"file": {
"mimetype": "audio/ogg; codecs=opus",
"filename": "voice-message.mp3",
"url": "https://github.com/devlikeapro/whatsapp-http-api/raw/core/examples/dev.likeapro.mp3"
"url": "https://github.com/devlikeapro/whatsapp-http-api/raw/core/examples/dev.likeapro.opus"
},
"caption": "string"
}
@@ -319,7 +320,7 @@ You can send voice messages in two ways:
"file": {
"mimetype": "video/mp4",
"filename": "video.mp4",
"url": "https://github.com/devlikeapro/whatsapp-http-api/raw/core/examples/dev.likeapro.mp3"
"url": "https://github.com/devlikeapro/whatsapp-http-api/raw/core/examples/video.mp4"
}
}
```
@@ -108,7 +108,30 @@ The response:
[
{
"name": "default",
"status": "STARTING"
"status": "WORKING",
"config": {
"proxy": null,
"webhooks": [
{
"url": "https://httpbin.org/post",
"events": [
"message",
"session.status"
],
"hmac": null,
"retries": null,
"customHeaders": null
}
],
"debug": false
},
"me": {
"id": "79111111@c.us",
"pushName": "WAHA"
},
"engine": {
"engine": "NOWEB"
}
}
]
```
@@ -117,6 +140,38 @@ You can add `?all=true` parameter to the request `GET /api/session?all=True` it'
including **STOPPED**,
so you can know which one will be restarted if you set `WHATSAPP_RESTART_ALL_SESSIONS=True` environment variable.
### Get session
To get information about a specific session - call `GET /api/sessions/{session}`.
```json
{
"name": "default",
"status": "WORKING",
"config": {
"proxy": null,
"webhooks": [
{
"url": "https://httpbin.org/post",
"events": [
"message",
"session.status"
],
"hmac": null,
"retries": null,
"customHeaders": null
}
],
"debug": false
},
"me": {
"id": "79111111@c.us",
"pushName": "WAHA"
},
"engine": {
"engine": "NOWEB"
}
}
```
### Stop
In order to stop a new session - call `POST /api/sessions/stop`
@@ -0,0 +1,63 @@
---
title: "Dashboard"
description: "Dashboard"
lead: ""
date: 2020-10-06T08:48:45+00:00
lastmod: 2020-10-06T08:48:45+00:00
draft: false
images: [ ]
weight: 110
---
## Overview
**WAHA Dashboard** is a UI to manage your WhatsApp sessions!
![WAHA Dashboard](waha-dashboard.png)
<div class="text-center">
<a href="./waha-dashboard.png" target="_blank">See full size image</a>
</div>
<br/>
👉 **WAHA Dashboard** is available in [**WAHA Plus**]({{< relref "plus-version#plus" >}}) ![](/images/versions/plus.png) version only.
You can access **WAHA Dashboard** by running the project and opening
<a href="http://localhost:3000/dashboard" target="_blank">http://localhost:3000/dashboard</a>
(or similar, but with <a href="/dashboard" target="_blank">/dashboard</a> at the end).
ℹ️ **Default username and password**: `waha/waha`
```bash
docker run -it -p 3000:3000/tcp devlikeapro/whatsapp-http-api-plus
```
If you're using [API Key]({{< relref "security" >}}), remember to set up the key in the dashboard.
![WAHA Dashboard with API Key](waha-dashboard-key.png)
<div class="text-center">
<a href="./waha-dashboard-key.png" target="_blank">See full size image</a>
</div>
<br/>
## Configuration
When running WAHA you can set the following environment variables to configure the dashboard:
- `WAHA_DASHBOARD_ENABLED=true` - enable or disable the dashboard, by default `true`. Set to `false` to disable the
dashboard.
- `WAHA_DASHBOARD_USERNAME=waha` - username used to log in, by default `waha`.
- `WAHA_DASHBOARD_PASSWORD=waha` - password used to log in, by default `waha`.
```bash
docker run -it -p 3000:3000/tcp -e WAHA_DASHBOARD_USERNAME=waha -e WAHA_DASHBOARD_PASSWORD=waha devlikeapro/whatsapp-http-api-plus
```
## Multiple servers
If you wish to connect, control and manage multiple servers in a single "dashboard", consider using
[WAHA Hub]({{< relref "/docs/waha-hub/introduction" >}}) - central management server to help you build reliable infrastructure!
## Bug reports and feature requests
If you're experiencing any issues or have a feature request, please create an issue in the
[WAHA GitHub](https://github.com/devlikeapro/whatsapp-http-api/issues)
Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

@@ -19,6 +19,21 @@ If you wish to get and read Release Notes - read them on one of our platforms, *
You even can **subscribe to get new updates** there!
## 2024.4
### 🎉 New
----
Add `GET /api/sessions/{session}` endpoint to get information about a specific session.
- Read more about [Get session information]({{< relref "/docs/how-to/sessions#get-session" >}})
- Issue: [#300](https://github.com/devlikeapro/whatsapp-http-api/issues/300)
----
Implement `GET /api/contacts/profile-picture` for **NOWEB** engine.
- Issue: [#298](https://github.com/devlikeapro/whatsapp-http-api/issues/298)
----
## 2024.3
### 🎉 New
@@ -189,8 +189,9 @@ curl -d "{\"chatId\": \"${PHONE}@c.us\", \"text\": \"Hello from WhatsApp HTTP AP
```
## What is next?
- Right now you've sent simple text message, but you can send more! [Send messages →]({{< relref "/docs/how-to/send-messages" >}})
- Read how to receive and response to messages [Receive messages →]({{< relref "/docs/how-to/receive-messages" >}})
- Learn about the easiest way to manage your WhatsApp sessions - [WAHA Dashboard ->]({{< relref "/docs/how-to/waha-dashboard" >}})
- Right now you've sent simple text message, but you can send more! [Send messages ->]({{< relref "/docs/how-to/send-messages" >}})
- Read how to receive and response to messages [Receive messages ->]({{< relref "/docs/how-to/receive-messages" >}})
- [Save session information, so you don't have to scan QR after container restart ->]({{< relref "/docs/how-to/sessions" >}})
- Make sure your [API is properly protected ->]({{< relref "/docs/how-to/security" >}})
@@ -0,0 +1,10 @@
---
title : "WAHA Hub"
description: "WAHA Hub"
lead: ""
date: 2020-10-06T08:48:45+00:00
lastmod: 2020-10-06T08:48:45+00:00
draft: false
images: []
weight: 300
---
@@ -0,0 +1,42 @@
---
title: "WAHA Hub"
description: "WAHA Hub"
lead: ""
date: 2020-10-06T08:48:57+00:00
lastmod: 2020-10-06T08:48:57+00:00
draft: false
images: [ ]
menu:
docs:
parent: "overview"
weight: 100
toc: true
---
⚠️ The project in **DEVELOPMENT** yet... Subscribe to [**WAHA PRO**]({{< relref "plus-version#pro" >}}) to speed up the
development!
---
## Overview
**WAHA Hub** - central management solution to help your build reliable infrastructure with multiple WAHA servers!
While [WAHA Dashboard]({{< relref "/docs/how-to/waha-dashboard" >}}) is a UI to manage your WhatsApp sessions on
**single server**, **WAHA Hub** is a central management server to control and manage **multiple servers** in a single
place.
👉 **WAHA Hub** is available in [**WAHA PRO**]({{< relref "plus-version#pro" >}}) version only.
![WAHA Dashboard](waha-dashboard.png)
<div class="text-center">
<a href="waha-dashboard.png" target="_blank">See full size image</a>
</div>
## Features
- Control and manage multiple servers in a single Hub.
- Monitor the status of your servers
- And more!
Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

+37 -1
View File
@@ -27,7 +27,7 @@
<div class='row justify-content-center text-center'>
<div class='col-12'>
<h2>
What can WAHA do?
WAHA Features
</h2>
</div>
<div class='col-12 col-lg-4 pros-card'>
@@ -105,6 +105,40 @@
</pre>
</div>
</div>
<div class='col-12 pros-card' style='width: 80%'>
<h2 class='h4 color-accent'>Swagger documentation and OpenApi schema!</h2>
<p>
<a href='https://waha.devlike.pro/docs/how-to/plus-version/#core' target='_blank'>
<b>WAHA Core</b>
</a>
and
<a href='https://waha.devlike.pro/docs/how-to/plus-version/#plus' target='_blank'>
<b>WAHA Plus</b>
</a>
provide
<a href='https://waha.devlike.pro/swagger' target='_blank'>
Swagger documentation and OpenApi schema.
</a>
<br>
</p>
<img src='/images/swagger.png' alt='Swagger' style='max-width: 100%'>
</div>
<div class='col-12 pros-card' style='width: 80%'>
<h2 class='h4 color-accent'>WAHA Dashboard</h2>
<p>
<a href='https://waha.devlike.pro/docs/how-to/plus-version/#plus' target='_blank'>
<b>WAHA Plus</b>
</a>
provides
<a href='https://waha.devlike.pro/docs/how-to/waha-dashboard' target='_blank'>
WAHA Dashboard
</a> - a web interface to easily manage your WhatsApp sessions!
<br>
</p>
<img src='/images/waha-dashboard.png' alt='WAHA Dashboard' style='max-width: 100%'>
</div>
</div>
</div>
</section>
@@ -192,9 +226,11 @@
</small>
</p>
</div>
</div>
</div>
</section>
<section class='section section-sm'>
<div class='container hr'>
<div class='text-center mt-4'>
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

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

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

+1 -1
View File
@@ -1 +1 @@
{"openapi":"3.1.0","paths":{"/api/{session}/auth/qr":{"get":{"operationId":"AuthController_getQR","summary":"Get QR code for pairing WhatsApp Web.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"},{"name":"format","required":true,"in":"query","schema":{"default":"image","enum":["image","raw"],"type":"string"}}],"responses":{"200":{"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Base64File"},{"$ref":"#/components/schemas/QRCodeValue"}]}}},"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/{session}/auth/request-code":{"post":{"operationId":"AuthController_requestCode","summary":"Request authentication code.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCodeRequest"}}}},"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/{session}/auth/authorize-code":{"post":{"operationId":"AuthController_authorizeCode","summary":"Send OTP authentication code.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTPRequest"}}}},"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/{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
{"openapi":"3.1.0","paths":{"/api/{session}/auth/qr":{"get":{"operationId":"AuthController_getQR","summary":"Get QR code for pairing WhatsApp Web.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"},{"name":"format","required":true,"in":"query","schema":{"default":"image","enum":["image","raw"],"type":"string"}}],"responses":{"200":{"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Base64File"},{"$ref":"#/components/schemas/QRCodeValue"}]}}},"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/{session}/auth/request-code":{"post":{"operationId":"AuthController_requestCode","summary":"Request authentication code.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCodeRequest"}}}},"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/{session}/auth/authorize-code":{"post":{"operationId":"AuthController_authorizeCode","summary":"Send OTP authentication code.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTPRequest"}}}},"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/{session}/auth/captcha":{"get":{"operationId":"AuthController_getCaptcha","summary":"Get captcha image.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"responses":{"200":{"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Base64File"}]}}},"description":""}},"tags":["auth"],"security":[{"api_key":[]}]},"post":{"operationId":"AuthController_saveCaptcha","summary":"Enter captcha code.","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptchaBody"}}}},"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"api_key":[]}]}},"/api/sessions/start":{"post":{"operationId":"SessionsController_start","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStartRequest"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionDTO"}}}}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions/stop":{"post":{"operationId":"SessionsController_stop","summary":"Stop session","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStopRequest"}}}},"responses":{"201":{"description":""}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions/logout":{"post":{"operationId":"SessionsController_clean","summary":"Logout from session.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionLogoutRequest"}}}},"responses":{"201":{"description":""}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions":{"get":{"operationId":"SessionsController_list","parameters":[{"name":"all","required":false,"in":"query","example":false,"description":"Return all sessions, including those that are in the STOPPED state.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SessionInfo"}}}}}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions/{session}":{"get":{"operationId":"SessionsController_get","parameters":[{"name":"session","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionInfo"}}}}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/sessions/{session}/me":{"get":{"operationId":"SessionController_getMe","summary":"Get information about the authenticated account","parameters":[{"name":"session","required":true,"in":"path","schema":{"default":"default"},"description":"WhatsApp session name"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeInfo"}}}}},"tags":["sessions"],"security":[{"api_key":[]}]}},"/api/checkNumberStatus":{"get":{"operationId":"ChattingController_checkNumberStatus","summary":"Check number status","parameters":[{"name":"phone","required":true,"in":"query","schema":{"type":"string"}},{"nLine truncated
Binary file not shown.
Binary file not shown.
+3 -1
View File
@@ -2,6 +2,8 @@
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"plugins": ["@nestjs/swagger"]
"plugins": ["@nestjs/swagger"],
"assets": ["dashboard/**"],
"watchAssets": true
}
}
+1 -1
View File
@@ -58,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-form-update-nodejs"
"whatsapp-web.js": "https://github.com/devlikeapro/whatsapp-web.js#main-fork-update"
},
"devDependencies": {
"@nestjs/cli": "^9.0.0",
+21 -2
View File
@@ -1,4 +1,13 @@
import { Body, Controller, Get, Post, Query } from '@nestjs/common';
import {
Body,
Controller,
Delete,
Get,
NotFoundException,
Param,
Post,
Query,
} from '@nestjs/common';
import {
ApiExtraModels,
ApiOperation,
@@ -39,9 +48,10 @@ class SessionsController {
@Post('/stop/')
@ApiOperation({ summary: 'Stop session' })
async stop(@Body() request: SessionStopRequest): Promise<void> {
await this.manager.stop(request);
if (request.logout) {
await this.manager.logout(request);
} else {
await this.manager.stop(request);
}
return;
}
@@ -57,6 +67,15 @@ class SessionsController {
const all = parseBool(query.all);
return this.manager.getSessions(all);
}
@Get('/:session')
async get(@Param('session') name: string): Promise<SessionInfo> {
const session = this.manager.getSessionInfo(name);
if (session === null) {
throw new NotFoundException('Session not found');
}
return session;
}
}
@ApiSecurity('api_key')
+34 -2
View File
@@ -8,13 +8,24 @@ import { getEngineName } from './version';
@Injectable()
export class WhatsappConfigService {
public files_uri = '/api/files';
public filesUri = '/api/files';
public dashboardUri = '/dashboard';
public schema = 'http';
constructor(private configService: ConfigService) {}
static noSlash(value: string): string {
if (!value) {
return value;
}
if (value.startsWith('/')) {
return value.slice(1);
}
return value;
}
get filesURL(): string {
return `${this.schema}://${this.hostname}:${this.port}${this.files_uri}/`;
return `${this.schema}://${this.hostname}:${this.port}${this.filesUri}/`;
}
get hostname(): string {
@@ -152,6 +163,27 @@ export class WhatsappConfigService {
return [user, password];
}
getDashboardEnabled(): boolean {
const value = this.configService.get('WAHA_DASHBOARD_ENABLED', 'true');
return parseBool(value);
}
getDashboardUsernamePassword(): [string, string] | null {
if (!this.getDashboardEnabled()) {
return null;
}
const user = this.configService.get('WAHA_DASHBOARD_USERNAME', 'waha');
const password = this.configService.get('WAHA_DASHBOARD_PASSWORD', 'waha');
if (!user || !password) {
console.log(
'Please set up both WAHA_DASHBOARD_USERNAME and WAHA_DASHBOARD_PASSWORD ' +
'to enable swagger authentication.',
);
return null;
}
return [user, password];
}
getSwaggerAdvancedConfigEnabled(): boolean {
return this.configService.get('WHATSAPP_SWAGGER_CONFIG_ADVANCED', false);
}
+2
View File
@@ -37,5 +37,7 @@ export abstract class SessionManager implements OnApplicationShutdown {
abstract getSession(name: string): WhatsappSession;
abstract getSessionInfo(name: string): Promise<SessionInfo | null>;
abstract getSessions(all: boolean): Promise<SessionInfo[]>;
}
+14 -3
View File
@@ -3,6 +3,7 @@ import { ConfigModule } from '@nestjs/config';
import { PassportModule } from '@nestjs/passport';
import { ServeStaticModule } from '@nestjs/serve-static';
import { TerminusModule } from '@nestjs/terminus';
import { join } from 'path';
import { AuthController } from '../api/auth.controller';
import { ChatsController } from '../api/chats.controller';
@@ -33,12 +34,20 @@ export const IMPORTS = [
extraProviders: [WhatsappConfigService],
inject: [WhatsappConfigService],
useFactory: (config: WhatsappConfigService) => {
return [
const options = [
// Serve files (media)
{
rootPath: config.filesFolder,
serveRoot: config.files_uri,
serveRoot: config.filesUri,
},
];
if (config.getDashboardEnabled()) {
options.push({
rootPath: join(__dirname, '..', 'dashboard'),
serveRoot: config.dashboardUri,
});
}
return options;
},
}),
PassportModule,
@@ -76,4 +85,6 @@ const PROVIDERS = [
controllers: CONTROLLERS,
providers: PROVIDERS,
})
export class AppModuleCore {}
export class AppModuleCore {
constructor(protected config: WhatsappConfigService) {}
}
+3 -1
View File
@@ -516,7 +516,9 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
}
public async getContactProfilePicture(query: ContactQuery) {
throw new NotImplementedByEngineError();
const contact = this.ensureSuffix(query.contactId);
const url = await this.sock.profilePictureUrl(contact, 'image');
return { profilePictureURL: url };
}
public async blockContact(request: ContactRequest) {
+1 -1
View File
@@ -80,7 +80,7 @@ export class WhatsappSessionWebJSCore extends WhatsappSession {
executablePath: this.getBrowserExecutablePath(),
args: this.getBrowserArgsForPuppeteer(),
},
webVersion: '2.2411.2',
webVersion: '2.2412.54',
webVersionCache: {
type: 'remote',
remotePath:
+19
View File
@@ -186,6 +186,18 @@ export class SessionManagerCore extends SessionManager {
}
async logout(request: SessionLogoutRequest) {
const name = request.name;
this.onlyDefault(request.name);
this.stop({ name: name, logout: false })
.then(() => {
this.log.log(`Session '${name}' has been stopped.`);
})
.catch((err) => {
this.log.error(
`Error while stopping session '${name}' while logging out`,
err,
);
});
await this.sessionAuthRepository.clean(request.name);
}
@@ -229,4 +241,11 @@ export class SessionManagerCore extends SessionManager {
},
];
}
async getSessionInfo(name: string): Promise<SessionInfo | null> {
if (name !== this.DEFAULT) {
return null;
}
return this.getSessions(true).then((sessions) => sessions[0]);
}
}
+8 -2
View File
@@ -13,18 +13,24 @@ export class SwaggerModuleCore {
.setTitle('WAHA - WhatsApp HTTP API')
.setDescription(
'WhatsApp HTTP API that you can run in a click!<br/>' +
'<br/>' +
'Learn more:' +
'<ul>' +
'<li><a href="https://waha.devlike.pro/" target="_blank">Documentation</a></li>' +
'<li><a href="https://waha.devlike.pro/docs/how-to/engines/#features" target="_blank">Supported features in engines</a></li>' +
'<li><a href="https://github.com/devlikeapro/whatsapp-http-api" target="_blank">GitHub - WAHA Core</a></li>' +
'<li><a href="https://github.com/devlikeapro/whatsapp-http-api-plu' + // Separate line to pass pre-commit check
's" target="_blank">GitHub - WAHA Plus</a></li>' +
'<li><b>NEW!</b> - <a href="/dashboard">WAHA Dashboard</a></li>' +
'<li><b>NEW!</b> - <a href="https://waha.devlike.pro/docs/how-to/waha-dashboard">WAHA Dashboard Documentation</a></li>' +
'</ul>' +
'<br/>' +
'Support the project and get WAHA Plus version!' +
'<p>Support the project and get WAHA Plus version!</p>' +
'<ul>' +
'<li><a href="https://waha.devlike.pro/docs/how-to/plu' + // Separate line to pass pre-commit check
's-version/" target="_blank">WAHA Plus</a></li>' +
'<li><a href="https://patreon.com/wa_http_api/" target="_blank">Patreon</a></li>' +
'<li><a href="https://boosty.to/wa-http-api/" target="_blank">Boosty</a></li>' +
'<li><a href="https://portal.devlike.pro/" target="_blank">Patron Portal</a></li>' +
'</ul>',
)
.setExternalDoc('WAHA', 'https://waha.devlike.pro/')
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

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

After

Width:  |  Height:  |  Size: 74 KiB

+1
View File
@@ -36,6 +36,7 @@ async function bootstrap() {
app.enableShutdownHooks();
app.useGlobalFilters(new AllExceptionsFilter());
app.enableCors();
// Allow to send big body - for images and attachments
app.use(json({ limit: '50mb' }));
+2 -2
View File
@@ -171,8 +171,8 @@ export class MessageLocationRequest extends ChatRequest {
class FileRequest extends ChatRequest {
@ApiProperty({
oneOf: [
{ $ref: getSchemaPath(BinaryFile) },
{ $ref: getSchemaPath(RemoteFile) },
{ $ref: getSchemaPath(BinaryFile) },
],
})
file: BinaryFile | RemoteFile;
@@ -190,8 +190,8 @@ export class MessageFileRequest extends FileRequest {
export class MessageVoiceRequest extends ChatRequest {
@ApiProperty({
oneOf: [
{ $ref: getSchemaPath(VoiceBinaryFile) },
{ $ref: getSchemaPath(VoiceRemoteFile) },
{ $ref: getSchemaPath(VoiceBinaryFile) },
],
})
file: VoiceBinaryFile | VoiceRemoteFile;
+2 -6
View File
@@ -1,4 +1,5 @@
import { ApiProperty } from '@nestjs/swagger';
export class Base64File {
mimetype: string;
data: string;
@@ -70,14 +71,9 @@ export class VoiceRemoteFile {
})
mimetype = 'audio/ogg; codecs=opus';
@ApiProperty({
description: 'Document file name. Optional',
})
filename = 'voice-message.mp3';
@ApiProperty({
example:
'https://github.com/devlikeapro/whatsapp-http-api/raw/core/examples/dev.likeapro.mp3',
'https://github.com/devlikeapro/whatsapp-http-api/raw/core/examples/dev.likeapro.opus',
})
url: string;
}
+1 -1
View File
@@ -33,7 +33,7 @@ export function getEngineName(): string {
}
export const VERSION: WAHAEnvironment = {
version: '2024.4.3',
version: '2024.5.2',
engine: getEngineName(),
tier: getWAHAVersion(),
browser: getBrowserExecutablePath(),
+10 -10
View File
@@ -1300,10 +1300,10 @@ __metadata:
languageName: node
linkType: hard
"@pedroslopez/moduleraid@github:wwebjs/moduleRaid":
version: 6.0.2
resolution: "@pedroslopez/moduleraid@https://github.com/wwebjs/moduleRaid.git#commit=ecb616c04172dbeb294cef6b63715bfb4fd42d80"
checksum: 399d08f1bc7703f73f7ec5e80618139f6ed4a95cd05baa87a9c6c69d8cd0fbd299e1c757414fed2e160c9ec6dfb0f4b8e5fc08261b97bfb7f248dc16c28e9f83
"@pedroslopez/moduleraid@npm:^5.0.2":
version: 5.0.2
resolution: "@pedroslopez/moduleraid@npm:5.0.2"
checksum: b5668cb8d602e3fae0bcd75172f53b301814582ec288f4413127377a8be007aafc63846855431b6096a70dc9f113b059f6286bbc254f3bdbec435ba517dae36f
languageName: node
linkType: hard
@@ -13464,15 +13464,15 @@ __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-form-update-nodejs"
whatsapp-web.js: "https://github.com/devlikeapro/whatsapp-web.js#main-fork-update"
languageName: unknown
linkType: soft
"whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js#main-form-update-nodejs":
version: 1.23.1-alpha.5
resolution: "whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js.git#commit=616a80a7da5f8ce522c8e6b8a9ee29a94b315d8e"
"whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js#main-fork-update":
version: 1.23.1-alpha.6
resolution: "whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js.git#commit=d6eff450edf3e8d292cf70eb4243fd32ace61182"
dependencies:
"@pedroslopez/moduleraid": "github:wwebjs/moduleRaid"
"@pedroslopez/moduleraid": ^5.0.2
adm-zip: ^0.5.10
archiver: ^5.3.1
fluent-ffmpeg: 2.1.2
@@ -13489,7 +13489,7 @@ __metadata:
optional: true
unzipper:
optional: true
checksum: b89226a826a13578a2e01ed27951e87444d0ce4725e17742380d4f373ae5505c34ffd86cb26097f70848643016270ab506af47d0cb41c64f175029d8eaa90afa
checksum: 3a34d43b37caddb4544f8ddad885ceb02edb2e2fccf8412574d57631a16e08e3f4b37e7c5c28debad958f7b08a7b33916db60133e47daa5ebbcd9921b9f7455d
languageName: node
linkType: hard