- Whatsva - WhatsApp Web API
Whatsva fully uses nodejs without Selenium or any other browser to connect to WhatsApp Web. how to work whatsva via WebSocket and connect to Whatsapp Web. that way it can save ram usage on the server.
- Install
Create and cd to your NPM project directory and then in terminal, write:
npm install whatsva
Then import in your code using:
const WAWeb = require('whatsva')
const client = new WAWeb()
client.connect()
.then (([user, chats, contacts, unread]) => {
console.log ("oh hello " + user.name + " (" + user.id + ")")
console.log ("you have " + unread.length + " unread messages")
console.log ("you have " + chats.length + " chats")
})
.catch (err => console.log("unexpected error: " + err) )
If the connection is successful, you will see a QR code printed on your terminal screen, scan it with WhatsApp on your phone and you'll be logged in!
If you don't want to wait for WhatsApp to send all your chats while connecting, you can use the following function:
const client = new WAWeb()
client.connectSlim()
.then (user => {
console.log ("oh hello " + user.name + " (" + user.id + ")")
client.receiveChatsAndContacts ()
.then (([chats, contacts, unread]) => {
console.log ("you have " + unread.length + " unread messages")
console.log ("you have " + chats.length + " chats")
})
})
.catch (err => console.log("unexpected error: " + err))
-
Handling Events
Implement the following callbacks in your code:
-
Called when you have a pending unread message or recieve a new message
client.setOnUnreadMessage (m => {
const [notificationType, messageType] = client.getNotificationType(m)
console.log("got notification of type: " + notificationType)
console.log("message type: " + messageType)
}, false)
-
Called when you recieve an update on someone's presence, they went offline or online
client.setOnPresenceUpdate (json => console.log(json.id + " presence is " + json.type))
-
Called when your message gets delivered or read
client.setOnMessageStatusChange (json => {
let sent = json.to
if (json.participant)
sent += " ("+json.participant+")"
console.log(sent + " acknowledged message(s) " + json.ids + " as " + json.type + " at " + json.timestamp)
})
-
Called when the connection gets disconnected (either the server loses internet or the phone gets unpaired)
client.setOnUnexpectedDisconnect (err => console.log ("disconnected unexpectedly: " + err) )
-
Sending Messages
It's super simple
-
Send text messages using
client.sendTextMessage(id, "oh hello there!")
-
Send text messages & quote another message using
const options = {quoted: quotedMessage}
client.sendTextMessage(id, "oh hello there", options)
quotedMessage
is a message object
-
Send a location using
client.sendLocationMessage(id, 24.121231, 55.1121221)
-
Send a contact using
const vcard = 'BEGIN:VCARD\n'
+ 'VERSION:3.0\n'
+ 'FN:Jeff Singh\n'
+ 'ORG:Ashoka Uni;\n'
+ 'TEL;type=CELL;type=VOICE;waid=911234567890:+91 12345 67890\n'
+ 'END:VCARD'
client.sendContactMessage(id, "Jeff", vcard)
-
Send a media (image, video, sticker, pdf) message using
const buffer = fs.readFileSync("example/ma_gif.mp4")
const options = {gif: true, caption: "hello!"}
client.sendMediaMessage(id, buffer, WAWeb.MessageType.video, options)
- The thumbnail can be generated automatically for images & stickers. Though, to automatically generate thumbnails for videos, you need to have
ffmpeg
installed on your system mediaBuffer
is just a Buffer containing the contents of the media you want to sendmediaType
represents the type of message you are sending. This can be one of the following:
[
WAWeb.MessageType.image,
WAWeb.MessageType.video,
WAWeb.MessageType.audio,
WAWeb.MessageType.sticker
]
- Tested formats: png, jpeg, webp (sticker), mp4, ogg
The last parameter when sending messages is info
, a JSON object, providing some information about the message. It can have the following optional values:
info = {
caption: "hello there!",
thumbnail: "23GD#4/==",
mimetype: "application/pdf",
gif: true,
quoted: quotedMessage,
timestamp: Date()
}
id
is the WhatsApp id of the person or group you're sending the message to.
It must be in the format [country code][phone number]@s.whatsapp.net
, for example +19999999999@s.whatsapp.net
for people. For groups, it must be in the format 123456789-123345@g.us
. Do not attach @c.us
for individual people IDs, It won't work
client.sendReadReceipt(id, messageID)
The id is in the same format as mentioned earlier. The message ID is the unique identifier of the message that you are marking as read. On a message object, it can be accessed using messageID = message.key.id
.
client.updatePresence(id, WAWeb.Presence.available)
This lets the person/group with id
know whether you're online, offline, typing etc. where presence
can be one of the following:
[
WAWeb.Presence.available,
WAWeb.Presence.unavailable,
WAWeb.Presence.composing,
WAWeb.Presence.recording
]
- Decoding Media
If you want to save & process some images, videos, documents or stickers you received
client.setOnUnreadMessage (m => {
const messageType = client.getMessageType(m.message)
if (messageType !== WAWeb.MessageType.text && messageType !== WAWeb.MessageType.extendedText) {
client.decodeMediaMessage(m.message, "filename")
.then (meta => console.log(m.key.remoteJid + " sent media, saved at: " + meta.filename))
.catch (err => console.log("error in decoding message: " + err))
}
}
- Restoring Sessions
Once you connect successfully, you can get your authentication credentials using
const authJSON = client.base64EncodedAuthInfo()
Then you can use this JSON to log back in without needing to scan a QR code using
const authJSON = JSON.parse( fs.readFileSync("auth_info.json") )
client.connect (authJSON)
.then (([user, chats, contacts, unread]) => console.log ("yay connected"))
- Querying
- To check if a given ID is on WhatsApp
client.isOnWhatsApp ("xyz@c.us")
.then (([exists, id]) => console.log(id + (exists ? " exists " : " does not exist") + "on WhatsApp"))
- To query chat history on a group or with someone
client.loadConversation ("xyz-abc@g.us", 25)
.then (messages => console.log("got back " + messages.length + " messages"))
You can also load the entire conversation history if you want
client.loadEntireConversation ("xyz@c.us", (message) => console.log("Loaded message with ID: " + message.key.id))
.then (() => console.log("queried all messages"))
- To get the status of some person
client.getStatus ("xyz@c.us")
.then ((json, q) => console.log("status: " + json.status))
- To get the display picture of some person/group
client.getProfilePicture ("xyz@g.us")
.then (([json, q]) => console.log("download profile picture from: " + json.eurl))
- To get someone's presence (if they're typing, online)
client.requestPresenceUpdate ("xyz@c.us")
client.setOnPresenceUpdate (json => console.log(json.id + " presence is " + json.type))
Of course, replace xyz
with an actual ID. Also, append @c.us
for individuals & @g.us
for groups.
- Groups
- To query the metadata of a group
client.groupMetadata ("abcd-xyz@g.us")
.then (([json, _]) => console.log(json.id + ", title: " + json.subject + ", description: " + json.desc))
- To create a group
client.groupCreate ("My Fab Group", ["abcd@s.whatsapp.net", "efgh@s.whatsapp.net"])
.then (([json, _]) => {
console.log ("created group with id: " + json.gid)
client.sendTextMessage(json.gid, "hello everyone")
})
- To add people to a group
client.groupAdd ("abcd-xyz@g.us", ["abcd@s.whatsapp.net", "efgh@s.whatsapp.net"])
.then (([json, _]) => console.log("added successfully: " + (json.status===200)))
- To make someone admin on a group
client.groupMakeAdmin ("abcd-xyz@g.us", ["abcd@s.whatsapp.net", "efgh@s.whatsapp.net"])
.then (([json, _]) => console.log("made admin successfully: " + (json.status===200)))
- To leave a group
client.groupLeave ("abcd-xyz@g.us")
.then (([json, _]) => console.log("left group successfully: " + (json.status===200)))
- To get the invite code for a group
client.groupInviteCode ("abcd-xyz@g.us")
.then (code => console.log(code))
#- Note
we are not affiliated with WhatsApp. It is written for educational purposes only. Use at your own discretion.