Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
269e44e
fix(webpack-exodus): Bad export name
purpshell Apr 9, 2024
85db3d2
feat(webpack-exodus): Re-injection, No more selectors, Pairing Code auth
purpshell Apr 14, 2024
27621f1
fix(webpack-exodus): Eslint and better login/logout handling
purpshell Apr 14, 2024
dd75967
fix(webpack-exodus): 2.24 compatibility
purpshell Apr 14, 2024
e7ae65f
revert testing options
purpshell Apr 14, 2024
cad33ec
chore(webpack-exodus): ESLint
purpshell Apr 14, 2024
452b712
chore(webpack-exodus): final eslint tweak (did not commit with last c…
purpshell Apr 14, 2024
6d4ec61
style: guide link fix and detailed description (#2972)
qzdark Apr 22, 2024
b347aa6
Merge branch 'main' into webpack-exodus
alechkos Apr 22, 2024
fac0d81
style: fix broken link in readme file
alechkos Apr 22, 2024
5b301bb
fix: logo link (#2994)
qzdark Apr 27, 2024
53672d0
Merge branch 'main' into webpack-exodus
alechkos Apr 27, 2024
c1d8e04
fix(webpack-exodus): Fix forwarding messages
purpshell Apr 28, 2024
86d5dc4
Merge branch 'webpack-exodus' of https://github.com/pedroslopez/whats…
purpshell Apr 28, 2024
650cd0d
fix(webpack-exodus): finish forwarding function
purpshell Apr 28, 2024
aa26876
Update Client.js (#2813)
Bauguelson Apr 28, 2024
b99d28c
Add members settings (#2788)
GulgDev Apr 28, 2024
8c810a8
Fix: delete lines that remove data from this._data (#2958)
shirser121 Apr 29, 2024
01714fe
feat: `vote_update` event (#2596)
alechkos Apr 30, 2024
b856093
1.23.1-alpha.6
wwebjs-bot Apr 30, 2024
41b280c
Expose chat `pinned` property (#2771)
Rakambda May 1, 2024
64491be
Making the ESLint god happy
tuyuribr May 14, 2024
975819d
Fix window.Store.ProfilePic.profilePicFind is not a function error (#…
seowzhenjun0126 May 14, 2024
e4c208c
Sanitize, improves and fixes
tuyuribr May 15, 2024
252ed8f
make ESList god happy
tuyuribr May 15, 2024
2798396
fix getInviteCode for group (#3007) (#3029)
themazim May 15, 2024
6df4eef
fixes
tuyuribr May 16, 2024
1ecdc42
Update LocalWebCache.js
tuyuribr May 21, 2024
96b4742
fix delete on 2.3000 (#3048)
jrocha May 24, 2024
bbb8d18
Implement bot invoking capabilities (#3009)
MatMercer May 25, 2024
9847eba
Make an NPM release via GitHub (#2942)
purpshell Jun 4, 2024
24b11b7
1.24.0
wwebjs-bot Jun 9, 2024
752d9ae
Webpack exodus fix message_reaction event (#3099)
jrocha Jun 12, 2024
efc2bd0
message_reaction on example.js (#3102)
jrocha Jun 13, 2024
cd566f2
fix reactions on pvt chats (#3104)
jrocha Jun 14, 2024
4ddbb0d
New group function
tuyuribr Jul 2, 2024
8034e8f
new group settings
tuyuribr Jul 2, 2024
5a088a6
Merge branch 'main' into webpack-exodus
tuyuribr Jul 23, 2024
f361cde
Update Client.js
tuyuribr Jul 23, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ on:
workflow_dispatch:
inputs:
release_type:
description: "`alpha`, `alpha-minor`, `alpha-major` release?"
description: "`alpha`, `alpha-minor`, `alpha-major`, `release-minor`, `release-patch` release?"
required: true
default: "alpha"

Expand Down
119 changes: 79 additions & 40 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,31 +1,48 @@
[![npm](https://img.shields.io/npm/v/whatsapp-web.js.svg)](https://www.npmjs.com/package/whatsapp-web.js) [![Depfu](https://badges.depfu.com/badges/4a65a0de96ece65fdf39e294e0c8dcba/overview.svg)](https://depfu.com/github/pedroslopez/whatsapp-web.js?project_id=9765) ![WhatsApp_Web 2.2346.52](https://img.shields.io/badge/WhatsApp_Web-2.2346.52-brightgreen.svg) [![Discord Chat](https://img.shields.io/discord/698610475432411196.svg?logo=discord)](https://discord.gg/H7DqQs4)

# whatsapp-web.js
A WhatsApp API client that connects through the WhatsApp Web browser app

It uses Puppeteer to run a real instance of Whatsapp Web to avoid getting blocked.

**NOTE:** I can't guarantee you will not be blocked by using this method, although it has worked for me. WhatsApp does not allow bots or unofficial clients on their platform, so this shouldn't be considered totally safe.

## Quick Links

* [Guide / Getting Started](https://wwebjs.dev/guide) _(work in progress)_
* [Reference documentation](https://docs.wwebjs.dev/)
* [GitHub](https://github.com/pedroslopez/whatsapp-web.js)
* [npm](https://npmjs.org/package/whatsapp-web.js)
<div align="center">
<br />
<p>
<a href="https://wwebjs.dev"><img src="https://github.com/wwebjs/logos/blob/main/4_Full%20Logo%20Lockup_Small/small_banner_blue.png?raw=true" title="whatsapp-web.js" alt="WWebJS Website" width="500" /></a>
</p>
<br />
<p>
<a href="https://www.npmjs.com/package/whatsapp-web.js"><img src="https://img.shields.io/npm/v/whatsapp-web.js.svg" alt="npm" /></a>
<a href="https://depfu.com/github/pedroslopez/whatsapp-web.js?project_id=9765"><img src="https://badges.depfu.com/badges/4a65a0de96ece65fdf39e294e0c8dcba/overview.svg" alt="Depfu" /></a>
<img src="https://img.shields.io/badge/WhatsApp_Web-2.2346.52-brightgreen.svg" alt="WhatsApp_Web 2.2346.52" />
<a href="https://discord.gg/H7DqQs4"><img src="https://img.shields.io/discord/698610475432411196.svg?logo=discord" alt="Discord server" /></a>
</p>
<br />
</div>

## About
**A WhatsApp API client that connects through the WhatsApp Web browser app**

The library works by launching the WhatsApp Web browser application and managing it using Puppeteer to create an instance of WhatsApp Web, thereby mitigating the risk of being blocked. The WhatsApp API client connects through the WhatsApp Web browser app, accessing its internal functions. This grants you access to nearly all the features available on WhatsApp Web, enabling dynamic handling similar to any other Node.js application.

> [!IMPORTANT]
> **It is not guaranteed you will not be blocked by using this method. WhatsApp does not allow bots or unofficial clients on their platform, so this shouldn't be considered totally safe.**

## Links

* [Website][website]
* [Guide][guide] ([source][guide-source]) _(work in progress)_
* [Documentation][documentation] ([source][documentation-source])
* [WWebJS Discord][discord]
* [GitHub][gitHub]
* [npm][npm]

## Installation

The module is now available on npm! `npm i whatsapp-web.js`

Please note that Node v18+ is required.
> [!NOTE]
> **Node ``v18+`` is required.**

## QUICK STEPS TO UPGRADE NODE

### Windows

#### Manual
Just get the latest LTS from https://nodejs.org
Just get the latest LTS from the [official node website][nodejs].

#### npm
```powershell
Expand Down Expand Up @@ -74,9 +91,8 @@ client.on('message', msg => {
client.initialize();
```

Take a look at [example.js](https://github.com/pedroslopez/whatsapp-web.js/blob/master/example.js) for another example with more use cases.

For more information on saving and restoring sessions, check out the available [Authentication Strategies](https://wwebjs.dev/guide/authentication.html).
Take a look at [example.js][examples] for another examples with additional use cases.
For further details on saving and restoring sessions, explore the provided [Authentication Strategies][auth-strategies].


## Supported features
Expand All @@ -87,13 +103,13 @@ For more information on saving and restoring sessions, check out the available [
| Send messages | ✅ |
| Receive messages | ✅ |
| Send media (images/audio/documents) | ✅ |
| Send media (video) | ✅ [(requires google chrome)](https://wwebjs.dev/guide/handling-attachments.html#caveat-for-sending-videos-and-gifs) |
| Send media (video) | ✅ [(requires Google Chrome)][google-chrome] |
| Send stickers | ✅ |
| Receive media (images/audio/video/documents) | ✅ |
| Send contact cards | ✅ |
| Send location | ✅ |
| Send buttons | ❌ |
| Send lists | ❌ [(DEPRECATED)](https://www.youtube.com/watch?v=hv1R1rLeVVE) |
| Send buttons | ❌ [(DEPRECATED)][deprecated-video] |
| Send lists | ❌ [(DEPRECATED)][deprecated-video] |
| Receive location | ✅ |
| Message replies | ✅ |
| Join groups by invite | ✅ |
Expand All @@ -104,43 +120,66 @@ For more information on saving and restoring sessions, check out the available [
| Kick group participants | ✅ |
| Promote/demote group participants | ✅ |
| Mention users | ✅ |
| Mention groups | ✅ |
| Mute/unmute chats | ✅ |
| Block/unblock contacts | ✅ |
| Get contact info | ✅ |
| Get profile pictures | ✅ |
| Set user status message | ✅ |
| React to messages | ✅ |
| Vote in polls | 🔜 |
| Create polls | ✅ |
| Vote in polls | 🔜 |
| Communities | 🔜 |
| Channels | 🔜 |

Something missing? Make an issue and let us know!

## Contributing

Pull requests are welcome! If you see something you'd like to add, please do. For drastic changes, please open an issue first.
Feel free to open pull requests; we welcome contributions! However, for significant changes, it's best to open an issue beforehand. Make sure to review our [contribution guidelines][contributing] before creating a pull request. Before creating your own issue or pull request, always check to see if one already exists!

## Supporting the project

You can support the maintainer of this project through the links below

- [Support via GitHub Sponsors](https://github.com/sponsors/pedroslopez)
- [Support via PayPal](https://www.paypal.me/psla/)
- [Sign up for DigitalOcean](https://m.do.co/c/73f906a36ed4) and get $200 in credit when you sign up (Referral)
- [Support via GitHub Sponsors][gitHub-sponsors]
- [Support via PayPal][support-payPal]
- [Sign up for DigitalOcean][digitalocean] and get $200 in credit when you sign up (Referral)

## Disclaimer

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. The official WhatsApp website can be found at https://whatsapp.com. "WhatsApp" as well as related names, marks, emblems and images are registered trademarks of their respective owners.
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. The official WhatsApp website can be found at [whatsapp.com][whatsapp]. "WhatsApp" as well as related names, marks, emblems and images are registered trademarks of their respective owners. Also it is not guaranteed you will not be blocked by using this method. WhatsApp does not allow bots or unofficial clients on their platform, so this shouldn't be considered totally safe.

## License

Copyright 2019 Pedro S Lopez

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this project except in compliance with the License.
You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Copyright 2019 Pedro S Lopez

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this project except in compliance with the License.
You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.


[website]: https://wwebjs.dev
[guide]: https://guide.wwebjs.dev/guide
[guide-source]: https://github.com/wwebjs/wwebjs.dev/tree/main
[documentation]: https://docs.wwebjs.dev/
[documentation-source]: https://github.com/pedroslopez/whatsapp-web.js/tree/main/docs
[discord]: https://discord.gg/H7DqQs4
[gitHub]: https://github.com/pedroslopez/whatsapp-web.js
[npm]: https://npmjs.org/package/whatsapp-web.js
[nodejs]: https://nodejs.org/en/download/
[examples]: https://github.com/pedroslopez/whatsapp-web.js/blob/master/example.js
[auth-strategies]: https://wwebjs.dev/guide/creating-your-bot/authentication.html
[google-chrome]: https://wwebjs.dev/guide/creating-your-bot/handling-attachments.html#caveat-for-sending-videos-and-gifs
[deprecated-video]: https://www.youtube.com/watch?v=hv1R1rLeVVE
[gitHub-sponsors]: https://github.com/sponsors/pedroslopez
[support-payPal]: https://www.paypal.me/psla/
[digitalocean]: https://m.do.co/c/73f906a36ed4
[contributing]: https://github.com/pedroslopez/whatsapp-web.js/blob/main/CODE_OF_CONDUCT.md
[whatsapp]: https://whatsapp.com
38 changes: 34 additions & 4 deletions example.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,30 @@ const client = new Client({
// proxyAuthentication: { username: 'username', password: 'password' },
puppeteer: {
// args: ['--proxy-server=proxy-server-that-requires-authentication.example.com'],
headless: true
headless: false,
}
});

// client initialize does not finish at ready now.
client.initialize();

client.on('loading_screen', (percent, message) => {
console.log('LOADING SCREEN', percent, message);
});

client.on('qr', (qr) => {
// Pairing code only needs to be requested once
let pairingCodeRequested = false;
client.on('qr', async (qr) => {
// NOTE: This event will not be fired if a session is specified.
console.log('QR RECEIVED', qr);

// paiuting code example
const pairingCodeEnabled = false;
if (pairingCodeEnabled && !pairingCodeRequested) {
const pairingCode = await client.requestPairingCode('96170100100'); // enter the target phone number
console.log('Pairing code enabled, code: '+ pairingCode);
pairingCodeRequested = true;
}
});

client.on('authenticated', () => {
Expand All @@ -29,8 +40,18 @@ client.on('auth_failure', msg => {
console.error('AUTHENTICATION FAILURE', msg);
});

client.on('ready', () => {
client.on('ready', async () => {
console.log('READY');
const debugWWebVersion = await client.getWWebVersion();
console.log(`WWebVersion = ${debugWWebVersion}`);

client.pupPage.on('pageerror', function(err) {
console.log('Page error: ' + err.toString());
});
client.pupPage.on('error', function(err) {
console.log('Page error: ' + err.toString());
});

});

client.on('message', async msg => {
Expand Down Expand Up @@ -593,4 +614,13 @@ client.on('group_membership_request', async (notification) => {
/** You can approve or reject the newly appeared membership request: */
await client.approveGroupMembershipRequestss(notification.chatId, notification.author);
await client.rejectGroupMembershipRequests(notification.chatId, notification.author);
});
});

client.on('message_reaction', async (reaction) => {
console.log('REACTION RECEIVED', reaction);
});

client.on('vote_update', (vote) => {
/** The vote that was affected: */
console.log(vote);
});
62 changes: 60 additions & 2 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import { EventEmitter } from 'events'
import { RequestInit } from 'node-fetch'
import * as puppeteer from 'puppeteer'
import InterfaceController from './src/util/InterfaceController'

declare namespace WAWebJS {

Expand All @@ -17,6 +18,9 @@ declare namespace WAWebJS {
/** Puppeteer browser running WhatsApp Web */
pupBrowser?: puppeteer.Browser

/** Client interactivity interface */
interface?: InterfaceController

/**Accepts an invitation to join a group */
acceptInvite(inviteCode: string): Promise<string>

Expand Down Expand Up @@ -111,6 +115,14 @@ declare namespace WAWebJS {
*/
muteChat(chatId: string, unmuteDate?: Date): Promise<void>

/**
* Request authentication via pairing code instead of QR code
* @param phoneNumber - Phone number in international, symbol-free format (e.g. 12025550108 for US, 551155501234 for Brazil)
* @param showNotification - Show notification to pair on phone number
* @returns {Promise<string>} - Returns a pairing code in format "ABCDEFGH"
*/
requestPairingCode(phoneNumber: string, showNotification = true): Promise<string>

/** Force reset of connection state for the client */
resetState(): Promise<void>

Expand Down Expand Up @@ -215,7 +227,7 @@ declare namespace WAWebJS {
/** Emitted when the client has been disconnected */
on(event: 'disconnected', listener: (
/** reason that caused the disconnect */
reason: WAState | "NAVIGATION"
reason: WAState | "LOGOUT"
) => void): this

/** Emitted when a user joins the chat via invite link or is added by an admin */
Expand Down Expand Up @@ -371,6 +383,14 @@ declare namespace WAWebJS {

/** Emitted when the RemoteAuth session is saved successfully on the external Database */
on(event: 'remote_session_saved', listener: () => void): this

/**
* Emitted when some poll option is selected or deselected,
* shows a user's current selected option(s) on the poll
*/
on(event: 'vote_update', listener: (
vote: PollVote
) => void): this
}

/** Current connection information */
Expand Down Expand Up @@ -1018,6 +1038,34 @@ declare namespace WAWebJS {
constructor(pollName: string, pollOptions: Array<string>, options?: PollSendOptions)
}

/** Represents a Poll Vote on WhatsApp */
export interface PollVote {
/** The person who voted */
voter: string;

/**
* The selected poll option(s)
* If it's an empty array, the user hasn't selected any options on the poll,
* may occur when they deselected all poll options
*/
selectedOptions: SelectedPollOption[];

/** Timestamp the option was selected or deselected at */
interractedAtTs: number;

/** The poll creation message associated with the poll vote */
parentMessage: Message;
}

/** Selected poll option structure */
export interface SelectedPollOption {
/** The local selected option ID */
id: number;

/** The option name */
name: string;
}

export interface Label {
/** Label name */
name: string,
Expand Down Expand Up @@ -1061,6 +1109,8 @@ declare namespace WAWebJS {
}[]
/** Send 'seen' status */
sendSeen?: boolean
/** Bot Wid when doing a bot mention like @Meta AI */
invokedBotWid?: string
/** Media to be sent */
media?: MessageMedia
/** Extra options */
Expand Down Expand Up @@ -1341,8 +1391,10 @@ declare namespace WAWebJS {
timestamp: number,
/** Amount of messages unread */
unreadCount: number,
/** Last message fo chat */
/** Last message of chat */
lastMessage: Message,
/** Indicates if the Chat is pinned */
pinned: boolean,

/** Archives this chat */
archive: () => Promise<void>,
Expand Down Expand Up @@ -1523,6 +1575,12 @@ declare namespace WAWebJS {
setSubject: (subject: string) => Promise<boolean>;
/** Updates the group description */
setDescription: (description: string) => Promise<boolean>;
/**
* Updates the group setting to allow only admins to add members to the group.
* @param {boolean} [adminsOnly=true] Enable or disable this option
* @returns {Promise<boolean>} Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.
*/
setAddMembersAdminsOnly: (adminsOnly?: boolean) => Promise<boolean>;
/** Updates the group settings to only allow admins to send messages
* @param {boolean} [adminsOnly=true] Enable or disable this option
* @returns {Promise<boolean>} Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "whatsapp-web.js",
"version": "1.23.1-alpha.5",
"version": "1.24.0",
"description": "Library for interacting with the WhatsApp Web API ",
"main": "./index.js",
"typings": "./index.d.ts",
Expand Down
Loading