Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a4c279ba25 | ||
|
|
e68282a9e4 | ||
|
|
8613206c3a | ||
|
|
31b8cde8bf | ||
|
|
2f2f9520db | ||
|
|
2501ae836e | ||
|
|
2c8bf91e77 | ||
|
|
0ac063498e | ||
|
|
2bf672f0cd | ||
|
|
ca209adca0 | ||
|
|
dd10c82c5e | ||
|
|
c3ad2a0931 | ||
|
|
30aacc8946 | ||
|
|
723a644937 | ||
|
|
165eeb5bf2 | ||
|
|
f1776d4a26 | ||
|
|
2f2a1b3182 | ||
|
|
0477cf7db5 | ||
|
|
2d7c7986aa | ||
|
|
bf84ea8fca | ||
|
|
f3ef8a7f96 | ||
|
|
ec214f610a | ||
|
|
013fd46722 | ||
|
|
32d583b9ef | ||
|
|
df6e201ba5 | ||
|
|
789b613b82 | ||
|
|
b698342db4 | ||
|
|
d853f2fe99 | ||
|
|
20d66b5b31 | ||
|
|
da7264c5e8 | ||
|
|
f3299f78d9 | ||
|
|
7ef0805c91 | ||
|
|
ba1afa2569 | ||
|
|
936e2d0863 | ||
|
|
166410f66a | ||
|
|
f8c9298694 | ||
|
|
b0b642b6bb | ||
|
|
5fa20343da | ||
|
|
bbbf181011 | ||
|
|
6af547d2af | ||
|
|
d72b1822cb | ||
|
|
d34df18da8 | ||
|
|
27cb247760 | ||
|
|
7a66d6fccd | ||
|
|
f1cb372339 | ||
|
|
46d65e6fc0 | ||
|
|
6168298b5e | ||
|
|
d5fef413ca | ||
|
|
0802ee6106 | ||
|
|
65d0f87eeb | ||
|
|
488868d80e | ||
|
|
154965efcb | ||
|
|
f364f0b495 | ||
|
|
82e2f5bcb9 | ||
|
|
f7a2228925 | ||
|
|
dadc9d4efd | ||
|
|
df59867431 | ||
|
|
a7c6e9dc00 | ||
|
|
6b51cfd448 | ||
|
|
98b86ca527 | ||
|
|
9a2ef4c52a | ||
|
|
d69d4bd29d | ||
|
|
97cdc56c26 | ||
|
|
c2440b9c79 | ||
|
|
f0b69d089a | ||
|
|
ac79549934 | ||
|
|
e6b8b5e904 | ||
|
|
5a22e5b2b2 | ||
|
|
431d7bf9d9 | ||
|
|
865ea6e66b | ||
|
|
2f787d6a53 | ||
|
|
939ac28d00 | ||
|
|
76068add09 | ||
|
|
0730dd6756 | ||
|
|
64cce8e8be | ||
|
|
2d12dc0f3e | ||
|
|
82a60e99cc | ||
|
|
1cbd18db76 | ||
|
|
48ccd636cd | ||
|
|
573dd0da7e | ||
|
|
df8583801f | ||
|
|
ff2b434133 | ||
|
|
30cae74d50 | ||
|
|
a896d32d37 | ||
|
|
d9d4527894 | ||
|
|
e93caac34b | ||
|
|
cd5182f8ee | ||
|
|
b185c02252 | ||
|
|
58aa10be9c | ||
|
|
5d3d3bf03a | ||
|
|
11af1cb390 | ||
|
|
32057573b7 | ||
|
|
0b6058654e | ||
|
|
a7fe444166 | ||
|
|
f4f734d8ff | ||
|
|
983e8dbbd3 | ||
|
|
b2150477d7 | ||
|
|
f83eeac33a | ||
|
|
37c4a85e76 | ||
|
|
8732af0f43 | ||
|
|
dfa7bc2ca8 | ||
|
|
f857bab540 | ||
|
|
59f2e1526d | ||
|
|
abe273166b | ||
|
|
3e37e933b2 | ||
|
|
6d2cae0784 | ||
|
|
0bf44dae88 | ||
|
|
9c9d6fda10 | ||
|
|
8b82f76668 | ||
|
|
5fb5eace6e | ||
|
|
ac865abe67 | ||
|
|
0b4e8e31fb | ||
|
|
3695c5c25f | ||
|
|
ea17f45263 | ||
|
|
eaea661be2 | ||
|
|
2a5d5e9d13 | ||
|
|
0afa354a0f | ||
|
|
a1112262a7 | ||
|
|
51b10e0282 | ||
|
|
340acc1173 | ||
|
|
40f6d833eb | ||
|
|
97c4a8f77d | ||
|
|
115eb1fb85 | ||
|
|
9093dbd86c | ||
|
|
3a373ed700 | ||
|
|
95aab5cba5 | ||
|
|
8cbed3b46d | ||
|
|
6f2cf83425 | ||
|
|
23fb543776 | ||
|
|
18c3ef991a | ||
|
|
b5d8471a67 | ||
|
|
16f7c5eb9d | ||
|
|
aff6e78b36 | ||
|
|
ebf5532f27 | ||
|
|
270be1ee77 | ||
|
|
53589a7968 | ||
|
|
e8d88b411a | ||
|
|
e14b89f964 |
No files matched your search
@@ -1,6 +1,12 @@
|
||||
tokens
|
||||
Dockerfile
|
||||
.sessions
|
||||
files
|
||||
venv
|
||||
.wwebjs_auth
|
||||
docs
|
||||
examples
|
||||
.github
|
||||
.git
|
||||
|
||||
# compiled output
|
||||
/dist
|
||||
|
||||
@@ -1,25 +1,27 @@
|
||||
module.exports = {
|
||||
parser: '@typescript-eslint/parser',
|
||||
parserOptions: {
|
||||
project: 'tsconfig.json',
|
||||
sourceType: 'module',
|
||||
},
|
||||
plugins: ['@typescript-eslint/eslint-plugin'],
|
||||
extends: [
|
||||
'plugin:@typescript-eslint/eslint-recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'prettier',
|
||||
'prettier/@typescript-eslint',
|
||||
],
|
||||
root: true,
|
||||
env: {
|
||||
node: true,
|
||||
jest: true,
|
||||
},
|
||||
rules: {
|
||||
'@typescript-eslint/interface-name-prefix': 'off',
|
||||
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
},
|
||||
parser: '@typescript-eslint/parser',
|
||||
parserOptions: {
|
||||
project: 'tsconfig.json',
|
||||
sourceType: 'module',
|
||||
},
|
||||
plugins: ['@typescript-eslint/eslint-plugin'],
|
||||
extends: [
|
||||
'plugin:@typescript-eslint/eslint-recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'prettier',
|
||||
'prettier/@typescript-eslint',
|
||||
],
|
||||
root: true,
|
||||
env: {
|
||||
node: true,
|
||||
jest: true,
|
||||
},
|
||||
rules: {
|
||||
'@typescript-eslint/interface-name-prefix': 'off',
|
||||
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
"@typescript-eslint/ban-ts-ignore": "off",
|
||||
"@typescript-eslint/ban-ts-comment": "off"
|
||||
},
|
||||
};
|
||||
@@ -10,18 +10,26 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
with:
|
||||
platforms: 'amd64'
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
with:
|
||||
images: allburov/whatsapp-http-api
|
||||
images: ${{ secrets.DOCKER_IMAGE }}
|
||||
flavor: latest=true
|
||||
tags: |
|
||||
type=ref,event=branch
|
||||
type=ref,event=pr
|
||||
type=semver,pattern={{version}}
|
||||
|
||||
- name: Login to image repository
|
||||
if: github.ref_type == 'tag'
|
||||
uses: docker/login-action@v2
|
||||
@@ -30,10 +38,11 @@ jobs:
|
||||
password: ${{ secrets.DOCKER_TOKEN }}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v3
|
||||
uses: docker/build-push-action@v4
|
||||
with:
|
||||
context: .
|
||||
file: Dockerfile
|
||||
platforms: 'amd64'
|
||||
push: ${{ github.ref_type == 'tag' }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
@@ -0,0 +1,60 @@
|
||||
name: Deploy Pages
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- core
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: docs/site
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm install
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
npm run build
|
||||
|
||||
- name: Upload folder
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
path: docs/site/public
|
||||
name: public
|
||||
|
||||
deploy-github-pages:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Download folder
|
||||
uses: actions/download-artifact@v2
|
||||
with:
|
||||
name: public
|
||||
path: public
|
||||
|
||||
- name: File list
|
||||
run: |
|
||||
ls -la && ls -la public
|
||||
|
||||
- name: Deploy
|
||||
uses: JamesIves/github-pages-deploy-action@4.0.0
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
BRANCH: gh-pages
|
||||
FOLDER: public
|
||||
CLEAN: true
|
||||
@@ -1,6 +1,9 @@
|
||||
.sessions
|
||||
tokens
|
||||
files
|
||||
venv
|
||||
.wwebjs_auth
|
||||
test.js
|
||||
|
||||
# compiled output
|
||||
/dist
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
repos:
|
||||
- repo: https://github.com/Lucas-C/pre-commit-hooks-nodejs
|
||||
rev: v1.1.2
|
||||
hooks:
|
||||
- id: markdown-toc
|
||||
name: README.md
|
||||
files: ^README.md$
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: no-plus-in-core
|
||||
name: No "plus" in core
|
||||
language: pygrep
|
||||
entry: 'plus'
|
||||
files: |
|
||||
(?x)^(
|
||||
src/api/.*|
|
||||
src/core/.*|
|
||||
src/structures/.*|
|
||||
src/config.service.ts|
|
||||
)$
|
||||
@@ -0,0 +1,2 @@
|
||||
# Changelog
|
||||
You can find changelog on [the changelog page](https://waha.devlike.pro/docs/help/changelog/)
|
||||
@@ -1,23 +1,60 @@
|
||||
FROM node:15
|
||||
# Chrome
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y wget gnupg \
|
||||
&& wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
|
||||
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y google-chrome-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf \
|
||||
#
|
||||
# Build
|
||||
#
|
||||
FROM node:18 as build
|
||||
ENV PUPPETEER_SKIP_DOWNLOAD=True
|
||||
|
||||
# npm packages
|
||||
WORKDIR /src
|
||||
COPY package.json .
|
||||
COPY yarn.lock .
|
||||
RUN yarn install
|
||||
|
||||
# App
|
||||
WORKDIR /src
|
||||
ADD . /src
|
||||
RUN npm run build && find ./dist -name "*.d.ts" -delete
|
||||
|
||||
#
|
||||
# Final
|
||||
#
|
||||
FROM node:18 as release
|
||||
ENV PUPPETEER_SKIP_DOWNLOAD=True
|
||||
ARG USE_BROWSER=chromium
|
||||
|
||||
# Install fonts
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf \
|
||||
--no-install-recommends \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# npm packages
|
||||
WORKDIR /app
|
||||
COPY package.json .
|
||||
COPY package-lock.json .
|
||||
RUN npm install
|
||||
# Install Chromium
|
||||
RUN if [ "$USE_BROWSER" = "chromium" ]; then \
|
||||
apt-get update \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y chromium \
|
||||
--no-install-recommends \
|
||||
&& rm -rf /var/lib/apt/lists/*; \
|
||||
fi
|
||||
|
||||
# App
|
||||
# Install Chrome
|
||||
RUN if [ "$USE_BROWSER" = "chrome" ]; then \
|
||||
apt-get update \
|
||||
&& apt-get install -y wget gnupg \
|
||||
&& wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
|
||||
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y google-chrome-stable \
|
||||
--no-install-recommends \
|
||||
&& rm -rf /var/lib/apt/lists/*; \
|
||||
fi
|
||||
|
||||
# Attach sources, install packages
|
||||
WORKDIR /app
|
||||
ADD . /app
|
||||
RUN npm run build
|
||||
ENTRYPOINT npm run start:prod
|
||||
COPY package.json ./
|
||||
COPY --from=build /src/node_modules ./node_modules
|
||||
COPY --from=build /src/dist ./dist
|
||||
|
||||
# Run command, etc
|
||||
EXPOSE 3000
|
||||
CMD npm run start:prod
|
||||
@@ -1,8 +1,39 @@
|
||||
build:
|
||||
docker build . -t allburov/whatsapp-http-api
|
||||
docker build . -t devlikeapro/whatsapp-http-api
|
||||
|
||||
run:
|
||||
docker run -it -v `pwd`/tokens:/app/tokens -p 127.0.0.1:3000:3000/tcp allburov/whatsapp-http-api
|
||||
run-webjs:
|
||||
docker run \
|
||||
--rm -d \
|
||||
-p 127.0.0.1:3000:3000/tcp \
|
||||
-v `pwd`/.sessions:/app/.sessions \
|
||||
-e WHATSAPP_HOOK_URL=https://httpbin.org/post \
|
||||
-e WHATSAPP_HOOK_EVENTS=* \
|
||||
-e WHATSAPP_API_KEY=321 \
|
||||
--name whatsapp-http-api devlikeapro/whatsapp-http-api
|
||||
|
||||
run-venom:
|
||||
docker run \
|
||||
--rm -d \
|
||||
-p 127.0.0.1:3000:3000/tcp \
|
||||
-v `pwd`/.sessions:/app/.sessions \
|
||||
-e WHATSAPP_HOOK_URL=https://httpbin.org/post \
|
||||
-e WHATSAPP_HOOK_EVENTS=* \
|
||||
-e WHATSAPP_DEFAULT_ENGINE=VENOM \
|
||||
-e WHATSAPP_API_KEY=321 \
|
||||
--name whatsapp-http-api devlikeapro/whatsapp-http-api
|
||||
|
||||
stop:
|
||||
docker stop whatsapp-http-api
|
||||
|
||||
clean: stop
|
||||
sudo rm -rf .sessions
|
||||
|
||||
push:
|
||||
docker push allburov/whatsapp-http-api
|
||||
docker push devlikeapro/whatsapp-http-api
|
||||
|
||||
update-swagger:
|
||||
wget http://localhost:3000/-json -O ./docs/site/static/swagger/openapi.json
|
||||
|
||||
update-dependencies:
|
||||
. ${NVM_DIR}/nvm.sh && nvm exec yarn add whatsapp-web.js@https://github.com/pedroslopez/whatsapp-web.js
|
||||
. ${NVM_DIR}/nvm.sh && nvm exec yarn add venom-bot
|
||||
@@ -1,176 +1,208 @@
|
||||
# WhatsApp HTTP API Free
|
||||
# WhatsApp HTTP API (WAHA)
|
||||
|
||||
**NOTE**
|
||||
<p align="center">
|
||||
<img src="./docs/site/static/images/logo.png" alt="Image" />
|
||||
</p>
|
||||
|
||||
If you have any problem with docker version of API - try to use the fork https://github.com/diazzaid/whatsapp-api-venom. It uses the latest Venom and probably works better. I haven't updated the venom here for a long time...
|
||||
**WAHA** - **W**hats**A**pp **H**TTP **A**PI that you can install on your own server and run in less than 5 minutes!
|
||||
|
||||
----------
|
||||
- Documentation: [https://waha.devlike.pro/](https://waha.devlike.pro/)
|
||||
- Swagger Example: [https://waha.devlike.pro/swagger](https://waha.devlike.pro/swagger)
|
||||
|
||||
WhatsApp HTTP API that you can configure in a click! It's really Free! :)
|
||||
# Tables of Contents
|
||||
|
||||
> The article [Make a WhatsApp Bot Via HTTP API For Free And Fun!](https://allburov.medium.com/make-a-whatsapp-bot-for-free-and-fun-via-http-api-b3e6afcdf395) on Medium about this repository.
|
||||
<!-- toc -->
|
||||
|
||||
You can go [through currently supported methods in Swagger](https://allburov.github.io/whatsapp-http-api/)
|
||||
The project is an HTTP wrapper around https://github.com/orkestral/venom, so we can also support these methods:
|
||||
- [Features](#features)
|
||||
* [Messages](#messages)
|
||||
* [Sessions](#sessions)
|
||||
* [Security](#security)
|
||||
* [Updates](#updates)
|
||||
* [Groups](#groups)
|
||||
* [Contacts](#contacts)
|
||||
- [Quick start](#quick-start)
|
||||
* [Requirements](#requirements)
|
||||
* [Send your first message](#send-your-first-message)
|
||||
+ [1. Download image](#1-download-image)
|
||||
+ [2. Run WhatsApp HTTP API](#2-run-whatsapp-http-api)
|
||||
+ [3. Start a new session](#3-start-a-new-session)
|
||||
+ [4. Get and scan QR](#4-get-and-scan-qr)
|
||||
+ [5. Get the screenshot](#5-get-the-screenshot)
|
||||
+ [6. Send a text message](#6-send-a-text-message)
|
||||
* [What is next?](#what-is-next)
|
||||
|
||||
| | |
|
||||
| ---------------------------------------------------------- | --- |
|
||||
| Automatic QR Refresh | ✔ |
|
||||
| Send **text, image, video, audio and docs** | ✔ |
|
||||
| Get **contacts, chats, groups, group members, Block List** | ✔ |
|
||||
| Send contacts | ✔ |
|
||||
| Send stickers | ✔ |
|
||||
| Send stickers GIF | ✔ |
|
||||
| Multiple Sessions | ✔ |
|
||||
| Forward Messages | ✔ |
|
||||
| Receive message | ✔ |
|
||||
| insert user section | ✔ |
|
||||
| 📍 Send location!! | ✔ |
|
||||
| 🕸🕸 **and much more** | ✔ |
|
||||
<!-- tocstop -->
|
||||
|
||||
# Installation
|
||||
# Features
|
||||
|
||||
## Messages
|
||||
- Send messages
|
||||
- Receive messages
|
||||
- Message replies
|
||||
- Send location
|
||||
- Send buttons
|
||||
- Receive location
|
||||
- React to messages
|
||||
- Send media (images/documents/files)
|
||||
- Send voice messages
|
||||
- Receive media (images/audio/video/documents)
|
||||
- Receive messages - webhook retries
|
||||
|
||||
## Sessions
|
||||
- Multi Device
|
||||
- Get the screenshot
|
||||
- Session saving (don't have to scan QR on every restart)
|
||||
- Single WhatsApp account running inside one container
|
||||
- Multiple WhatsApp account running inside one container
|
||||
|
||||
## Security
|
||||
- Swagger panel authentication
|
||||
- API authentication
|
||||
|
||||
## Updates
|
||||
- Bug fixes and updates come as soon as they are implemented.
|
||||
- One month delay in bug fixes and updates.
|
||||
|
||||
|
||||
## Groups
|
||||
- Create a group
|
||||
- Get invite for group
|
||||
- Modify group info (subject, description)
|
||||
- Add group participants
|
||||
- Kick group participants
|
||||
- Promote/demote group participants
|
||||
|
||||
## Contacts
|
||||
- Mute/unmute chats
|
||||
- Block/unblock contacts
|
||||
- Get contact info
|
||||
- Get profile pictures
|
||||
|
||||
# Quick start
|
||||
|
||||
## Requirements
|
||||
|
||||
Only thing that you must have - installed docker. Please follow the original
|
||||
instruction [how to install docker](https://docs.docker.com/get-docker/)
|
||||
instruction <a href="https://docs.docker.com/get-docker/" target="_blank" rel="noopener">how to install docker -></a>.
|
||||
|
||||
When you are ready - come back and follows the below steps to send the first text message to WhatsApp via HTTP API!
|
||||
|
||||
{{< details "Why Docker?" >}}
|
||||
Docker makes it easy to ship all-in-one solution with the runtime and dependencies. You don't have to worry about
|
||||
language-specific libraries or chrome installation.
|
||||
|
||||
Also Docker makes installation and update processes so simple, just one command!
|
||||
{{< /details >}}
|
||||
|
||||
## Send your first message
|
||||
|
||||
Let's go over steps that allow you to send your first text message via WhatsApp HTTP API!
|
||||
|
||||
### 1. Download image
|
||||
|
||||
Assuming you have installed [Docker](https://docs.docker.com/get-docker/), let's download the image.
|
||||
|
||||
 For Core version the command is
|
||||
|
||||
```bash
|
||||
docker pull allburov/whatsapp-http-api
|
||||
docker pull devlikeapro/whatsapp-http-api
|
||||
```
|
||||
|
||||
# First Steps
|
||||
 For Plus version, we use login to get the image before:
|
||||
|
||||
## Run and login
|
||||
```bash
|
||||
docker login -u devlikeapro -p {PASSWORD}
|
||||
docker pull devlikeapro/whatsapp-http-api-plus
|
||||
docker logout
|
||||
```
|
||||
|
||||
Read more about how to get `PASSWORD` for [Plus Version →]({{< relref "plus-version" >}})
|
||||
|
||||
### 2. Run WhatsApp HTTP API
|
||||
|
||||
Run WhatsApp HTTP API:
|
||||
|
||||
```bash
|
||||
docker pull allburov/whatsapp-http-api
|
||||
docker run -it -v `pwd`/tokens:/app/tokens -p 127.0.0.1:3000:3000/tcp allburov/whatsapp-http-api
|
||||
docker run -it --rm -p 127.0.0.1:3000:3000/tcp --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
|
||||
```
|
||||
|
||||
If you are not logged in, it will print a QR code in the terminal. Scan it with your phone and you are ready to go!
|
||||
[How to log in - the instruction on WhatsApp site](https://faq.whatsapp.com/general/download-and-installation/how-to-log-in-or-out/?lang=en)
|
||||
We will remember the session so there is no need to authenticate everytime.
|
||||
Open the link in your browser [http://localhost:3000/](http://localhost:3000/) and you'll see API documentation
|
||||
(Swagger).
|
||||
|
||||
After that open in a browser the link and you'll see Swagger (OpenApi) API specification for WhatsApp HTTP API
|
||||
http://localhost:3000/#/
|
||||

|
||||
|
||||
## Send a text message
|
||||
### 3. Start a new session
|
||||
|
||||
Let's try to send a message:
|
||||
To start a new session you should have your mobile phone with installed WhatsApp application close to you.
|
||||
|
||||
Please go and read how what we'll need to a bit
|
||||
later:
|
||||
<a href="https://faq.whatsapp.com/381777293328336/?helpref=hc_fnav" target="_blank">
|
||||
How to log in - the instruction on WhatsApp site
|
||||
</a>
|
||||
|
||||
When your ready - find `POST /api/session/start`, click on **Try it out**, then **Execute** a bit below.
|
||||
|
||||
|
||||
The example payload:
|
||||
```json
|
||||
{
|
||||
"name": "default"
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
|
||||
By using the request with `name` values you can start multiple session (WhatsApp accounts) inside the single docker container in Plus
|
||||
 version and only one account in Core  version.
|
||||
|
||||
Read more about [multiple sessions →]({{< relref "/docs/how-to/sessions" >}})
|
||||
|
||||
### 4. Get and scan QR
|
||||
|
||||
Find `GET /api/screenshot` and execute it, it shows you QR code.
|
||||
|
||||

|
||||
|
||||
**Scan the QR with your cell phone's WhatsApp app.**
|
||||
|
||||

|
||||
|
||||
### 5. Get the screenshot
|
||||
|
||||
Execute `GET /api/screenshot` after a few seconds after scanning the QR - it'll show you the screenshot of you Whatsapp
|
||||
instance. If you can get the actual screenshot - then you're ready to start sending messages!
|
||||
|
||||

|
||||
|
||||
### 6. Send a text message
|
||||
|
||||
Let's send a text message - find `POST /api/sendText` in [swagger](http://localhost:3000/) and change `chatId` this
|
||||
way: use a phone international phone number without `+` symbol and add `@c.us` at the end.
|
||||
|
||||
For phone number `12132132131` the `chatId` is `12132132131@c.us`.
|
||||
|
||||
The example payload:
|
||||
```json
|
||||
{
|
||||
"chatId": "12132132130@c.us",
|
||||
"text": "Hi there!",
|
||||
"session": "default"
|
||||
}
|
||||
```
|
||||

|
||||
|
||||
Also, you can use `curl` and send POST request like this:
|
||||
|
||||
```bash
|
||||
# Phone without +
|
||||
# Using GET
|
||||
curl "http://localhost:3000/api/sendText?phone=79776772457&text=Hello+from+WhatsApp+HTTP+API+Free!"
|
||||
|
||||
# Using POST
|
||||
export PHONE=79776772457
|
||||
curl -d "{\"chatId\": \"${PHONE}@c.us\", \"text\": \"Hello from WhatsApp HTTP API Free\" }" -H "Content-Type: application/json" -X POST http://localhost:3000/api/sendText
|
||||
export PHONE=12132132130
|
||||
curl -d "{\"chatId\": \"${PHONE}@c.us\", \"text\": \"Hello from WhatsApp HTTP API\" }" -H "Content-Type: application/json" -X POST http://localhost:3000/api/sendText
|
||||
```
|
||||
|
||||
## Get a screenshot
|
||||
## What is next?
|
||||
[Go and read the full documentation!](https://waha.devlike.pro/docs/overview/introduction/)
|
||||
|
||||
Go to the "screenshot" section and get a screenshot http://localhost:3000/#/screenshot
|
||||

|
||||
|
||||
## Receive messages
|
||||
|
||||
To show how to receive messages we'll create a simple "echo" server with two functions:
|
||||
|
||||
1. When we receive a text message - just send the text back
|
||||
2. When we receive a message with a file (an image, a voice message) - download it and send the path back
|
||||
|
||||
In order to send you messages we use webhooks and configure them via environments variables. So what you need to
|
||||
create "echo" server is HTTP server that will receive JSON POST request and then call back WhatsApp HTTP API
|
||||
via `POST /api/sendText` endpoint with JSON body.
|
||||
|
||||
### Python echo server
|
||||
|
||||
We use Python. Feel free to create your favorite language example and contribute to the project!
|
||||
|
||||
Run "echo" server in one terminal and leave it working:
|
||||
|
||||
```bash
|
||||
# if you haven't already
|
||||
git clone https://github.com/allburov/whatsapp-http-api.git
|
||||
cd whatsapp-http-api
|
||||
python -mpip install -r examples/requirements.txt
|
||||
export FLASK_APP=examples/echo.py
|
||||
flask run
|
||||
```
|
||||
|
||||
Visit http://localhost:5000 and check that we are good to go further.
|
||||
|
||||
Let's start WhatsApp HTTP API and configure the "on message" webhook and point it on our "http://localhost:5000/message"
|
||||
endpoint:
|
||||
|
||||
```bash
|
||||
docker run -it -v `pwd`/tokens:/app/tokens --network=host -e WHATSAPP_HOOK_ONMESSAGE=http://localhost:5000/message allburov/whatsapp-http-api
|
||||
```
|
||||
|
||||
Now go ahead, open the second whatsapp and send to our WhatsApp HTTP API a text message! It must reply the same text.
|
||||
|
||||
If you try to send an image the "echo server" will send a path to the downloaded file.
|
||||
|
||||
# Environment variables
|
||||
|
||||
## Common
|
||||
|
||||
- `DEBUG` - show debug and verbose logs, set in any value
|
||||
- `WHATSAPP_API_PORT` - listen port for HTTP server (default: `3000`)
|
||||
- `WHATSAPP_API_HOSTNAME` - Hostname for HTTP server (default: `localhost`)
|
||||
|
||||
## Webhooks
|
||||
|
||||
The description of [webhooks you can in Venom README.md, section Events](https://github.com/orkestral/venom#events)
|
||||
|
||||
All webhooks are disabled by default:
|
||||
|
||||
- `WHATSAPP_HOOK_ONMESSAGE=http://localhost/uri`
|
||||
- `WHATSAPP_HOOK_ONSTATECHANGE=http://localhost/uri`
|
||||
- `WHATSAPP_HOOK_ONACK=http://localhost/uri`
|
||||
- `WHATSAPP_HOOK_ONADDEDTOGROUP=http://localhost/uri`
|
||||
|
||||
## File storage
|
||||
|
||||
- `WHATSAPP_FILES_FOLDER` - folder where will be stored files from chats (images, voice messages) (
|
||||
default: `/tmp/whatsapp-files`)
|
||||
- `WHATSAPP_FILES_MIMETYPES` - download only these mimetypes from messages (download all files be default). Mimetypes
|
||||
must be separated by a comma, without spaces: `audio,image/png,image/gif`. In order to choose type use prefix (
|
||||
like `audio,image`).
|
||||
- `WHATSAPP_FILES_LIFETIME`- to keep free space files will be removed after this time (default: `180`, in seconds)
|
||||
|
||||
# Development
|
||||
|
||||
Use node 10 version:
|
||||
|
||||
```bash
|
||||
$ npm install
|
||||
```
|
||||
|
||||
## Running the app
|
||||
|
||||
```bash
|
||||
# development
|
||||
$ npm run start
|
||||
|
||||
# watch mode
|
||||
$ npm run start:dev
|
||||
|
||||
# production mode
|
||||
$ npm run start:prod
|
||||
```
|
||||
|
||||
## Test
|
||||
|
||||
```bash
|
||||
# unit tests
|
||||
$ npm run test
|
||||
|
||||
# e2e tests
|
||||
$ npm run test:e2e
|
||||
|
||||
# test coverage
|
||||
$ npm run test:cov
|
||||
```
|
||||
@@ -1,15 +0,0 @@
|
||||
version: '3.4'
|
||||
|
||||
services:
|
||||
whatsapp-http-api:
|
||||
build: .
|
||||
image: allburov/whatsapp-http-api
|
||||
restart: always
|
||||
ports:
|
||||
- 3000:3000
|
||||
shm_size: "1gb"
|
||||
environment:
|
||||
- WHATSAPP_DOWNLOADS_FOLDER=/app/files/downloads
|
||||
volumes:
|
||||
- ./tokens:/app/tokens
|
||||
- ./files:/app/files
|
||||
@@ -1,60 +0,0 @@
|
||||
<!-- HTML for static distribution bundle build -->
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>allburov/whatsapp-http-api</title>
|
||||
<link rel="stylesheet" type="text/css" href="./swagger-ui.css" >
|
||||
<link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" />
|
||||
<link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" />
|
||||
<style>
|
||||
html
|
||||
{
|
||||
box-sizing: border-box;
|
||||
overflow: -moz-scrollbars-vertical;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
*,
|
||||
*:before,
|
||||
*:after
|
||||
{
|
||||
box-sizing: inherit;
|
||||
}
|
||||
|
||||
body
|
||||
{
|
||||
margin:0;
|
||||
background: #fafafa;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="swagger-ui"></div>
|
||||
|
||||
<script src="./swagger-ui-bundle.js" charset="UTF-8"> </script>
|
||||
<script src="./swagger-ui-standalone-preset.js" charset="UTF-8"> </script>
|
||||
<script>
|
||||
window.onload = function() {
|
||||
// Begin Swagger UI call region
|
||||
const ui = SwaggerUIBundle({
|
||||
url: "openapi.json",
|
||||
dom_id: '#swagger-ui',
|
||||
deepLinking: true,
|
||||
presets: [
|
||||
SwaggerUIBundle.presets.apis,
|
||||
SwaggerUIStandalonePreset
|
||||
],
|
||||
plugins: [
|
||||
SwaggerUIBundle.plugins.DownloadUrl
|
||||
],
|
||||
layout: "StandaloneLayout"
|
||||
})
|
||||
// End Swagger UI call region
|
||||
|
||||
window.ui = ui
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1 +0,0 @@
|
||||
{"openapi":"3.0.0","info":{"title":"WhatsApp HTTP API","description":"WhatsApp HTTP API that you can configure in a click!","version":"1.0","contact":{}},"tags":[{"name":"device","description":"Device information"},{"name":"chatting","description":"Chat methods"}],"servers":[],"components":{"securitySchemes":{"api_key":{"type":"apiKey","in":"header","name":"X-VENOM-TOKEN","description":"Your secret key"}},"schemas":{"MessageContactVcard":{"type":"object","properties":{"chatId":{"type":"string","example":"791231234567@c.us"},"contactsId":{"type":"string"},"name":{"type":"string"}},"required":["chatId","contactsId","name"]},"MessageText":{"type":"object","properties":{"chatId":{"type":"string","example":"791231234567@c.us"},"text":{"type":"string"}},"required":["chatId","text"]},"MessageLocation":{"type":"object","properties":{"chatId":{"type":"string","example":"791231234567@c.us"},"latitude":{"type":"string"},"longitude":{"type":"string"},"title":{"type":"string"}},"required":["chatId","latitude","longitude","title"]},"MessageLinkPreview":{"type":"object","properties":{"chatId":{"type":"string","example":"791231234567@c.us"},"url":{"type":"string"},"title":{"type":"string"}},"required":["chatId","url","title"]},"MessageImage":{"type":"object","properties":{"chatId":{"type":"string","example":"791231234567@c.us"},"path":{"type":"string"},"filename":{"type":"string"},"caption":{"type":"string"}},"required":["chatId","path","filename","caption"]},"MessageFile":{"type":"object","properties":{"chatId":{"type":"string","example":"791231234567@c.us"},"path":{"type":"string"},"filename":{"type":"string"},"caption":{"type":"string"}},"required":["chatId","path","filename","caption"]},"MessageReply":{"type":"object","properties":{"chatId":{"type":"string","example":"791231234567@c.us"},"reply_to":{"type":"string","example":"message.id"},"text":{"type":"string"}},"required":["chatId","reply_to","text"]},"Chat":{"type":"object","properties":{"chatId":{"type":"string","example":"791231234567@c.us"}},"required":["chatId"]}}},"externalDocs":{"description":"Github WhatsApp HTTP API","url":"https://github.com/allburov/whatsapp-http-api"},"paths":{"/api/sendContactVcard":{"post":{"operationId":"ChattingController_sendContactVcard","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageContactVcard"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["chatting"]}},"/api/sendText":{"post":{"operationId":"ChattingController_sendText","summary":"Send a text message","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageText"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["chatting"]}},"/api/sendLocation":{"post":{"operationId":"ChattingController_sendLocation","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageLocation"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["chatting"]}},"/api/sendLinkPreview":{"post":{"operationId":"ChattingController_sendLinkPreview","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageLinkPreview"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["chatting"]}},"/api/sendImage":{"post":{"operationId":"ChattingController_sendImage","summary":"NOT IMPLEMENTED YET","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageImage"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["chatting"]}},"/api/sendFile":{"post":{"operationId":"ChattingController_sendFile","summary":"NOT IMPLEMENTED YET","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageFile"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["chatting"]}},"/api/reply":{"post":{"operationId":"ChattingController_reply","summary":"Reply to a text message","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageReply"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["chatting"]}},"/api/sendSeen":{"post":{"operationId":"ChattingController_sendSeen","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chat"}}}},"responses":{"201":{"description":""}},"tags":["chatting"]}},"/api/startTyping":{"post":{"operationId":"ChattingController_startTyping","parameters":[],"requestBody":{"required":trLine truncated
|
||||
|
Before Width: | Height: | Size: 139 KiB |
@@ -0,0 +1,11 @@
|
||||
# editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
@@ -0,0 +1,4 @@
|
||||
assets/js/index.js
|
||||
assets/js/katex.js
|
||||
assets/js/vendor
|
||||
node_modules
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"commonjs": true,
|
||||
"es6": true,
|
||||
"node": true
|
||||
},
|
||||
"extends": "eslint:recommended",
|
||||
"globals": {
|
||||
"Atomics": "readonly",
|
||||
"SharedArrayBuffer": "readonly"
|
||||
},
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 2018,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"rules": {
|
||||
"no-console": 0,
|
||||
"quotes": ["error", "single"],
|
||||
"comma-dangle": [
|
||||
"error",
|
||||
{
|
||||
"arrays": "always-multiline",
|
||||
"objects": "always-multiline",
|
||||
"imports": "always-multiline",
|
||||
"exports": "always-multiline",
|
||||
"functions": "ignore"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # Replace with a single Patreon username
|
||||
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: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
@@ -0,0 +1,25 @@
|
||||
---
|
||||
name: "Bug report \U0001F41E"
|
||||
about: Create a report to help us improve
|
||||
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
Describe the issue that you're seeing.
|
||||
|
||||
### Steps to reproduce
|
||||
|
||||
Clear steps describing how to reproduce the issue. Please please please link to a demo project if possible, this makes your issue _much_ easier to diagnose (seriously).
|
||||
|
||||
### Expected result
|
||||
|
||||
What should happen?
|
||||
|
||||
### Actual result
|
||||
|
||||
What happened.
|
||||
|
||||
### Environment
|
||||
|
||||
Paste the information here as shown by `npm run check`
|
||||
@@ -0,0 +1,4 @@
|
||||
contact_links:
|
||||
- name: Question 🙋
|
||||
url: https://github.com/h-enk/doks/discussions/categories/q-a
|
||||
about: Ask your question in Doks Discussions
|
||||
@@ -0,0 +1,17 @@
|
||||
---
|
||||
name: "Feature request \U0001F680"
|
||||
about: Suggest an idea for Doks
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
Brief explanation of the feature.
|
||||
|
||||
### Basic example
|
||||
|
||||
Include a basic example or links here.
|
||||
|
||||
### Motivation
|
||||
|
||||
Why are we doing this? What use cases does it support? What is the expected outcome?
|
||||
@@ -0,0 +1,11 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "npm" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
schedule:
|
||||
interval: "daily"
|
||||
@@ -0,0 +1,62 @@
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [master]
|
||||
schedule:
|
||||
- cron: '0 11 * * 5'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# Override automatic language detection by changing the below list
|
||||
# Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
|
||||
language: ['javascript']
|
||||
# Learn more...
|
||||
# https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
@@ -0,0 +1,34 @@
|
||||
name: Hyas CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: master
|
||||
pull_request:
|
||||
branches: master
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||
node: [16.x, 18.x]
|
||||
|
||||
steps:
|
||||
- name: Check out Hyas project
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Node.js ${{ matrix.node }}
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Run Hyas test script
|
||||
run: npm test
|
||||
|
||||
- name: Build production website
|
||||
run: npm run build
|
||||
@@ -0,0 +1,19 @@
|
||||
name: 'Close stale issues and PRs'
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@v4
|
||||
with:
|
||||
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
|
||||
stale-pr-message: 'This PR is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
|
||||
close-issue-message: 'This issue was closed because it has been stalled for 5 days with no activity.'
|
||||
close-pr-message: 'This PR was closed because it has been stalled for 5 days with no activity.'
|
||||
days-before-stale: 30
|
||||
days-before-close: 5
|
||||
days-before-pr-close: 5
|
||||
exempt-issue-labels: 'keep'
|
||||
@@ -0,0 +1,5 @@
|
||||
node_modules
|
||||
public
|
||||
resources
|
||||
.netlify
|
||||
.hugo_build.lock
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"config": {
|
||||
"default": true,
|
||||
"MD013": false,
|
||||
"MD024": false,
|
||||
"MD026": false,
|
||||
"MD033": false,
|
||||
"MD034": false
|
||||
},
|
||||
"ignores": ["node_modules", "CHANGELOG.md", "README.md"]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
v18.12.0
|
||||
@@ -0,0 +1,3 @@
|
||||
assets/scss/components/_syntax.scss
|
||||
assets/scss/vendor
|
||||
node_modules
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"extends": "stylelint-config-standard-scss",
|
||||
"rules": {
|
||||
"no-empty-source": null,
|
||||
"string-quotes": "double",
|
||||
"scss/comment-no-empty": null,
|
||||
"max-line-length": null,
|
||||
"scss/at-extend-no-missing-placeholder": null,
|
||||
"scss/dollar-variable-colon-space-after": null,
|
||||
"scss/dollar-variable-empty-line-before": null,
|
||||
"color-function-notation": null,
|
||||
"alpha-value-notation": null,
|
||||
"selector-id-pattern": null,
|
||||
"selector-class-pattern": null,
|
||||
"scss/no-global-function-names": null,
|
||||
"number-max-precision": null,
|
||||
"hue-degree-notation": null,
|
||||
"value-no-vendor-prefix": null,
|
||||
"property-no-vendor-prefix": null,
|
||||
"at-rule-no-unknown": [
|
||||
true,
|
||||
{
|
||||
"ignoreAtRules": [
|
||||
"extend",
|
||||
"at-root",
|
||||
"debug",
|
||||
"warn",
|
||||
"error",
|
||||
"if",
|
||||
"else",
|
||||
"for",
|
||||
"each",
|
||||
"while",
|
||||
"mixin",
|
||||
"include",
|
||||
"content",
|
||||
"return",
|
||||
"function",
|
||||
"tailwind",
|
||||
"apply",
|
||||
"responsive",
|
||||
"variants",
|
||||
"screen"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
### Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
||||
|
||||
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
||||
|
||||
#### [v0.5.0](https://github.com/h-enk/doks-child-theme/compare/v0.4.3...v0.5.0)
|
||||
|
||||
- feat: update for Doks v0.5.0 [`0df89d5`](https://github.com/h-enk/doks-child-theme/commit/0df89d51fbf706aea17d68d07bcfaeba422a1b60)
|
||||
- content: update content for Doks v0.5.0 [`63d4412`](https://github.com/h-enk/doks-child-theme/commit/63d4412ba65217ca21092565bf3e6bcc2706e575)
|
||||
- meta: update README.md [`5a8fa90`](https://github.com/h-enk/doks-child-theme/commit/5a8fa9081ce203d594c4ad7b5193f87bd51f3d6e)
|
||||
|
||||
#### [v0.4.3](https://github.com/h-enk/doks-child-theme/compare/v0.4.2...v0.4.3)
|
||||
|
||||
> 18 May 2022
|
||||
|
||||
- deps: bump versions to latest [`8ee2cb6`](https://github.com/h-enk/doks-child-theme/commit/8ee2cb6b8f2a7b38562f266c7db9c028a24c4523)
|
||||
- meta: update changelog [`48499b6`](https://github.com/h-enk/doks-child-theme/commit/48499b6e66bf9bf5bc3d27597b2840618882b16b)
|
||||
|
||||
#### [v0.4.2](https://github.com/h-enk/doks-child-theme/compare/v0.4.1...v0.4.2)
|
||||
|
||||
> 1 April 2022
|
||||
|
||||
- deps: bump @hyas/doks from 0.4.1 to 0.4.2 [`eda0e36`](https://github.com/h-enk/doks-child-theme/commit/eda0e360262707c7baa1af2b7d373865d5e534fd)
|
||||
- meta: update changelog [`4e8f1a8`](https://github.com/h-enk/doks-child-theme/commit/4e8f1a8e51292c4010ee48a1f94b22db441d0998)
|
||||
- meta: update sponsors + backers sections [`788e1e3`](https://github.com/h-enk/doks-child-theme/commit/788e1e3ab5b5447b4464018a0959e3cd1338a486)
|
||||
|
||||
#### [v0.4.1](https://github.com/h-enk/doks-child-theme/compare/v0.4.0...v0.4.1)
|
||||
|
||||
> 31 March 2022
|
||||
|
||||
- deps: bump versions to latest [`a85f35d`](https://github.com/h-enk/doks-child-theme/commit/a85f35dc3fe0ca5a3080d4fe7d567f7e8863566e)
|
||||
- ops: add continuous integration + stale workflows [`8134f51`](https://github.com/h-enk/doks-child-theme/commit/8134f518b7873be39ff2cd6eb3472bf681fa3390)
|
||||
- feat: add files for custom scss + js [`12bf689`](https://github.com/h-enk/doks-child-theme/commit/12bf689da853e90ed51f25b8103e7beca68c23b0)
|
||||
|
||||
#### [v0.4.0](https://github.com/h-enk/doks-child-theme/compare/v0.3.5...v0.4.0)
|
||||
|
||||
> 4 February 2022
|
||||
|
||||
- deps: bump versions to latest [`fe5bf72`](https://github.com/h-enk/doks-child-theme/commit/fe5bf729e6e6754f3b6957b5d6c657c84326d070)
|
||||
- fix: comment out mount content [`477ed68`](https://github.com/h-enk/doks-child-theme/commit/477ed686336826296a8b8e83c90af45b7a904bf4)
|
||||
- config: update for doks v0.4.0 [`d00d595`](https://github.com/h-enk/doks-child-theme/commit/d00d595bc6add83780cf577d58099bbcecfbbe40)
|
||||
|
||||
#### [v0.3.5](https://github.com/h-enk/doks-child-theme/compare/v0.3.4...v0.3.5)
|
||||
|
||||
> 5 October 2021
|
||||
|
||||
- chore(deps-dev): bump bootstrap from 5.1.0 to 5.1.1 [`#64`](https://github.com/h-enk/doks-child-theme/pull/64)
|
||||
- chore(deps-dev): bump @babel/preset-env from 7.15.4 to 7.15.6 [`#65`](https://github.com/h-enk/doks-child-theme/pull/65)
|
||||
- chore(deps-dev): bump autoprefixer from 10.3.4 to 10.3.7 [`#71`](https://github.com/h-enk/doks-child-theme/pull/71)
|
||||
- feat: update for doks 0.3.5 [`3782cf5`](https://github.com/h-enk/doks-child-theme/commit/3782cf57ed43acadc426305dc64764048b78138a)
|
||||
- meta: update changelog [`36436ff`](https://github.com/h-enk/doks-child-theme/commit/36436fff6fd1ba412fdc991f4acca35a2835d09c)
|
||||
- meta: bump version doks-child-theme to 0.3.5 [`57eae76`](https://github.com/h-enk/doks-child-theme/commit/57eae76694755ab1b06691a3c5427f224b806661)
|
||||
|
||||
#### [v0.3.4](https://github.com/h-enk/doks-child-theme/compare/v0.3.3...v0.3.4)
|
||||
|
||||
> 7 September 2021
|
||||
|
||||
- feat: update for doks 0.3.4 [`b08cb80`](https://github.com/h-enk/doks-child-theme/commit/b08cb80fadc09f7ad7e7e960d09dc482666fa108)
|
||||
- deps: bump versions to latest [`a790bbe`](https://github.com/h-enk/doks-child-theme/commit/a790bbe7fa9ac52d15270339bf1ec24be385a2a8)
|
||||
- Create FUNDING.yml [`8613d4c`](https://github.com/h-enk/doks-child-theme/commit/8613d4caad869c0f1f80b5610f6e49b766935541)
|
||||
|
||||
#### [v0.3.3](https://github.com/h-enk/doks-child-theme/compare/v0.3.0...v0.3.3)
|
||||
|
||||
> 5 July 2021
|
||||
|
||||
- feat: update for doks v0.3.3 [`f7b5720`](https://github.com/h-enk/doks-child-theme/commit/f7b57204c9de70f14e17337a8baa44815beb2b50)
|
||||
- content: update readme [`14f1a3f`](https://github.com/h-enk/doks-child-theme/commit/14f1a3fede35e7f4a88d8ea063416958c2900a56)
|
||||
- Update for doks v0.3.3 [`babdd77`](https://github.com/h-enk/doks-child-theme/commit/babdd7791e6002fd2272b1bc3c95c58654933454)
|
||||
|
||||
#### [v0.3.0](https://github.com/h-enk/doks-child-theme/compare/v0.2.3...v0.3.0)
|
||||
|
||||
> 25 June 2021
|
||||
|
||||
- feat: update for doks v0.3.0 [`630c2a2`](https://github.com/h-enk/doks-child-theme/commit/630c2a2edd246f3fc26fbb799d2debb77857882c)
|
||||
- fix: add data directory [`69cdc3c`](https://github.com/h-enk/doks-child-theme/commit/69cdc3cccea6a976552e654a86a85475a19ef448)
|
||||
|
||||
#### [v0.2.3](https://github.com/h-enk/doks-child-theme/compare/v0.2.2...v0.2.3)
|
||||
|
||||
> 2 April 2021
|
||||
|
||||
- feat: update for doks v0.2.3 [`e517462`](https://github.com/h-enk/doks-child-theme/commit/e517462127252a50d78cf34180ea10f898993585)
|
||||
- chore(release): 0.2.3 [`1fcbc4e`](https://github.com/h-enk/doks-child-theme/commit/1fcbc4e2cb297f780004582612d904920044b181)
|
||||
|
||||
#### v0.2.2
|
||||
|
||||
> 26 March 2021
|
||||
|
||||
- feat: add doks as a node module [`cfed05e`](https://github.com/h-enk/doks-child-theme/commit/cfed05efaf7b4191b2bdca4c91405c6cabc8396c)
|
||||
- deps: bump versions to latest [`997a7dd`](https://github.com/h-enk/doks-child-theme/commit/997a7dd7250b3dc0fe23c92ebf83ed21c9ba2d6b)
|
||||
- config: update for doks v0.2.2 [`03f51d5`](https://github.com/h-enk/doks-child-theme/commit/03f51d5fd1f66f7afa0957d92adf779d438a3946)
|
||||
|
||||
<!-- auto-changelog-above -->
|
||||
|
||||
### [0.2.3](https://github.com/h-enk/doks/compare/v0.2.2...v0.2.3) (2021-04-02)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* update for doks v0.2.3 ([e517462](https://github.com/h-enk/doks/commit/e517462127252a50d78cf34180ea10f898993585))
|
||||
|
||||
### 0.2.2 (2021-03-26)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add doks as a node module ([cfed05e](https://github.com/h-enk/doks/commit/cfed05efaf7b4191b2bdca4c91405c6cabc8396c))
|
||||
|
||||
|
||||
### Dependencies
|
||||
|
||||
* bump versions to latest ([997a7dd](https://github.com/h-enk/doks/commit/997a7dd7250b3dc0fe23c92ebf83ed21c9ba2d6b))
|
||||
@@ -0,0 +1,76 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, sex characteristics, gender identity and expression,
|
||||
level of experience, education, socio-economic status, nationality, personal
|
||||
appearance, race, religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||
advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. Examples of
|
||||
representing a project or community include using an official project e-mail
|
||||
address, posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event. Representation of a project may be
|
||||
further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project team at hello@getdoks.org. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see
|
||||
https://www.contributor-covenant.org/faq
|
||||
@@ -0,0 +1,22 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018-present, Gridsome
|
||||
Copyright (c) 2020-present, Henk Verlinde
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,156 @@
|
||||
<p align="center">
|
||||
<a href="https://getdoks.org/">
|
||||
<img alt="Doks" src="https://doks.netlify.app/logo-doks.svg" width="60">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<h1 align="center">
|
||||
Doks
|
||||
</h1>
|
||||
|
||||
<h3 align="center">
|
||||
Doks Child Theme
|
||||
</h3>
|
||||
|
||||
<p align="center">
|
||||
Doks is a Hugo theme for building secure, fast, and SEO-ready documentation websites, which you can easily update and customize.
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/h-enk/doks-child-theme/blob/master/LICENSE">
|
||||
<img src="https://img.shields.io/github/license/h-enk/doks-child-theme?style=flat-square" alt="GitHub">
|
||||
</a>
|
||||
<a href="https://github.com/h-enk/doks-child-theme/releases">
|
||||
<img src="https://img.shields.io/github/v/release/h-enk/doks-child-theme?include_prereleases&style=flat-square"alt="GitHub release (latest SemVer including pre-releases)">
|
||||
</a>
|
||||
<a href="https://github.com/h-enk/doks-child-theme/actions/workflows/codeql-analysis.yml">
|
||||
<img src="https://img.shields.io/github/workflow/status/h-enk/doks-child-theme/CodeQL/master?style=flat-square" alt="GitHub Workflow Status (branch)">
|
||||
</a>
|
||||
<a href="https://app.netlify.com/sites/hyas-child-theme/deploys">
|
||||
<img src="https://img.shields.io/netlify/75395a37-8537-4410-a8c3-d56bf27ec963?style=flat-square" alt="Netlify">
|
||||
</a>
|
||||
</p>
|
||||
|
||||

|
||||
|
||||
## Demo
|
||||
|
||||
- [doks-child-theme.netlify.app](https://doks-child-theme.netlify.app/)
|
||||
|
||||
## Why Doks?
|
||||
|
||||
Nine main reasons why you should use Doks:
|
||||
|
||||
1. __Security aware__. Get A+ scores on [Mozilla Observatory](https://observatory.mozilla.org/analyze/doks.netlify.app) out of the box. Easily change the default Security Headers to suit your needs.
|
||||
|
||||
2. __Fast by default__. Get 100 scores on [Google Lighthouse](https://googlechrome.github.io/lighthouse/viewer/?gist=59aafe464a68f8bc30b8e9a636d5b053) by default. Doks removes unused css, prefetches links, and lazy loads images.
|
||||
|
||||
3. __SEO-ready__. Use sensible defaults for structured data, open graph, and Twitter cards. Or easily change the SEO settings to your liking.
|
||||
|
||||
4. __Development tools__. Code with confidence. Check styles, scripts, and markdown for errors and fix automatically or manually.
|
||||
|
||||
5. __Bootstrap framework__. Build robust, flexible, and intuitive websites with Bootstrap 5. Easily customize your Doks site with the source Sass files.
|
||||
|
||||
6. __Netlify-ready__. Deploy to Netlify with sensible defaults. Easily use Netlify Functions, Netlify Redirects, and Netlify Headers.
|
||||
|
||||
7. __Full text search__. Search your Doks site with FlexSearch. Easily customize index settings and search options to your liking.
|
||||
|
||||
8. __Page layouts__. Build pages with a landing page, blog, or documentation layout. Add custom sections and components to suit your needs.
|
||||
|
||||
9. __Dark mode__. Switch to a low-light UI with the click of a button. Change colors with variables to match your branding.
|
||||
|
||||
### Other features
|
||||
|
||||
- __Multilingual and i18n__ support
|
||||
- __Versioning__ documentation support
|
||||
- __KaTeX__ math typesetting
|
||||
- __Mermaid__ diagrams and visualization
|
||||
- __highlight.js__ syntax highlighting
|
||||
|
||||
## Requirements
|
||||
|
||||
- [Git](https://git-scm.com/) — latest source release
|
||||
- [Node.js](https://nodejs.org/) — latest LTS version or newer
|
||||
|
||||
<details>
|
||||
<summary>Why Node.js?</summary>
|
||||
|
||||
Doks uses npm (included with Node.js) to centralize dependency management, making it [easy to update](https://getdoks.org/docs/help/how-to-update/) resources, build tooling, plugins, and build scripts.
|
||||
|
||||
</details>
|
||||
|
||||
## Get started
|
||||
|
||||
Start a new Doks project in three steps:
|
||||
|
||||
### 1. Create a new site
|
||||
|
||||
Doks is available as a child theme and a starter theme.
|
||||
|
||||
#### Child theme
|
||||
|
||||
- Intended for novice to intermediate users
|
||||
- Intended for minor customizations
|
||||
- [Easily update npm packages](https://getdoks.org/docs/help/how-to-update/) — __including__ [Doks](https://www.npmjs.com/package/@hyas/doks)
|
||||
|
||||
```bash
|
||||
git clone https://github.com/h-enk/doks-child-theme.git my-doks-site && cd my-doks-site
|
||||
```
|
||||
|
||||
#### Starter theme
|
||||
|
||||
- Intended for intermediate to advanced users
|
||||
- Intended for major customizations
|
||||
- [Easily update npm packages](https://getdoks.org/docs/help/how-to-update/)
|
||||
|
||||
```bash
|
||||
git clone https://github.com/h-enk/doks.git my-doks-site && cd my-doks-site
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>Help me choose</summary>
|
||||
|
||||
Not sure which one is for you? Pick the child theme.
|
||||
|
||||
</details>
|
||||
|
||||
### 2. Install dependencies
|
||||
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
### 3. Start development server
|
||||
|
||||
```bash
|
||||
npm run start
|
||||
```
|
||||
|
||||
## Other commands
|
||||
|
||||
Doks comes with [commands](https://getdoks.org/docs/prologue/commands/) for common tasks.
|
||||
|
||||
## Documentation
|
||||
|
||||
- [Netlify](https://docs.netlify.com/)
|
||||
- [Hugo](https://gohugo.io/documentation/)
|
||||
- [Doks](https://getdoks.org/)
|
||||
|
||||
## Communities
|
||||
|
||||
- [Netlify Community](https://community.netlify.com/)
|
||||
- [Hugo Forums](https://discourse.gohugo.io/)
|
||||
- [Doks Discussions](https://github.com/h-enk/doks/discussions)
|
||||
|
||||
## Sponsors
|
||||
|
||||
Support this project by becoming a sponsor. Your logo will show up here with a link to your website.
|
||||
|
||||
[](https://opencollective.com/doks/tiers/sponsor/0/website)
|
||||
[](https://opencollective.com/doks/tiers/sponsor/1/website)
|
||||
|
||||
## Backers
|
||||
|
||||
Support this project by becoming a backer. Your avatar will show up here.
|
||||
|
||||
[](https://opencollective.com/doks)
|
||||
@@ -0,0 +1,7 @@
|
||||
# Reporting Security Issues
|
||||
|
||||
The Doks team and community take security issues in Doks seriously. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions.
|
||||
|
||||
To report a security issue, email [security@getdoks.org](mailto:security@getdoks.org) and include the word "SECURITY" in the subject line.
|
||||
|
||||
We'll endeavor to respond quickly, and will keep you updated throughout the process.
|
||||
|
After Width: | Height: | Size: 4.6 KiB |
@@ -0,0 +1 @@
|
||||
/** Custom scripts */
|
||||
@@ -0,0 +1,38 @@
|
||||
/** Import Bootstrap functions */
|
||||
@import "bootstrap/scss/functions";
|
||||
|
||||
/** Import theme variables */
|
||||
@import "common/variables";
|
||||
|
||||
/** Import Bootstrap */
|
||||
@import "bootstrap/scss/bootstrap";
|
||||
|
||||
/** Import highlight.js */
|
||||
// @import "highlight.js/scss/github-dark-dimmed";
|
||||
|
||||
/** Import KaTeX */
|
||||
@import "katex/dist/katex";
|
||||
|
||||
/** Import theme styles */
|
||||
@import "common/fonts";
|
||||
@import "common/global";
|
||||
@import "common/dark";
|
||||
@import "components/alerts";
|
||||
@import "components/buttons";
|
||||
@import "components/code";
|
||||
@import "components/details";
|
||||
@import "components/syntax";
|
||||
@import "components/comments";
|
||||
@import "components/forms";
|
||||
@import "components/images";
|
||||
@import "components/mermaid";
|
||||
@import "components/search";
|
||||
@import "components/tables";
|
||||
@import "layouts/footer";
|
||||
@import "layouts/header";
|
||||
@import "layouts/pages";
|
||||
@import "layouts/posts";
|
||||
@import "layouts/sidebar";
|
||||
|
||||
/** Import custom styles */
|
||||
@import "common/custom";
|
||||
@@ -0,0 +1 @@
|
||||
/** Custom styles */
|
||||
@@ -0,0 +1,17 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
[
|
||||
'@babel/preset-env',
|
||||
{
|
||||
targets: {
|
||||
browsers: [
|
||||
// Best practice: https://github.com/babel/babel/issues/7789
|
||||
'>=1%',
|
||||
'not ie 11',
|
||||
'not op_mini all'
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
};
|
||||
@@ -0,0 +1,83 @@
|
||||
baseurl = "https://waha.devlike.pro/"
|
||||
canonifyURLs = false
|
||||
disableAliases = true
|
||||
disableHugoGeneratorInject = true
|
||||
enableEmoji = true
|
||||
enableGitInfo = false
|
||||
enableRobotsTXT = true
|
||||
paginate = 7
|
||||
rssLimit = 10
|
||||
|
||||
# Multilingual
|
||||
defaultContentLanguage = "en"
|
||||
disableLanguages = ["de", "nl"]
|
||||
# defaultContentLanguageInSubdir = true
|
||||
|
||||
# add redirects/headers
|
||||
[outputs]
|
||||
home = ["HTML", "RSS", "REDIRECTS", "HEADERS"]
|
||||
section = ["HTML", "RSS", "SITEMAP"]
|
||||
|
||||
# remove .{ext} from text/netlify
|
||||
[mediaTypes."text/netlify"]
|
||||
suffixes = [""]
|
||||
delimiter = ""
|
||||
|
||||
# add output format for netlify _redirects
|
||||
[outputFormats.REDIRECTS]
|
||||
mediaType = "text/netlify"
|
||||
baseName = "_redirects"
|
||||
isPlainText = true
|
||||
notAlternative = true
|
||||
|
||||
# add output format for netlify _headers
|
||||
[outputFormats.HEADERS]
|
||||
mediaType = "text/netlify"
|
||||
baseName = "_headers"
|
||||
isPlainText = true
|
||||
notAlternative = true
|
||||
|
||||
# add output format for section sitemap.xml
|
||||
[outputFormats.SITEMAP]
|
||||
mediaType = "application/xml"
|
||||
baseName = "sitemap"
|
||||
isHTML = false
|
||||
isPlainText = true
|
||||
noUgly = true
|
||||
rel = "sitemap"
|
||||
|
||||
[caches]
|
||||
[caches.getjson]
|
||||
dir = ":cacheDir/:project"
|
||||
maxAge = "10s"
|
||||
|
||||
[sitemap]
|
||||
changefreq = "weekly"
|
||||
filename = "sitemap.xml"
|
||||
priority = 0.5
|
||||
|
||||
[taxonomies]
|
||||
contributor = "contributors"
|
||||
category = "categories"
|
||||
tag = "tags"
|
||||
|
||||
[permalinks]
|
||||
blog = "/blog/:title/"
|
||||
# docs = "/docs/1.0/:sections[1:]/:title/"
|
||||
|
||||
[minify.tdewolff.html]
|
||||
keepWhitespace = false
|
||||
|
||||
[related]
|
||||
threshold = 80
|
||||
includeNewer = true
|
||||
toLower = false
|
||||
[[related.indices]]
|
||||
name = "categories"
|
||||
weight = 100
|
||||
[[related.indices]]
|
||||
name = "tags"
|
||||
weight = 80
|
||||
[[related.indices]]
|
||||
name = "date"
|
||||
weight = 10
|
||||
@@ -0,0 +1,28 @@
|
||||
[en]
|
||||
languageName = "English"
|
||||
contentDir = "content/en"
|
||||
weight = 10
|
||||
[en.params]
|
||||
languageISO = "EN"
|
||||
languageTag = "en-US"
|
||||
|
||||
[de]
|
||||
languageName = "German"
|
||||
contentDir = "content/de"
|
||||
weight = 15
|
||||
[de.params]
|
||||
languageISO = "DE"
|
||||
languageTag = "de-DE"
|
||||
|
||||
[nl]
|
||||
languageName = "Nederlands"
|
||||
contentDir = "content/nl"
|
||||
weight = 20
|
||||
[nl.params]
|
||||
languageISO = "NL"
|
||||
languageTag = "nl-NL"
|
||||
titleAddition = "Modern documentatie-thema"
|
||||
description = "Doks is een Hugo-thema waarmee je moderne documentatie-websites kunt bouwen die veilig, snel en klaar voor SEO zijn — standaard."
|
||||
titleHome = "Doks thema"
|
||||
footer = "Mogelijk gemaakt door <a href=\"https://www.netlify.com/\">Netlify</a>, <a href=\"https://gohugo.io/\">Hugo</a>, en <a href=\"https://getdoks.org/\">Doks</a>"
|
||||
alertText = "Introductie van het Doks-kinderthema, verschillende DX + UX-updates en meer! <a class=\"alert-link stretched-link\" href=\"https://getdoks.org/blog/doks-v0.2/\">Bekijk Doks v0.2</a>"
|
||||
@@ -0,0 +1,29 @@
|
||||
defaultMarkdownHandler = "goldmark"
|
||||
|
||||
[goldmark]
|
||||
[goldmark.extensions]
|
||||
linkify = false
|
||||
[goldmark.parser]
|
||||
autoHeadingID = true
|
||||
autoHeadingIDType = "github"
|
||||
[goldmark.parser.attribute]
|
||||
block = true
|
||||
title = true
|
||||
[goldmark.renderer]
|
||||
unsafe = true
|
||||
|
||||
[highlight]
|
||||
codeFences = false
|
||||
guessSyntax = false
|
||||
hl_Lines = ""
|
||||
lineNoStart = 1
|
||||
lineNos = false
|
||||
lineNumbersInTable = true
|
||||
noClasses = false
|
||||
style = "dracula"
|
||||
tabWidth = 4
|
||||
|
||||
[tableOfContents]
|
||||
endLevel = 3
|
||||
ordered = false
|
||||
startLevel = 2
|
||||
@@ -0,0 +1,75 @@
|
||||
[[docs]]
|
||||
name = "Overview"
|
||||
weight = 10
|
||||
identifier = "overview"
|
||||
url = "/docs/overview/"
|
||||
|
||||
[[docs]]
|
||||
name = "Help"
|
||||
weight = 60
|
||||
identifier = "help"
|
||||
url = "/docs/help/"
|
||||
|
||||
# [[docs]]
|
||||
# name = "Lorem"
|
||||
# weight = 70
|
||||
# identifier = "lorem"
|
||||
# url = "/docs/lorem/"
|
||||
|
||||
|
||||
[[main]]
|
||||
name = "Documentation"
|
||||
url = "/docs/overview/introduction/"
|
||||
# url = "/docs/1.0/overview/introduction/"
|
||||
weight = 10
|
||||
|
||||
#[[main]]
|
||||
# name = "Blog"
|
||||
# url = "/blog/"
|
||||
# weight = 20
|
||||
|
||||
[[main]]
|
||||
name = "Get Plus"
|
||||
weight = 30
|
||||
identifier = "get-plus"
|
||||
url = ""
|
||||
|
||||
|
||||
[[main]]
|
||||
name = "About WAHA Plus"
|
||||
weight = 40
|
||||
identifier = "plus-version"
|
||||
url = "/docs/how-to/plus-version"
|
||||
parent = "get-plus"
|
||||
|
||||
[[main]]
|
||||
name = "Get on Boosty ->"
|
||||
weight = 50
|
||||
identifier = "boosty"
|
||||
url = "https://boosty.to/wa-http-api"
|
||||
parent = "get-plus"
|
||||
|
||||
[[main]]
|
||||
name = "Get on Patreon ->"
|
||||
weight = 60
|
||||
identifier = "patreon"
|
||||
url = "https://patreon.com/wa_http_api"
|
||||
parent = "get-plus"
|
||||
|
||||
[[social]]
|
||||
name = "GitHub"
|
||||
pre = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-github\"><path d=\"M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22\"></path></svg>"
|
||||
url = "https://github.com/devlikeapro/whatsapp-http-api"
|
||||
post = "v0.1.0"
|
||||
weight = 10
|
||||
|
||||
#[[social]]
|
||||
# name = "Twitter"
|
||||
# pre = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-twitter\"><path d=\"M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z\"></path></svg>"
|
||||
# url = "https://twitter.com/getdoks"
|
||||
# weight = 20
|
||||
|
||||
# [[footer]]
|
||||
# name = "Privacy"
|
||||
# url = "/privacy-policy/"
|
||||
# weight = 10
|
||||
@@ -0,0 +1,39 @@
|
||||
[[docs]]
|
||||
name = "Overview"
|
||||
weight = 10
|
||||
identifier = "overview"
|
||||
url = "/docs/overview/"
|
||||
|
||||
[[docs]]
|
||||
name = "Help"
|
||||
weight = 60
|
||||
identifier = "help"
|
||||
url = "/docs/help/"
|
||||
|
||||
[[main]]
|
||||
name = "Docs"
|
||||
url = "/docs/overview/introduction/"
|
||||
weight = 10
|
||||
|
||||
# [[main]]
|
||||
# name = "Blog"
|
||||
# url = "/blog/"
|
||||
# weight = 20
|
||||
|
||||
[[social]]
|
||||
name = "GitHub"
|
||||
pre = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-github\"><path d=\"M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22\"></path></svg>"
|
||||
url = "https://github.com/h-enk/doks"
|
||||
post = "v0.1.0"
|
||||
weight = 10
|
||||
|
||||
[[social]]
|
||||
name = "Twitter"
|
||||
pre = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-twitter\"><path d=\"M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z\"></path></svg>"
|
||||
url = "https://twitter.com/getdoks"
|
||||
weight = 20
|
||||
|
||||
# [[footer]]
|
||||
# name = "Privacy"
|
||||
# url = "/privacy-policy/"
|
||||
# weight = 10
|
||||
@@ -0,0 +1,68 @@
|
||||
[hugoVersion]
|
||||
extended = true
|
||||
min = "0.80.0"
|
||||
max = ""
|
||||
|
||||
[[mounts]]
|
||||
source = "node_modules/@hyas/doks/archetypes"
|
||||
target = "archetypes"
|
||||
|
||||
[[mounts]]
|
||||
source = "node_modules/@hyas/doks/assets"
|
||||
target = "assets"
|
||||
|
||||
# [[mounts]]
|
||||
# source = "node_modules/@hyas/doks/content"
|
||||
# target = "content"
|
||||
|
||||
[[mounts]]
|
||||
source = "node_modules/@hyas/doks/data"
|
||||
target = "data"
|
||||
|
||||
[[mounts]]
|
||||
source = "node_modules/@hyas/doks/layouts"
|
||||
target = "layouts"
|
||||
|
||||
[[mounts]]
|
||||
source = "node_modules/@hyas/doks/static"
|
||||
target = "static"
|
||||
|
||||
[[mounts]]
|
||||
source = "node_modules/flexsearch"
|
||||
target = "assets/js/vendor/flexsearch"
|
||||
|
||||
[[mounts]]
|
||||
source = "node_modules/katex"
|
||||
target = "assets/js/vendor/katex"
|
||||
|
||||
[[mounts]]
|
||||
source = "node_modules/mermaid"
|
||||
target = "assets/js/vendor/mermaid"
|
||||
|
||||
[[mounts]]
|
||||
source = "assets"
|
||||
target = "assets"
|
||||
|
||||
[[mounts]]
|
||||
source = "static"
|
||||
target = "static"
|
||||
|
||||
# [[mounts]]
|
||||
# source = "content"
|
||||
# target = "content"
|
||||
|
||||
[[mounts]]
|
||||
source = "layouts"
|
||||
target = "layouts"
|
||||
|
||||
[[mounts]]
|
||||
source = "archetypes"
|
||||
target = "archetypes"
|
||||
|
||||
[[mounts]]
|
||||
source = "data"
|
||||
target = "data"
|
||||
|
||||
[[mounts]]
|
||||
source = "node_modules/@hyas/images/layouts"
|
||||
target = "layouts"
|
||||
@@ -0,0 +1,114 @@
|
||||
# Meta Data for SEO
|
||||
|
||||
## Homepage
|
||||
title = "WAHA"
|
||||
titleSeparator = "-"
|
||||
titleAddition = "WhatsApp HTTP API"
|
||||
description = "WAHA - WhatsApp HTTP API that you can configure in a click!"
|
||||
|
||||
## Documentation
|
||||
# docsVersion = "0.3"
|
||||
|
||||
## Open Graph
|
||||
images = ["/images/logo.png"]
|
||||
ogLocale = "en_US"
|
||||
domainTLD = "waha.devlike.pro"
|
||||
titleHome = "WAHA"
|
||||
|
||||
## Twitter Cards
|
||||
#twitterSite = "@getdoks"
|
||||
#twitterCreator = "@henkverlinde"
|
||||
|
||||
## JSON-LD
|
||||
# schemaType = "Person"
|
||||
#schemaType = "Organization"
|
||||
#schemaName = "Doks"
|
||||
#schemaAuthor = "Henk Verlinde"
|
||||
#schemaAuthorTwitter = "https://twitter.com/henkverlinde"
|
||||
#schemaAuthorLinkedIn = "https://www.linkedin.com/in/henkverlinde/"
|
||||
#schemaAuthorGitHub = "https://github.com/h-enk"
|
||||
#schemaLocale = "en-US"
|
||||
#schemaLogo = "logo-doks.png"
|
||||
#schemaLogoWidth = 512
|
||||
#schemaLogoHeight = 512
|
||||
#schemaImage = "doks.png"
|
||||
#schemaImageWidth = 1280
|
||||
#schemaImageHeight = 640
|
||||
#schemaTwitter = "https://twitter.com/getdoks"
|
||||
#schemaLinkedIn = ""
|
||||
#schemaGitHub = "https://github.com/h-enk/doks"
|
||||
#schemaSection = "blog"
|
||||
|
||||
## Sitelinks Search Box
|
||||
siteLinksSearchBox = false
|
||||
|
||||
## Chrome Browser
|
||||
themeColor = "#fff"
|
||||
|
||||
# Images - Temporarily left in place for backward compatibility
|
||||
quality = 85
|
||||
bgColor = "#fff"
|
||||
landscapePhotoWidths = [900, 800, 700, 600, 500]
|
||||
portraitPhotoWidths = [800, 700, 600, 500]
|
||||
lqipWidth = "20x"
|
||||
smallLimit = "300"
|
||||
|
||||
# Images
|
||||
imageResponsive = true
|
||||
imageConvertTo = "webp"
|
||||
imageImageSizes = ["480","720","1080","1280","1600","2048"]
|
||||
singleSize = false
|
||||
imageAddClass = "img-fluid lazyload blur-up"
|
||||
|
||||
### Image template
|
||||
defaultImage = "default-image.png" # put in `./assets/images/`
|
||||
fillImage = "1270x740 Center" # normalize image size
|
||||
|
||||
# Footer
|
||||
footer = 'This project is not affiliated, associated, authorized, endorsed by, or in any way officially connected with WhatsApp or any of its subsidiaries or its affiliates.<br/>The official WhatsApp website can be found at <a class="text-muted" href="https://whatsapp.com/">https://whatsapp.com/</a>.<br/>"WhatsApp" as well as related names, marks, emblems and images are registered trademarks of their respective owners.'
|
||||
|
||||
# Feed
|
||||
copyRight = "Copyright (c) 2021-2023 Dev Like A Pro"
|
||||
|
||||
# Alert
|
||||
alert = true
|
||||
alertDismissable = false
|
||||
# alertText = "Introducing the Doks child theme, several DX + UX updates, and more! <a class=\"alert-link stretched-link\" href=\"https://getdoks.org/blog/doks-v0.2/\" target=\"_blank\" rel=\"noopener\">Check out Doks v0.2</a>"
|
||||
alertText = "Enjoy Core version or want to get WAHA Plus verison? You can <a class=\"alert-link stretched-link\" href=\"https://waha.devlike.pro/docs/how-to/plus-version/\">support the project -></a>"
|
||||
|
||||
# Edit Page
|
||||
# repoHost [Github | Gitea | GitLab | Bitbucket | BitbucketServer ] is used for building the edit link based on git hoster
|
||||
repoHost = "GitHub"
|
||||
#repoHost = "Gitea"
|
||||
docsRepo = "https://github.com/devlikeapro/whatsapp-http-api"
|
||||
docsRepoBranch = "core"
|
||||
docsRepoSubPath = ""
|
||||
editPage = false
|
||||
lastMod = false
|
||||
|
||||
[sections]
|
||||
sectionNav = ["docs", "guides"]
|
||||
|
||||
[options]
|
||||
lazySizes = true
|
||||
clipBoard = true
|
||||
instantPage = true
|
||||
flexSearch = true
|
||||
searchSectionsShow = []
|
||||
searchSectionsIndex = []
|
||||
darkMode = true
|
||||
bootStrapJs = true
|
||||
breadCrumb = false
|
||||
highLight = true
|
||||
kaTex = false
|
||||
multilingualMode = false
|
||||
docsVersioning = false
|
||||
fullWidth = false
|
||||
navbarSticky = true
|
||||
toTopButton = false
|
||||
scrollSpy = false # experimental; needs Bootstrap >= 5.2.0-beta1
|
||||
|
||||
[menu]
|
||||
[menu.section]
|
||||
auto = true
|
||||
collapsibleSidebar = true
|
||||
@@ -0,0 +1 @@
|
||||
canonifyURLs = false
|
||||
@@ -0,0 +1,40 @@
|
||||
const autoprefixer = require('autoprefixer');
|
||||
const purgecss = require('@fullhuman/postcss-purgecss');
|
||||
const whitelister = require('purgecss-whitelister');
|
||||
|
||||
module.exports = {
|
||||
plugins: [
|
||||
autoprefixer(),
|
||||
purgecss({
|
||||
content: [
|
||||
'./node_modules/@hyas/doks/layouts/**/*.html',
|
||||
'./node_modules/@hyas/doks/content/**/*.md',
|
||||
'./layouts/**/*.html',
|
||||
'./content/**/*.md',
|
||||
],
|
||||
safelist: [
|
||||
'lazyloaded',
|
||||
'table',
|
||||
'thead',
|
||||
'tbody',
|
||||
'tr',
|
||||
'th',
|
||||
'td',
|
||||
'h5',
|
||||
'alert-link',
|
||||
'container-xxl',
|
||||
'container-fluid',
|
||||
...whitelister([
|
||||
'./node_modules/@hyas/doks/assets/scss/common/_variables.scss',
|
||||
'./node_modules/@hyas/doks/assets/scss/components/_alerts.scss',
|
||||
'./node_modules/@hyas/doks/assets/scss/components/_buttons.scss',
|
||||
'./node_modules/@hyas/doks/assets/scss/components/_code.scss',
|
||||
'./node_modules/@hyas/doks/assets/scss/components/_syntax.scss',
|
||||
'./node_modules/@hyas/doks/assets/scss/components/_search.scss',
|
||||
'./node_modules/@hyas/doks/assets/scss/common/_dark.scss',
|
||||
'./node_modules/katex/dist/katex.css',
|
||||
]),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
canonifyURLs = false
|
||||
@@ -0,0 +1,9 @@
|
||||
---
|
||||
title : "WAHA"
|
||||
description: "WAHA - WhatsApp HTTP API that you can configure in a click!"
|
||||
lead: "WAHA - WhatsApp HTTP API that you can configure in a click!"
|
||||
date: 2020-10-06T08:47:36+00:00
|
||||
lastmod: 2020-10-06T08:47:36+00:00
|
||||
draft: false
|
||||
images: []
|
||||
---
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: "Blog"
|
||||
description: "The Doks Blog."
|
||||
date: 2020-10-06T08:49:55+00:00
|
||||
lastmod: 2020-10-06T08:49:55+00:00
|
||||
draft: false
|
||||
images: []
|
||||
---
|
||||
@@ -0,0 +1,17 @@
|
||||
---
|
||||
title: "Say hello to Doks 👋"
|
||||
description: "Introducing Doks, a Hugo theme helping you build modern documentation websites that are secure, fast, and SEO-ready — by default."
|
||||
excerpt: "Introducing Doks, a Hugo theme helping you build modern documentation websites that are secure, fast, and SEO-ready — by default."
|
||||
date: 2020-11-04T09:19:42+01:00
|
||||
lastmod: 2020-11-04T09:19:42+01:00
|
||||
draft: false
|
||||
weight: 50
|
||||
images: []
|
||||
categories: ["News"]
|
||||
tags: ["security", "performance", "SEO"]
|
||||
contributors: ["Henk Verlinde"]
|
||||
pinned: false
|
||||
homepage: false
|
||||
---
|
||||
|
||||
Introducing Doks, a Hugo theme helping you build modern documentation websites that are secure, fast, and SEO-ready — by default.
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: "Contact"
|
||||
description: "Drop us an email."
|
||||
date: 2020-08-27T19:25:12+02:00
|
||||
lastmod: 2020-08-27T19:25:12+02:00
|
||||
draft: true
|
||||
images: []
|
||||
---
|
||||
|
||||
{{< email user="hello" domain="getdoks.org" >}}
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: "Contributors"
|
||||
description: "The Doks contributors."
|
||||
date: 2020-10-06T08:50:29+00:00
|
||||
lastmod: 2020-10-06T08:50:29+00:00
|
||||
draft: false
|
||||
images: []
|
||||
---
|
||||
|
||||
The Doks contributors.
|
||||
@@ -0,0 +1,12 @@
|
||||
---
|
||||
title: "Henk Verlinde"
|
||||
description: "Creator of Hyas."
|
||||
date: 2020-10-06T08:50:45+00:00
|
||||
lastmod: 2020-10-06T08:50:45+00:00
|
||||
draft: false
|
||||
images: []
|
||||
---
|
||||
|
||||
Creator of Hyas.
|
||||
|
||||
[@HenkVerlinde](https://twitter.com/henkverlinde)
|
||||
@@ -0,0 +1,9 @@
|
||||
---
|
||||
title : "Docs"
|
||||
description: "Docs Doks."
|
||||
lead: ""
|
||||
date: 2020-10-06T08:48:23+00:00
|
||||
lastmod: 2020-10-06T08:48:23+00:00
|
||||
draft: false
|
||||
images: []
|
||||
---
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: "Examples"
|
||||
description: "Examples for different languages."
|
||||
lead: "Examples for different languages."
|
||||
date: 2020-10-06T08:49:15+00:00
|
||||
lastmod: 2020-10-06T08:49:15+00:00
|
||||
draft: false
|
||||
images: []
|
||||
weight: 900
|
||||
---
|
||||
@@ -0,0 +1,18 @@
|
||||
---
|
||||
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,10 @@
|
||||
---
|
||||
title: "Help"
|
||||
description: "Help Doks."
|
||||
lead: ""
|
||||
date: 2020-10-06T08:49:15+00:00
|
||||
lastmod: 2020-10-06T08:49:15+00:00
|
||||
draft: false
|
||||
images: []
|
||||
weight: 800
|
||||
---
|
||||
@@ -0,0 +1,77 @@
|
||||
---
|
||||
title: "Changelog"
|
||||
description: "WAHA's changelog"
|
||||
lead: "Changelog"
|
||||
date: 2020-10-06T08:49:31+00:00
|
||||
lastmod: 2020-10-06T08:49:31+00:00
|
||||
draft: false
|
||||
images: []
|
||||
menu:
|
||||
docs:
|
||||
parent: "help"
|
||||
weight: 600
|
||||
toc: true
|
||||
---
|
||||
## 2021.3
|
||||
- Add [Groups API]({{< relref "/docs/how-to/groups" >}})
|
||||
- Use Chromium by default instead of Chrome
|
||||
|
||||
## 2021.1
|
||||
- Added [Contacts API]({{< relref "/docs/how-to/contacts" >}})
|
||||
- Get all contacts
|
||||
- Get a contact
|
||||
- Get contact "about" (status)
|
||||
- Get contact profile picture
|
||||
- Check number exists (is registered in WhatsApp) - works even if the number is not in the contact list
|
||||
- Block and unblock contact
|
||||
|
||||
## 2022.12
|
||||
- Added `GET /messages/` endpoint to get chat messages [#31](https://github.com/devlikeapro/whatsapp-http-api/issues/31)
|
||||
|
||||
### Security 
|
||||
- Added `WHATSAPP_SWAGGER_USERNAME` and `WHATSAPP_SWAGGER_PASSWORD` to hide and protect swagger panel.
|
||||
|
||||
## 2022.11
|
||||
**Please test changes in test environment before update production!!**
|
||||
|
||||
### Engine 
|
||||
1. WAHA has changed its underlying engine from Venom to Whatsapp Web.JS. It might change the response and webhook's payloads.
|
||||
2. Optimize CPU and memory consumption.
|
||||
|
||||
|
||||
### Requests 
|
||||
- For all `/api/session/` requests use `name` field instead of `sessionName`.
|
||||
- For all "chatting" requests use `session` field instead of `sessionName`.
|
||||
|
||||
### Sessions 
|
||||
Now you don't have to scan QR code each time you run WAHA, WAHA saves it for you! Available only in Plus version.
|
||||
|
||||
### Authentication 
|
||||
Now you can authenticate all requests for WAHA - use `WHATSAPP_API_KEY=secret` environment variable to set "secret key".
|
||||
|
||||
If `WHATSAPP_API_KEY` is set - requests must have `X-Api-Key` header with `secret` value, where `secret` - any random secret key.
|
||||
|
||||
### Webhooks 
|
||||
#### Configuration
|
||||
|
||||
Instead of setting each webhook via environment variables - we use two environments variables:
|
||||
|
||||
- `WHATSAPP_HOOK_URL` - to set a URL
|
||||
- `WHATSAPP_HOOK_EVENTS` - to set events that are sent to the URL
|
||||
|
||||
| Previous | Current |
|
||||
|----------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|
|
||||
| <pre>WHATSAPP_HOOK_ONMESSAGE=https://httpbin.org/post <br>WHATSAPP_HOOK_ONANYMESSAGE=https://httpbin.org/post </pre> | <pre>WHATSAPP_HOOK_URL=https://httpbin.org/post <br>WHATSAPP_HOOK_EVENTS=message,message.any</pre> |
|
||||
|
||||
#### Payload
|
||||
|
||||
The data for webhooks are wrapped inside a new `WAWebhook` object with `event` and `payload` fields to help you identify
|
||||
which handler you should call based on `event`.
|
||||
|
||||
```json
|
||||
{
|
||||
"event": "message.any",
|
||||
"payload": {
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
title: "FAQ"
|
||||
description: "Answers to frequently asked questions."
|
||||
lead: "Answers to frequently asked questions."
|
||||
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
|
||||
---
|
||||
|
||||
## How much CPU and Memory does WhatsApp HTTP API consume?
|
||||
The benchmark has been made on **Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz**.
|
||||
It may differ from case to case, it depends on usage pattern - how many messages you get, how many send, etc.
|
||||
|
||||
| Accounts (sessions) in the container | CPU | Memory |
|
||||
|--------------------------------------|------|--------|
|
||||
| 1 | 30% | 400MB |
|
||||
| 10 | 270% | 1.5GB |
|
||||
|
||||
|
||||
The nature of WhatsApp HTTP API and its underlying engines - is to run **real** WhatsApp Web version in Chrome and
|
||||
communicate with it to prevent blocking from WhatsApp. It's the reason why it's so demanding on resources.
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: "How to Update"
|
||||
description: "Regularly update the installed WAHA to keep your bot stable, usable, and secure."
|
||||
lead: "Regularly update the installed WAHA to keep your bot stable, usable, and secure."
|
||||
date: 2020-11-12T13:26:54+01:00
|
||||
lastmod: 2020-11-12T13:26:54+01:00
|
||||
draft: false
|
||||
images: []
|
||||
menu:
|
||||
docs:
|
||||
parent: "help"
|
||||
weight: 610
|
||||
toc: true
|
||||
---
|
||||
|
||||
{{< alert icon="💡" text="Please test all new versions in the development environment before updating production!" />}}
|
||||
|
||||
## Core
|
||||
 For Core version the command is
|
||||
|
||||
```bash
|
||||
docker pull devlikeapro/whatsapp-http-api
|
||||
```
|
||||
|
||||
## Plus
|
||||
 For Plus version, we use login to get the image before:
|
||||
|
||||
```bash
|
||||
docker login -u devlikeapro -p {PASSWORD}
|
||||
docker pull devlikeapro/whatsapp-http-api-plus
|
||||
docker logout
|
||||
```
|
||||
|
||||
Read more about how to get `PASSWORD` for [Plus Version →]({{< relref "plus-version" >}})
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: "How-to guides"
|
||||
description: "How-to guides"
|
||||
lead: ""
|
||||
date: 2020-10-06T08:49:15+00:00
|
||||
lastmod: 2020-10-06T08:49:15+00:00
|
||||
draft: false
|
||||
images: []
|
||||
weight: 200
|
||||
---
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
title : "Configuration"
|
||||
description: "Configuration"
|
||||
lead: ""
|
||||
date: 2020-10-06T08:48:45+00:00
|
||||
lastmod: 2020-10-06T08:48:45+00:00
|
||||
draft: false
|
||||
images: []
|
||||
weight: 800
|
||||
---
|
||||
You can configure WhatsApp HTTP API behaviour via environment variables, by adding `-e WHATSAPP_VARNAME=value` at the
|
||||
begging of the command line or by using [other options](https://docs.docker.com/engine/reference/commandline/run/)
|
||||
|
||||
```bash
|
||||
docker run -it -e "WHATSAPP_HOOK_EVENTS=*" -e WHATSAPP_HOOK_URL=https://httpbin.org/post devlikeapro/whatsapp-http-api
|
||||
```
|
||||
|
||||
## Environment variables
|
||||
|
||||
- `DEBUG=1` - show debug and verbose logs, set in any value
|
||||
- `WHATSAPP_API_PORT=3000` - listen port for HTTP server (default: `3000`)
|
||||
- `WHATSAPP_API_HOSTNAME=localhost` - Hostname for HTTP server (default: `localhost`)
|
||||
- `WHATSAPP_API_KEY=mysecret` - protect the api with a secret code. If you set it - add `X-Api-Key: mysecret` to all
|
||||
requests.
|
||||
- `WHATSAPP_SWAGGER_USERNAME=admin` + `WHATSAPP_SWAGGER_PASSWORD=admin` - protect the Swagger panel with `admin / admin`
|
||||
credentials. It doesn't affect api access!
|
||||
- `WHATSAPP_START_SESSION=default` - start session with the name right after launching the app
|
||||
|
||||
## File storage 
|
||||
|
||||
- `WHATSAPP_FILES_MIMETYPES` - download only these mimetypes from messages (download all files be default). Mimetypes
|
||||
must be separated by a comma, without spaces: `audio,image/png,image/gif`. In order to choose type use prefix (
|
||||
like `audio,image`).
|
||||
- `WHATSAPP_FILES_LIFETIME`- to keep free space files will be removed after this time (default: `180`, in seconds)
|
||||
- `WHATSAPP_FILES_FOLDER` - folder where will be stored files from chats (images, voice messages) (
|
||||
default: `/tmp/whatsapp-files`)
|
||||
|
||||
## Engines
|
||||
|
||||
Under the hood **WAHA** allows you to use two different engines. You can control what you want to run by settings
|
||||
`WHATSAPP_DEFAULT_ENGINE` environment variables.
|
||||
|
||||
If you have any problems with one engine - try another!
|
||||
|
||||
{{< alert icon="👉" text="API responses and webhook payloads may differ significantly! We do our best to keep requests body stable between engines." />}}
|
||||
|
||||
### WhatsApp WebJS 
|
||||
|
||||
**WAHA** uses **WhatsApp WebJS** engine by default
|
||||
|
||||
- https://github.com/pedroslopez/whatsapp-web.js
|
||||
- `WHATSAPP_DEFAULT_ENGINE=WEBJS`
|
||||
|
||||
### Venom 
|
||||
|
||||
- https://github.com/orkestral/venom
|
||||
- `WHATSAPP_DEFAULT_ENGINE=VENOM`
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
---
|
||||
title : "Contacts"
|
||||
description: "Contacts"
|
||||
lead: ""
|
||||
date: 2020-10-06T08:48:45+00:00
|
||||
lastmod: 2020-10-06T08:48:45+00:00
|
||||
draft: false
|
||||
images: []
|
||||
weight: 130
|
||||
---
|
||||
|
||||
Methods for contacts.
|
||||
|
||||
{{< alert icon="👉" text="WhatsApp Web does not support adding contacts, so the API doesn't support it too." />}}
|
||||
|
||||
## Get all contacts
|
||||
|
||||
Get your contacts - `GET /api/contacts/all`
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": "11231231231@c.us",
|
||||
"number": "11231231231",
|
||||
"name": "Contact Name",
|
||||
"pushname": "Pushname",
|
||||
"shortName": "Shortname",
|
||||
"isMe": true,
|
||||
"isGroup": false,
|
||||
"isWAContact": true,
|
||||
"isMyContact": true,
|
||||
"isBlocked": false
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
## Get contact
|
||||
|
||||
Get contact
|
||||
|
||||
- `GET /api/contacts?contactId=11231231231&session=default`
|
||||
- `GET /api/contacts?contactId=11231231231@c.us&session=default`
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "11231231231@c.us",
|
||||
"number": "11231231231",
|
||||
"name": "Contact Name",
|
||||
"pushname": "Pushname",
|
||||
"shortName": "Shortname",
|
||||
"isMe": true,
|
||||
"isGroup": false,
|
||||
"isWAContact": true,
|
||||
"isMyContact": true,
|
||||
"isBlocked": false
|
||||
}
|
||||
```
|
||||
|
||||
## Check phone number exists
|
||||
|
||||
If you want to check if phone number is registered in WhatsApp (even if the number is not in your contact list) - use
|
||||
this endpoint for that.
|
||||
- `GET /api/contacts/check-exists?phone=11231231231&session=default`
|
||||
|
||||
```json
|
||||
{
|
||||
"numberExists": true
|
||||
}
|
||||
```
|
||||
|
||||
## Get "about" contact
|
||||
|
||||
- `GET /api/contacts/about?contactId=11231231231&session=default`
|
||||
|
||||
```json
|
||||
{
|
||||
"about": "Hi, I use WhatsApp!"
|
||||
}
|
||||
```
|
||||
|
||||
## Get contact profile picture
|
||||
|
||||
- `GET /api/contacts/profile-picture?contactId=11231231231&session=default`
|
||||
|
||||
```json
|
||||
{
|
||||
"profilePictureURL": "https://example.com/profile.jpg"
|
||||
}
|
||||
```
|
||||
|
||||
## Block (unblock) contact
|
||||
- To block contact - `POST /api/contacts/block`
|
||||
- To unblock contact - `POST /api/contacts/unblock`
|
||||
|
||||
Request:
|
||||
```json
|
||||
{
|
||||
"contactId": "11231231231",
|
||||
"session": "default"
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,168 @@
|
||||
---
|
||||
title : "Groups"
|
||||
description: "Groups"
|
||||
lead: ""
|
||||
date: 2020-10-06T08:48:45+00:00
|
||||
lastmod: 2020-10-06T08:48:45+00:00
|
||||
draft: false
|
||||
images: []
|
||||
weight: 140
|
||||
---
|
||||
|
||||
Methods for groups. Please look at swagger for details.
|
||||
|
||||
- `{session}` - use the session name for Whatsapp instance that you created with `POST /api/session/start` endpoint
|
||||
- `{groupId}` - group id in format `123123123123@g.us`. You can get the id in a few ways:
|
||||
- By [handling incoming message webhook]({{< relref "/docs/how-to/receive-messages" >}}).
|
||||
- By getting all groups (see below).
|
||||
- By creating a new group and saving the id.
|
||||
|
||||
## Create a new group
|
||||
|
||||
`POST /api/{session}/groups`
|
||||
|
||||
Request:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Group name",
|
||||
"participants": [
|
||||
{
|
||||
"id": "123123123123@c.us"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Get all groups
|
||||
|
||||
`GET /api/{session}/groups`
|
||||
|
||||
## Get the group
|
||||
|
||||
`GET /api/{session}/groups/{groupId}`
|
||||
|
||||
## Delete the group
|
||||
|
||||
`DELETE /api/{session}/groups/{groupId}`
|
||||
|
||||
## Leave the group
|
||||
|
||||
`POST /api/{session}/groups/{groupId}/leave`
|
||||
|
||||
## Set group subject
|
||||
|
||||
Updates the group subject.
|
||||
|
||||
Returns `true` if the subject was properly updated. This can return false if the user does not have the necessary
|
||||
permissions.
|
||||
|
||||
`PUT /api/{session}/groups/{groupId}/subject`
|
||||
|
||||
Request:
|
||||
|
||||
```json
|
||||
{
|
||||
"subject": "Group name"
|
||||
}
|
||||
```
|
||||
|
||||
## Set group description
|
||||
|
||||
Updates the group description.
|
||||
|
||||
Returns `true` if the subject was properly updated. This can return false if the user does not have the necessary
|
||||
permissions.
|
||||
|
||||
`PUT /api/{session}/groups/{groupId}/description`
|
||||
|
||||
Request:
|
||||
|
||||
```json
|
||||
{
|
||||
"description": "Group description"
|
||||
}
|
||||
```
|
||||
|
||||
## Participants
|
||||
|
||||
### Get participants
|
||||
|
||||
`GET /api/{session}/groups/{groupId}/participants`
|
||||
|
||||
### Add participants
|
||||
|
||||
`POST /api/{session}/groups/{groupId}/participants/add`
|
||||
|
||||
```json
|
||||
{
|
||||
"participants": [
|
||||
{
|
||||
"id": "123123123123@c.us"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Remove participants
|
||||
|
||||
`POST /api/{session}/groups/{groupId}/participants/remove`
|
||||
|
||||
```json
|
||||
{
|
||||
"participants": [
|
||||
{
|
||||
"id": "123123123123@c.us"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Admin
|
||||
|
||||
### Promote to admin
|
||||
|
||||
Promote participants to admin users.
|
||||
|
||||
`POST /api/{session}/groups/{groupId}/admin/promote`
|
||||
|
||||
```json
|
||||
{
|
||||
"participants": [
|
||||
{
|
||||
"id": "123123123123@c.us"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Demote to regular users
|
||||
|
||||
Demote participants by to regular users.
|
||||
|
||||
`POST /api/{session}/groups/{groupId}/admin/demote`
|
||||
|
||||
```json
|
||||
{
|
||||
"participants": [
|
||||
{
|
||||
"id": "123123123123@c.us"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Invite code
|
||||
|
||||
### Get invite code
|
||||
|
||||
`GET /api/{session}/groups/{groupId}/invite-code`
|
||||
|
||||
Then you can put it in the url `https://chat.whatsapp.com/{inviteCode}` and send it to contacts.
|
||||
|
||||
### Revoke invite code
|
||||
|
||||
Invalidates the current group invite code and generates a new one.
|
||||
|
||||
`POST /api/{session}/groups/{groupId}/invite-code/revoke`
|
||||
|
||||
|
After Width: | Height: | Size: 301 KiB |
@@ -0,0 +1,102 @@
|
||||
---
|
||||
title : "Plus version"
|
||||
description: "Plus version"
|
||||
lead: ""
|
||||
date: 2020-10-06T08:48:45+00:00
|
||||
lastmod: 2020-10-06T08:48:45+00:00
|
||||
draft: false
|
||||
images: []
|
||||
weight: 900
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
**WAHA** is distributed in two versions:
|
||||
|
||||
1. Core  the basic version that meet almost 80% people’s needs. 100% free and open source.
|
||||
2. Plus  the version with advanced messages, security, and reliability features.
|
||||
|
||||
**If you enjoy Core  version and would like to support the project** - you can subscribe on Core level.
|
||||
It's not expensive, but it supports the project a lot!
|
||||
- [Boosty ->](https://boosty.to/wa-http-api)
|
||||
- [Patreon ->](https://patreon.com/wa_http_api)
|
||||
|
||||
|
||||
## Features
|
||||
|
||||
The Plus additional features are:
|
||||
|
||||
1. [**Send images\files\voices** →]({{< relref "/docs/how-to/send-messages" >}})
|
||||
2. [**Receive images\files\voices** →]({{< relref "/docs/how-to/receive-messages" >}})
|
||||
3. [**Webhook retries** →]({{< relref "/docs/how-to/receive-messages#retries" >}})
|
||||
4. [**Security** →]({{< relref "/docs/how-to/security" >}})
|
||||
5. [**Saving sessions** →]({{< relref "/docs/how-to/sessions" >}})
|
||||
6. [**Support multiple sessions** →]({{< relref "/docs/how-to/sessions" >}})
|
||||
7. **Instant updates** - no one month delay in getting bugfixes or new features
|
||||
8. **Priority in support** - on both bugs and features
|
||||
|
||||
## Differences
|
||||
|
||||
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 |
|
||||
|
||||
## Donations
|
||||
|
||||
WAHA Plus version is available through **donations** (subscriptions).
|
||||
|
||||
**It doesn't require monthly subscriptions, once installed on your server - it always works!**
|
||||
(until WhatsApp made backward-incompatible changes, and you have to update the image)
|
||||
|
||||
{{< alert icon="💡" text="No licence checks or expiration on already installed instances!" />}}
|
||||
We do not sell **WAHA**, it's not a purchase. It's a donation.
|
||||
|
||||
We treat our projects like art. You donate to the project and get a bit more from it as a thank-you. 😊
|
||||
|
||||
Treat **WAHA Plus** it as an additional episode, behind-the-scenes videos, our nude photos 😊
|
||||
|
||||
{{< alert icon="💡" text="WAHA does not have license checks and expiration - because art can not expire! Enjoy it till it works!" />}}
|
||||
|
||||
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!
|
||||
|
||||
## Get Plus 
|
||||
|
||||
For $19 one-time donation you get:
|
||||
1. **Secret password** for Docker Hub to download Plus image: `devlikeapro/whatsapp-http-api-plus`.
|
||||
2. **All updates for one month** for the Plus image.
|
||||
3. **NO LICENSE CHECKS** on installed instances!
|
||||
4. **NO LICENSE EXPIRATION** on installed instances! We repeated it twice to make sure that you've got it 😊
|
||||
|
||||
{{< alert icon="👉" text="We don't mind if you stay subscribed with us after one month :)" />}}
|
||||
|
||||
### Boosty
|
||||
We use Boosty to get donations (Patreon analogue) - [https://boosty.to/wa-http-api](https://boosty.to/wa-http-api).
|
||||
|
||||
Go ahead and get your monthly password to get no license expiration 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!" />}}
|
||||
|
||||

|
||||
|
||||
### Patreon
|
||||
You can support the project and get WAHA Plus version on Patreon: [https://patreon.com/wa_http_api](https://patreon.com/wa_http_api)
|
||||
|
||||
{{< alert icon="💡" text="Please look at Boosty - we prefer it because of lower fees, so we can donate more to the projects!" />}}
|
||||
|
||||
|
||||
### Install Plus
|
||||
After you get the password, use it to login and download docker image:
|
||||
```bash
|
||||
docker login -u devlikeapro -p {PASSWORD}
|
||||
docker pull devlikeapro/whatsapp-http-api-plus
|
||||
docker logout
|
||||
```
|
||||
Then in all commands use **Plus** image `devlikeapro/whatsapp-http-api-plus` instead of Core `devlikeapro/whatsapp-http-api`.
|
||||
@@ -0,0 +1,221 @@
|
||||
---
|
||||
title : "Receive messages"
|
||||
description: "Receive messages"
|
||||
lead: ""
|
||||
date: 2020-10-06T08:48:45+00:00
|
||||
lastmod: 2020-10-06T08:48:45+00:00
|
||||
draft: false
|
||||
images: []
|
||||
weight: 120
|
||||
---
|
||||
|
||||
The project uses [Webhooks](https://en.wikipedia.org/wiki/Webhook) to send the messages and events from WhatsApp to your
|
||||
application.
|
||||
|
||||
Webhooks are a way for two different applications to communicate with each other in real-time.
|
||||
When a certain event happens in one application, it sends a message to another application through a webhook URL.
|
||||
The receiving application can then take action based on the information received.
|
||||
|
||||
To receive incoming messages with webhooks,
|
||||
you first need to set up a webhook URL in your application and pass it to `WHATSAPP_HOOK_URL` environment variable.
|
||||
This URL is where WhatsApp will send incoming messages and other events -
|
||||
define which events you want to receive with `WHATSAPP_HOOK_EVENTS` environment variable.
|
||||
|
||||
## Webhooks 
|
||||
|
||||
You can configure where you want to receive events in environment variables:
|
||||
|
||||
- `WHATSAPP_HOOK_URL=https://httpbin.org/post` - to set up a URL for the webhook
|
||||
- `WHATSAPP_HOOK_EVENTS=message,message.any,state.change,group.join,group.leave` - specify events. DO NOT specify all of
|
||||
them, it's too heavy payload, choose the right for you.
|
||||
- `WHATSAPP_HOOK_EVENTS=*` - subscribe to all events. It's not recommended for production, but it's fine for
|
||||
development.
|
||||
|
||||
On the URL that you set via `WHATSAPP_HOOK_URL` you receive JSON-data with following format:
|
||||
|
||||
```json
|
||||
{
|
||||
"event": "message",
|
||||
"session": "default",
|
||||
"payload": {}
|
||||
}
|
||||
```
|
||||
|
||||
Where `event` value helps you identify the incoming event with `payload` for that events.
|
||||
|
||||
Below the list of all events that WhatsApp HTTP API sends to your.
|
||||
|
||||
{{< alert icon="👉" text="If you want to look at a webhook body - use the url `https://httpbin.org/post`" />}}
|
||||
|
||||
Run the bellow command and see look at the logs - it prints body request for all events that happen in your WhatsApp!
|
||||
|
||||
```bash
|
||||
docker run -it -e "WHATSAPP_HOOK_EVENTS=*" -e WHATSAPP_HOOK_URL=https://httpbin.org/post devlikeapro/whatsapp-http-api
|
||||
```
|
||||
|
||||
### Examples
|
||||
Here's few examples of how to handle webhook in different languages:
|
||||
1. [Python guide]({{< relref "/docs/examples/python" >}})
|
||||
|
||||
**Do you use another language?**
|
||||
|
||||
Please create a short guide how to handle webhook and send message after you finish your setup!
|
||||
You can create a pull request with your favorite language in the [GitHub, in examples folder](https://github.com/devlikeapro/whatsapp-http-api/tree/core/examples).
|
||||
|
||||
Just put the code and **README.md** file in the folder - we'll do the rest!
|
||||
|
||||
|
||||
## Events 
|
||||
|
||||
### message
|
||||
|
||||
Incoming message (text/audio/files)
|
||||
|
||||
```json
|
||||
{
|
||||
"event": "message",
|
||||
"session": "default",
|
||||
"payload": {
|
||||
"id": "true_11111111111@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
|
||||
"timestamp": 1667561485,
|
||||
"from": "11111111111@c.us",
|
||||
"fromMe": true,
|
||||
"to": "11111111111@c.us",
|
||||
"body": "Hi there!",
|
||||
"hasMedia": false,
|
||||
"ack": 1,
|
||||
"vCards": [],
|
||||
"_data": {
|
||||
"id": {
|
||||
"fromMe": true,
|
||||
"remote": "11111111111@c.us",
|
||||
"id": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
|
||||
"_serialized": "true_11111111111@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
|
||||
},
|
||||
"body": "Hi there!",
|
||||
"type": "chat",
|
||||
"t": 1667561485,
|
||||
"notifyName": "MyName",
|
||||
"from": "11111111111@c.us",
|
||||
"to": "11111111111@c.us",
|
||||
"self": "in",
|
||||
"ack": 1,
|
||||
"isNewMsg": true,
|
||||
"star": false,
|
||||
"kicNotified": false,
|
||||
"recvFresh": true,
|
||||
"isFromTemplate": false,
|
||||
"pollInvalidated": false,
|
||||
"latestEditMsgKey": null,
|
||||
"latestEditSenderTimestampMs": null,
|
||||
"broadcast": false,
|
||||
"mentionedJidList": [],
|
||||
"isVcardOverMmsDocument": false,
|
||||
"isForwarded": false,
|
||||
"hasReaction": false,
|
||||
"ephemeralOutOfSync": false,
|
||||
"productHeaderImageRejected": false,
|
||||
"lastPlaybackProgress": 0,
|
||||
"isDynamicReplyButtonsMsg": false,
|
||||
"isMdHistoryMsg": false,
|
||||
"stickerSentTs": 0,
|
||||
"isAvatar": false,
|
||||
"requiresDirectConnection": false,
|
||||
"pttForwardedFeaturesEnabled": true,
|
||||
"isEphemeral": false,
|
||||
"isStatusV3": false,
|
||||
"links": []
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### message.any
|
||||
|
||||
Fired on all message creations, including your own. The payload is the same as for [message](#message) event.
|
||||
|
||||
```json
|
||||
{
|
||||
"event": "message.any",
|
||||
"session": "default",
|
||||
"payload": {}
|
||||
}
|
||||
```
|
||||
|
||||
### message.ack
|
||||
|
||||
```json
|
||||
{
|
||||
"event": "message.ack",
|
||||
"session": "default",
|
||||
"payload": {}
|
||||
}
|
||||
```
|
||||
|
||||
### state.change
|
||||
|
||||
```json
|
||||
{
|
||||
"event": "state.change",
|
||||
"session": "default",
|
||||
"payload": {}
|
||||
}
|
||||
```
|
||||
|
||||
### group.join
|
||||
|
||||
```json
|
||||
{
|
||||
"event": "group.join",
|
||||
"session": "default",
|
||||
"payload": {}
|
||||
}
|
||||
```
|
||||
|
||||
### group.leave
|
||||
|
||||
```json
|
||||
{
|
||||
"event": "group.left",
|
||||
"session": "default",
|
||||
"payload": {}
|
||||
}
|
||||
```
|
||||
|
||||
## Files 
|
||||
|
||||
When people send you files - images, voice messages, and documents - WAHA saves it in the file storage.
|
||||
In your application you must download it and use it as you want to. You can find the URL in `mediaUrl` field
|
||||
|
||||
For example, you can get the webhook like this with `mediaUrl` value (we've skipped other fields):
|
||||
|
||||
```json
|
||||
{
|
||||
"event": "message",
|
||||
"session": "default",
|
||||
"payload": {
|
||||
"id": "true_11111111111@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
|
||||
"timestamp": 1667561485,
|
||||
"from": "11111111111@c.us",
|
||||
"mediaUrl": "http://localhost:3000/api/files/true_11111111111@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.jpg"
|
||||
}
|
||||
}
|
||||
```
|
||||
Then you can use the link to download the file `http://localhost:3000/api/files/true_11111111111@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.jpg`.
|
||||
|
||||
To configure the url you can use environment variables `WHATSAPP_API_HOSTNAME` and `WHATSAPP_API_PORT`.
|
||||
|
||||
[Read more about file storage configuration and variables ->]({{< relref "config" >}}).
|
||||
|
||||
## Webhook retries 
|
||||
|
||||
**WAHA** retries to reach your webhook URL 15 times and with 2 seconds delay between attempts.
|
||||
|
||||
## Get messages
|
||||
You can read messages from the history by using `GET /api/messages` endpoint.
|
||||
|
||||
```bash
|
||||
curl -X 'GET' \
|
||||
'http://localhost:3000/api/messages?chatId=11111111111%40c.us&limit=1000&session=default' \
|
||||
-H 'accept: application/json'
|
||||
```
|
||||
@@ -0,0 +1,67 @@
|
||||
---
|
||||
title : "Security"
|
||||
description: "Security"
|
||||
lead: ""
|
||||
date: 2020-10-06T08:48:45+00:00
|
||||
lastmod: 2020-10-06T08:48:45+00:00
|
||||
draft: false
|
||||
images: []
|
||||
weight: 700
|
||||
---
|
||||
{{< alert icon="💡" text="Do not expose WhatsApp HTTP API on public networks!" />}}
|
||||
|
||||
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 
|
||||
If you want to hide the project Swagger panel under the password - run the following command to hide under `admin/admin`
|
||||
login and password.
|
||||
|
||||
```bash
|
||||
docker run -it -e WHATSAPP_SWAGGER_USERNAME=admin -eWHATSAPP_SWAGGER_PASSWORD=admin devlikeapro/whatsapp-http-api-plus
|
||||
```
|
||||
|
||||
Open http://localhost:3000/ and enter `admin / admin` in the inputs:
|
||||
|
||||

|
||||
|
||||
{{< alert icon="👉" text="Protecting Swagger under the password does not protect your API from other request! Use both techniques to protect your API and Swagger!" />}}
|
||||
|
||||
## API security 
|
||||
|
||||
You can protect the API by requiring Api Key in a request's headers.
|
||||
|
||||
{{< alert icon="👉" text="Api Key does not hide your Swagger documentation. Please have a look at the previous section to find how to hide Swagger under the password." />}}
|
||||
|
||||
### Set Api Key
|
||||
|
||||
Set `WHATSAPP_API_KEY=yoursecretkey` environment variable for that:
|
||||
|
||||
```bash
|
||||
docker run -it -e WHATSAPP_API_KEY=yoursecretkey devlikeapro/whatsapp-http-api-plus
|
||||
```
|
||||
|
||||
### Use Api-Key in Swagger
|
||||
|
||||
After you set api key - to authorize on swagger use **Authorize** button at the top:
|
||||

|
||||
|
||||
### Add X-Api-Key header
|
||||
|
||||
To authorize requests - set `X-Api-Key` header to `yoursecretkey` for all requests that go to WAHA.
|
||||
|
||||
#### Python
|
||||
Example for Python **requests** library:
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
headers = {
|
||||
'Content-type': 'application/json',
|
||||
'X-Api-Key': 'yoursecretkey',
|
||||
}
|
||||
requests.get("http://localhost:3000/api/sessions", headers=headers)
|
||||
```
|
||||
|
||||
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 36 KiB |
@@ -0,0 +1,178 @@
|
||||
---
|
||||
title : "Send messages"
|
||||
description: "Send messages"
|
||||
lead: ""
|
||||
date: 2020-10-06T08:48:45+00:00
|
||||
lastmod: 2020-10-06T08:48:45+00:00
|
||||
draft: false
|
||||
images: []
|
||||
weight: 110
|
||||
---
|
||||
On your swagger documentation [http://localhost:3000/](http://localhost:3000/)
|
||||
or in [the example swagger](/swagger) you can find:
|
||||
1. List of all supported methods - we have not documented all of them on the page
|
||||
1. Requests JSON schemas
|
||||
1. Responses JSON schemas
|
||||
1. **Try it** button - no additional setup to play around with a method
|
||||
|
||||
|
||||
## Fields
|
||||
There are common fields that you can find in almost all requests:
|
||||
- `session` - a session name from which account you're sending the message. We use `default` in the examples.
|
||||
- Core  version supports only `default` session.
|
||||
- Plus  allows you to run multiple sessions inside one container to save your memory and CPU resources!
|
||||
Read more about [multiple sessions →]({{< relref "/docs/how-to/sessions" >}})
|
||||
|
||||
- `chatId` - it's a phone number or Group identifier where you're sending the message.
|
||||
- **Phone numbers** accounts use international phone number without + at the start and add `@c.us` at the end.
|
||||
For phone number `12132132131` the `chatId` is `12132132131@c.us`.
|
||||
- **Groups** use random number with `@g.us` at the end.
|
||||
|
||||
## Send text 
|
||||
To send text message - use `POST /api/sendText` with example payload.
|
||||
```json
|
||||
{
|
||||
"session": "default",
|
||||
"chatId": "12132132130@c.us",
|
||||
"text": "Hi there!"
|
||||
}
|
||||
```
|
||||
|
||||
## Reply on message 
|
||||
To reply on a message - use `POST /api/reply` with example payload.
|
||||
```json
|
||||
{
|
||||
"session": "default",
|
||||
"chatId": "11111111111@c.us",
|
||||
"reply_to": "false_11111111111@c.us_AAAAAAAAAAAAAAAAAAAA",
|
||||
"text": "Reply text"
|
||||
}
|
||||
```
|
||||
|
||||
### Reply files 
|
||||
WAHA does not support reply with files (images, voice, etc). If you're interested in it - please create an issue in GitHub.
|
||||
|
||||
## Add a reaction 
|
||||
Use `PUT /api/reaction` method to set reaction to a message.
|
||||
|
||||
{{< alert icon="👉" text="Reaction API uses PUT, not POST request! Please make sure you send right request." />}}
|
||||
|
||||
```json
|
||||
{
|
||||
"messageId": "false_11111111111@c.us_AAAAAAAAAAAAAAAAAAAA",
|
||||
"reaction": "👍",
|
||||
"session": "default"
|
||||
}
|
||||
```
|
||||
|
||||
To remove reaction from a message - send empty string in the reaction request.
|
||||
```json
|
||||
{
|
||||
"messageId": "false_11111111111@c.us_AAAAAAAAAAAAAAAAAAAA",
|
||||
"reaction": "",
|
||||
"session": "default"
|
||||
}
|
||||
```
|
||||
|
||||
## Send image 
|
||||
Use `POST /api/sendImage` to send images.
|
||||
|
||||
You can send images in two ways:
|
||||
1. Provide a URL for the image.
|
||||
2. Encode the whole file content into base64 and send it in the request body.
|
||||
|
||||
### URL
|
||||
```json
|
||||
{
|
||||
"session": "default",
|
||||
"chatId": "11111111111@c.us",
|
||||
"file": {
|
||||
"mimetype": "image/jpeg",
|
||||
"url": "https://github.com/devlikeapro/whatsapp-http-api/raw/core/examples/dev.likeapro.jpg",
|
||||
"filename": "filename.jpeg"
|
||||
},
|
||||
"caption": "string"
|
||||
}
|
||||
```
|
||||
|
||||
### Base64
|
||||
```json
|
||||
{
|
||||
"session": "default",
|
||||
"chatId": "11111111111@c.us",
|
||||
"file": {
|
||||
"mimetype": "image/jpeg",
|
||||
"filename": "filename.jpeg",
|
||||
"data": "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"
|
||||
},
|
||||
"caption": "string"
|
||||
}
|
||||
```
|
||||
|
||||
## Send voice 
|
||||
Use `POST /api/sendVoice` to send voice messages.
|
||||
|
||||
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.
|
||||
|
||||
### URL
|
||||
```json
|
||||
{
|
||||
"session": "default",
|
||||
"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"
|
||||
},
|
||||
"caption": "string"
|
||||
}
|
||||
```
|
||||
|
||||
### Base64
|
||||
```json
|
||||
{
|
||||
"chatId": "11111111111@c.us",
|
||||
"file": {
|
||||
"mimetype": "audio/ogg; codecs=opus",
|
||||
"filename": "voice-message.mp3",
|
||||
"data": "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 truncated
|
||||
},
|
||||
"session": "default"
|
||||
}
|
||||
```
|
||||
## Send file 
|
||||
Use `POST /api/sendFile` to send a file as a document.
|
||||
|
||||
You can send files in two ways:
|
||||
1. Provide a URL for the file.
|
||||
2. Encode the whole file content into base64 and send it in the request body.
|
||||
|
||||
### URL
|
||||
```json
|
||||
{
|
||||
"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"
|
||||
}
|
||||
```
|
||||
|
||||
### Base64
|
||||
```json
|
||||
{
|
||||
"session": "default",
|
||||
"chatId": "11111111111@c.us",
|
||||
"file": {
|
||||
"mimetype": "image/jpeg",
|
||||
"filename": "filename.jpeg",
|
||||
"data": "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"
|
||||
},
|
||||
"caption": "string"
|
||||
}
|
||||
```
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
title : "Sessions"
|
||||
description: "Sessions"
|
||||
lead: ""
|
||||
date: 2020-10-06T08:48:45+00:00
|
||||
lastmod: 2020-10-06T08:48:45+00:00
|
||||
draft: false
|
||||
images: []
|
||||
weight: 200
|
||||
---
|
||||
|
||||
## Saving session 
|
||||
|
||||
Plus  version allows you to save "session" state and avoid scanning QR code everytime when
|
||||
you start a container.
|
||||
|
||||
### File storage
|
||||
|
||||
If you want to save your session and do not scan QR code everytime when you launch WAHA - connect a local file storage
|
||||
to the container. WAHA stores authentication information in the directory and reuses it after restart.
|
||||
|
||||
[Attach volume](https://docs.docker.com/storage/volumes/) part to the command:
|
||||
```bash
|
||||
-v `pwd`/.sessions:/app/.sessions
|
||||
```
|
||||
|
||||
The full command would be:
|
||||
```bash
|
||||
docker run --rm -d -v `pwd`/.sessions:/app/.sessions -p 127.0.0.1:3000:3000/tcp --name whatsapp-http-api devlikeapro/whatsapp-http-api
|
||||
```
|
||||
|
||||
### Remote storage 
|
||||
|
||||
If you're interested in using some "remote" storage (like Redis or other Databases) to save sessions - please create an
|
||||
issue on GitHub.
|
||||
|
||||
For instances, it may be useful if you run WAHA in a cluster of servers and do not have shared file storage
|
||||
|
||||
## Multiple sessions 
|
||||
|
||||
If you want to save server's CPU and Memory - run multiple sessions inside one docker container!
|
||||
|
||||
### Start
|
||||
|
||||
In order to start a new session - call `POST /api/sessions/start`
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "default"
|
||||
}
|
||||
```
|
||||
|
||||
### List
|
||||
|
||||
To get session list - call `GET /api/sessions`.
|
||||
|
||||
The response:
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"name": "default",
|
||||
"status": "STARTING"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### Stop
|
||||
|
||||
In order to stop a new session - call `POST /api/sessions/stop`
|
||||
|
||||
{{< alert icon="👉" text="The stop request does not log out the account. Manually remove the session storage." />}}
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "default"
|
||||
}
|
||||
```
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title : "Overview"
|
||||
description: "Overview Doks."
|
||||
lead: ""
|
||||
date: 2020-10-06T08:48:45+00:00
|
||||
lastmod: 2020-10-06T08:48:45+00:00
|
||||
draft: false
|
||||
images: []
|
||||
weight: 100
|
||||
---
|
||||
@@ -0,0 +1,91 @@
|
||||
---
|
||||
title: "Introduction"
|
||||
description: "WAHA - WhatsApp HTTP API that you can install on your own server and run in less than 5 minutes!"
|
||||
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
|
||||
---
|
||||
**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"/>
|
||||
</div>
|
||||
|
||||
## Get started
|
||||
|
||||
{{< alert icon="👉" text="Run WhatsApp HTTP API in less than 5 minutes!" />}}
|
||||
|
||||
We will guide you through the necessary steps to successfully send your first text message using WhatsApp HTTP API in
|
||||
[Quick Start →]({{< relref "quick-start" >}}).
|
||||
|
||||
If you find it easier to follow a video tutorial rather than reading through text, we've got you covered!
|
||||
A 3-minute video tutorial is available to help you navigate WhatsApp HTTP API smoothly.
|
||||
|
||||
<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>
|
||||
|
||||
## Features
|
||||
WAHA is distributed in two versions:
|
||||
- Core  - the basic version that meet almost 80% people's needs. 100% free and [open source](https://github.com/devlikeapro/whatsapp-http-api).
|
||||
- Plus  - the version with advanced messages, security, and reliability features. One-time donation, no license expiration, quick updates, read more about [Plus Version →]({{< relref "plus-version" >}})
|
||||
|
||||
Here's the available features:
|
||||
|
||||
### Messages
|
||||
- Send messages 
|
||||
- Receive messages 
|
||||
- Message replies 
|
||||
- Send location 
|
||||
- Send buttons 
|
||||
- Receive location 
|
||||
- React to messages 
|
||||
- Send media (images/documents/files) 
|
||||
- Send voice messages 
|
||||
- Receive media (images/audio/video/documents) 
|
||||
- Receive messages - webhook retries 
|
||||
|
||||
### Sessions
|
||||
- Multi Device 
|
||||
- Get the screenshot 
|
||||
- Session saving (don't have to scan QR on every restart) 
|
||||
- Session saving on remote storage (database, redis) 
|
||||
- Single WhatsApp account running inside one container 
|
||||
- Multiple WhatsApp account running inside one container 
|
||||
|
||||
### Security
|
||||
- API authentication 
|
||||
- Swagger panel authentication 
|
||||
|
||||
### Updates
|
||||
- Bug fixes and updates come as soon as they are implemented. 
|
||||
- One month delay in bug fixes and updates. 
|
||||
|
||||
|
||||
### Groups 
|
||||
- Create a group
|
||||
- Get invite for group
|
||||
- Modify group info (subject, description)
|
||||
- Add group participants
|
||||
- Kick group participants
|
||||
- Promote/demote group participants
|
||||
|
||||
### Contacts 
|
||||
- Mute/unmute chats
|
||||
- Block/unblock contacts
|
||||
- Get contact info
|
||||
- Get profile pictures
|
||||
|
After Width: | Height: | Size: 194 KiB |
@@ -0,0 +1,188 @@
|
||||
---
|
||||
title: "Quick Start"
|
||||
description: "One page summary of how to start WhatsApp HTTP API."
|
||||
lead: "One page summary of how to start WhatsApp HTTP API."
|
||||
date: 2020-11-16T13:59:39+01:00
|
||||
lastmod: 2020-11-16T13:59:39+01:00
|
||||
draft: false
|
||||
images: []
|
||||
menu:
|
||||
docs:
|
||||
parent: "overview"
|
||||
weight: 110
|
||||
toc: true
|
||||
---
|
||||
|
||||
On this page you're going to install WAHA, run it, authenticate the client using QR code and send the first text message
|
||||
to WhatsApp!
|
||||
|
||||
## Requirements
|
||||
|
||||
Only thing that you must have - installed docker. Please follow the original
|
||||
instruction <a href="https://docs.docker.com/get-docker/" target="_blank" rel="noopener">how to install docker -></a>.
|
||||
|
||||
When you are ready - come back and follows the below steps to send the first text message to WhatsApp via HTTP API!
|
||||
|
||||
{{< details "Why Docker?" >}}
|
||||
Docker makes it easy to ship all-in-one solution with the runtime and dependencies. You don't have to worry about
|
||||
language-specific libraries or chrome installation.
|
||||
|
||||
Also Docker makes installation and update processes so simple, just one command!
|
||||
{{< /details >}}
|
||||
|
||||
## Send your first message
|
||||
|
||||
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 rather than reading through text, we've got you covered!
|
||||
A 3-minute video tutorial is available to help you navigate WhatsApp HTTP API smoothly.
|
||||
|
||||
<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>
|
||||
|
||||
### 1. Download image
|
||||
|
||||
Assuming you have installed [Docker](https://docs.docker.com/get-docker/), let's download the image.
|
||||
|
||||
 For Core version the command is
|
||||
|
||||
```bash
|
||||
docker pull devlikeapro/whatsapp-http-api
|
||||
```
|
||||
|
||||
 For Plus version, we use login to get the image before:
|
||||
|
||||
```bash
|
||||
docker login -u devlikeapro -p {PASSWORD}
|
||||
docker pull devlikeapro/whatsapp-http-api-plus
|
||||
docker logout
|
||||
```
|
||||
|
||||
Read more about how to get `PASSWORD` for [Plus Version →]({{< relref "plus-version" >}})
|
||||
|
||||
#### 1.1 Download image on 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
|
||||
```
|
||||
|
||||
 For Plus version the command is:
|
||||
```bash
|
||||
docker login -u devlikeapro -p {PASSWORD}
|
||||
docker pull devlikeapro/whatsapp-http-api-plus:arm
|
||||
docker logout
|
||||
|
||||
# Rename it, so you can use devlikeapro/whatsapp-http-api image in other place
|
||||
docker tag devlikeapro/whatsapp-http-api-plus:arm devlikeapro/whatsapp-http-api
|
||||
```
|
||||
|
||||
### 2. Run WhatsApp HTTP API
|
||||
|
||||
Run WhatsApp HTTP API:
|
||||
|
||||
```bash
|
||||
docker run -it --rm -p 127.0.0.1:3000:3000/tcp --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
|
||||
```
|
||||
|
||||
Open the link in your browser [http://localhost:3000/](http://localhost:3000/) and you'll see API documentation
|
||||
(Swagger).
|
||||
|
||||
{{< alert icon="👉" text="We don't recommend expose the API in the internet without authentication!" />}}
|
||||
|
||||

|
||||
|
||||
### 3. Start a new session
|
||||
|
||||
To start a new session you should have your mobile phone with installed WhatsApp application close to you.
|
||||
|
||||
Please go and read how what we'll need to a bit
|
||||
later:
|
||||
<a href="https://faq.whatsapp.com/381777293328336/?helpref=hc_fnav" target="_blank">
|
||||
How to log in - the instruction on WhatsApp site
|
||||
</a>
|
||||
|
||||
When your ready - find `POST /api/session/start`, click on **Try it out**, then **Execute** a bit below.
|
||||
|
||||
The example payload:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "default"
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
|
||||
By using the request with `name` values you can start multiple session (WhatsApp accounts) inside the single docker
|
||||
container in Plus
|
||||
 version and only one account in Core  version.
|
||||
|
||||
Read more about [multiple sessions →]({{< relref "/docs/how-to/sessions" >}})
|
||||
|
||||
### 4. Get and scan QR
|
||||
|
||||
Find `GET /api/screenshot` and execute it, it shows you QR code.
|
||||
|
||||

|
||||
|
||||
**Scan the QR with your cell phone's WhatsApp app.**
|
||||
|
||||

|
||||
|
||||
### 5. Get the screenshot
|
||||
|
||||
Execute `GET /api/screenshot` after a few seconds after scanning the QR - it'll show you the screenshot of you Whatsapp
|
||||
instance. If you can get the actual screenshot - then you're ready to start sending messages!
|
||||
|
||||

|
||||
|
||||
### 6. Send a text message
|
||||
|
||||
Let's send a text message - find `POST /api/sendText` in [swagger](http://localhost:3000/) and change `chatId` this
|
||||
way: use a phone international phone number without `+` symbol and add `@c.us` at the end.
|
||||
|
||||
For phone number `12132132131` the `chatId` is `12132132131@c.us`.
|
||||
|
||||
The example payload:
|
||||
|
||||
```json
|
||||
{
|
||||
"chatId": "12132132130@c.us",
|
||||
"text": "Hi there!",
|
||||
"session": "default"
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
|
||||
Also, you can use `curl` and send POST request like this:
|
||||
|
||||
```bash
|
||||
# Phone without +
|
||||
export PHONE=12132132130
|
||||
curl -d "{\"chatId\": \"${PHONE}@c.us\", \"text\": \"Hello from WhatsApp HTTP API\" }" -H "Content-Type: application/json" -X POST http://localhost:3000/api/sendText
|
||||
```
|
||||
|
||||
## 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" >}})
|
||||
- Make sure your [API is properly protected ->]({{< relref "/docs/how-to/security" >}})
|
||||
|
||||
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 159 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 83 KiB |
@@ -0,0 +1,36 @@
|
||||
---
|
||||
title: "Privacy Policy"
|
||||
description: "We do not use cookies and we do not collect any personal data."
|
||||
date: 2020-08-27T19:23:18+02:00
|
||||
lastmod: 2020-08-27T19:23:18+02:00
|
||||
draft: true
|
||||
images: []
|
||||
---
|
||||
|
||||
__TLDR__: We do not use cookies and we do not collect any personal data.
|
||||
|
||||
## Website visitors
|
||||
|
||||
- No personal information is collected.
|
||||
- No information is stored in the browser.
|
||||
- No information is shared with, sent to or sold to third-parties.
|
||||
- No information is shared with advertising companies.
|
||||
- No information is mined and harvested for personal and behavioral trends.
|
||||
- No information is monetized.
|
||||
|
||||
### Information we collect and what we use it for
|
||||
|
||||
We run [Plausible](https://plausible.io/) analytics on getdoks.org. The following information is collected:
|
||||
|
||||
- __Page URL__. We track the page URL of each page view on this website. We use this to understand which pages have been viewed and how many times a particular page has been viewed. For example: _https://getdoks.org/_.
|
||||
- __HTTP Referrer__. We use the referrer string to understand the number of visitors referred to this website from links on other sites. For example: _https://github.com/_.
|
||||
- __Browser__. We use this to understand what browsers people use when visiting this website. This is derived from the User-Agent HTTP header. The full User-Agent is discarded. For example: _Chrome_.
|
||||
- __Operating system__. We use this to understand what operating systems people use when visiting this website. We only use the brand of the operating system and don’t include the version number or any other details. This is derived from the User-Agent HTTP header. The full User-Agent is discarded. For example: _GNU/Linux_.
|
||||
- __Device type__. We use this to understand what devices people use when visiting this website. This is derived from window.innerWidth. The actual width of the browser in pixels is discarded. For example: _Desktop_.
|
||||
- __Visitor Country__. We look up the visitor’s country using the IP address. We do not track anything more granular than the country of origin and the IP address of the visitor is discarded. We never store IP addresses in our database or logs. For example: _Canada_.
|
||||
|
||||
## Contact us
|
||||
|
||||
[Contact us]({{< relref "contact/index.md" >}}) if you have any questions.
|
||||
|
||||
Effective Date: _27th August 2020_
|
||||
@@ -0,0 +1,11 @@
|
||||
---
|
||||
title: "Versions"
|
||||
description: ""
|
||||
lead: "An appendix of hosted documentation for nearly every release of Doks, from v0 through v3."
|
||||
date: 2021-09-24T08:50:23+02:00
|
||||
lastmod: 2021-09-24T08:50:23+02:00
|
||||
draft: true
|
||||
images: []
|
||||
layout: versions
|
||||
url: "/docs/versions/"
|
||||
---
|
||||
@@ -0,0 +1,60 @@
|
||||
# - group: v1.x
|
||||
# baseurl: "https://getbootstrap.com"
|
||||
# description: "Every minor and patch release from v1 is listed below."
|
||||
# versions:
|
||||
# - v: "1.0.0"
|
||||
# - v: "1.1.0"
|
||||
# - v: "1.1.1"
|
||||
# - v: "1.2.0"
|
||||
# - v: "1.3.0"
|
||||
# - v: "1.4.0"
|
||||
#
|
||||
# - group: v2.x
|
||||
# baseurl: "https://getbootstrap.com"
|
||||
# description: "Every minor and patch release from v2 is listed below."
|
||||
# versions:
|
||||
# - v: "2.0.0"
|
||||
# - v: "2.0.1"
|
||||
# - v: "2.0.2"
|
||||
# - v: "2.0.3"
|
||||
# - v: "2.0.4"
|
||||
# - v: "2.1.0"
|
||||
# - v: "2.1.1"
|
||||
# - v: "2.2.0"
|
||||
# - v: "2.2.1"
|
||||
# - v: "2.2.2"
|
||||
# - v: "2.3.0"
|
||||
# - v: "2.3.1"
|
||||
# - v: "2.3.2"
|
||||
#
|
||||
# - group: v3.x
|
||||
# baseurl: "https://getbootstrap.com/docs"
|
||||
# description: "Every minor and patch release from v3 is listed below. Last update was v3.4.1."
|
||||
# versions:
|
||||
# - v: "3.3"
|
||||
# - v: "3.4"
|
||||
#
|
||||
# - group: v4.x
|
||||
# baseurl: "https://getbootstrap.com/docs"
|
||||
# description: "Our previous major release with its minor releases. Last update was v4.6.0."
|
||||
# versions:
|
||||
# - v: "4.0"
|
||||
# - v: "4.1"
|
||||
# - v: "4.2"
|
||||
# - v: "4.3"
|
||||
# - v: "4.4"
|
||||
# - v: "4.5"
|
||||
# - v: "4.6"
|
||||
|
||||
- group: v0.x
|
||||
baseurl: "/docs"
|
||||
description: "Current major release. Last update was v0.2.0."
|
||||
versions:
|
||||
- v: "0.1"
|
||||
- v: "0.2"
|
||||
|
||||
- group: v1.x
|
||||
baseurl: "/docs"
|
||||
description: "Every minor and patch release from v1 is listed below. Last update was v1.0.0."
|
||||
versions:
|
||||
- v: "1.0"
|
||||
@@ -0,0 +1,11 @@
|
||||
exports.handler = (event, context, callback) => {
|
||||
callback (null, {
|
||||
statusCode: 200,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
message: 'Hi from Lambda.',
|
||||
}),
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
- id: get-started
|
||||
translation: "Loslegen"
|
||||
|
||||
- id: on-this-page
|
||||
translation: "Auf dieser Seite"
|
||||
@@ -0,0 +1,17 @@
|
||||
- id: get-started
|
||||
translation: "Get Started"
|
||||
|
||||
- id: on-this-page
|
||||
translation: "On this page"
|
||||
|
||||
- id: search-text
|
||||
translation: "Search docs..."
|
||||
|
||||
- id: 404-title
|
||||
translation: "Page not found :("
|
||||
|
||||
- id: 404-text
|
||||
translation: "The page you are looking for doesn't exist or has been moved."
|
||||
|
||||
- id: browse
|
||||
translation: "Browse"
|
||||
@@ -0,0 +1,17 @@
|
||||
- id: get-started
|
||||
translation: "Aan de slag"
|
||||
|
||||
- id: on-this-page
|
||||
translation: "Op deze pagina"
|
||||
|
||||
- id: search-text
|
||||
translation: "Zoeken..."
|
||||
|
||||
- id: 404-title
|
||||
translation: "Pagina niet gevonden :("
|
||||
|
||||
- id: 404-text
|
||||
translation: "De gezochte pagina bestaat niet of deze is verplaatst."
|
||||
|
||||
- id: browse
|
||||
translation: "Browse"
|
||||
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 119 KiB |
|
After Width: | Height: | Size: 138 KiB |
@@ -0,0 +1,102 @@
|
||||
{{ define "main" }}
|
||||
<section class="section container-fluid mt-n3 pb-3">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-12 text-center">
|
||||
<h1 class="mt-0">{{ .Title }}</h1>
|
||||
</div>
|
||||
<div class="col-lg-9 col-xl-8 text-center">
|
||||
<div class="mb-4">
|
||||
<img src="/images/logo.png" title="WhatsApp HTTP API" alt="logo" width="100"/>
|
||||
</div>
|
||||
<p class="lead">{{ .Params.lead | safeHTML }}</p>
|
||||
<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>
|
||||
<div>
|
||||
<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>
|
||||
</section>
|
||||
{{ end }}
|
||||
|
||||
{{ define "sidebar-prefooter" }}
|
||||
<section class="section section-sm">
|
||||
<div class="container">
|
||||
<div class="row justify-content-center text-center">
|
||||
<div class="col-lg-5">
|
||||
<h2 class="h4">It's free!</h2>
|
||||
<p>
|
||||
<b>WAHA Core</b> version is always free!
|
||||
<br>
|
||||
Even <b>WAHA Plus</b> version have no licence expiration!
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-lg-5">
|
||||
<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">
|
||||
<h2 class="h4">Well documented</h2>
|
||||
<p>Documentation has a lof examples and how-to guides.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row justify-content-center text-center">
|
||||
<div class="col-lg-5">
|
||||
<h2 class="h4">Self hosted</h2>
|
||||
<p>
|
||||
No strings to suspicious SaaS WhatsApp HTTP API solutions. Install it on your own server!
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-lg-5">
|
||||
<h2 class="h4">Easy installation</h2>
|
||||
<p>
|
||||
You need to install <a href="https://docs.docker.com/engine/install/">Docker</a> and can run the API in a
|
||||
click!
|
||||
<br/>
|
||||
<small class="text-muted">
|
||||
It's actually "a command", not a click.
|
||||
</small>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-lg-5">
|
||||
<h2 class="h4">No blocking</h2>
|
||||
<p>
|
||||
Under the hood it runs a real instance of Whatsapp Web to avoid getting blocked.
|
||||
<br/>
|
||||
<small class="text-muted">
|
||||
WhatsApp does not allow bots or unofficial clients on their platform, so this shouldn't be considered
|
||||
totally safe.
|
||||
</small>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
||||
|
||||
{{ define "sidebar-footer" }}
|
||||
<section class="section section-sm container-fluid">
|
||||
<div class="row justify-content-center text-center">
|
||||
<div class="col-lg-9">
|
||||
{{- .Content -}}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
||||
@@ -0,0 +1,18 @@
|
||||
<footer class="footer text-muted">
|
||||
<div class="container-{{ if .Site.Params.options.fullWidth }}fluid{{ else }}xxl{{ end }}">
|
||||
<div class="row">
|
||||
<div class="col-lg-12 order-last order-lg-first">
|
||||
<ul class="list-inline">
|
||||
<li class="list-inline-item">{{ .Site.Params.footer | safeHTML }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-lg-12 order-first order-lg-last text-lg-end">
|
||||
<ul class="list-inline">
|
||||
{{ range .Site.Menus.footer -}}
|
||||
<li class="list-inline-item"><a href="{{ .URL | relURL }}">{{ .Name }}</a></li>
|
||||
{{ end -}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||