Diese Bibliothek war ursprünglich ein Projekt für CS-2362 an der Ashoka University und steht in keiner Verbindung zu WhatsApp und wird von WhatsApp auch nicht unterstützt. Verwendung nach eigenem Ermessen. Spammen Sie die Leute damit nicht zu. Wir raten von jeglicher Nutzung von Stalkerware, Massennachrichten oder automatisierten Nachrichten ab.
Baileys und seine Betreuer können nicht für den Missbrauch dieser Anwendung haftbar gemacht werden, wie in der MIT-Lizenz angegeben. Die Betreiber von Baileys dulden in keiner Weise die Verwendung dieser Anwendung für Praktiken, die gegen die Nutzungsbedingungen von WhatsApp verstoßen. Die Betreuer dieser Anwendung fordern die persönliche Verantwortung ihrer Benutzer, diese Anwendung auf faire Weise zu nutzen, wie sie beabsichtigt ist.
Baileys benötigt weder Selenium noch einen anderen Browser als Schnittstelle zu WhatsApp Web, sondern nutzt direkt einen WebSocket . Wenn Sie Selenium oder Chromimum nicht ausführen, sparen Sie etwa einen halben GB RAM :/ Baileys unterstützt die Interaktion mit den Multi-Device- und Web-Versionen von WhatsApp. Vielen Dank an @pokearaujo für das Schreiben seiner Beobachtungen zur Funktionsweise von WhatsApp Multi-Device. Vielen Dank auch an @Sigalor für das Schreiben seiner Beobachtungen zur Funktionsweise von WhatsApp Web und an @Rhymen für die Go- Implementierung.
Das ursprüngliche Repository musste vom ursprünglichen Autor entfernt werden – wir entwickeln nun hier in diesem Repository weiter. Dies ist das einzige offizielle Repository und wird von der Community verwaltet. Treten Sie hier dem Discord bei
Schauen Sie sich example.ts an und führen Sie es aus, um ein Beispiel für die Verwendung der Bibliothek zu sehen. Das Skript deckt die häufigsten Anwendungsfälle ab. Um das Beispielskript auszuführen, laden Sie das Repo herunter oder klonen Sie es und geben Sie dann Folgendes in ein Terminal ein:
cd path/to/Baileys
yarn
yarn example
Verwenden Sie die stabile Version:
yarn add @whiskeysockets/baileys
Verwenden Sie die Edge-Version (keine Stabilitätsgarantie, aber neueste Fixes + Funktionen)
yarn add github:WhiskeySockets/Baileys
Importieren Sie dann Ihren Code mit:
import makeWASocket from '@whiskeysockets/baileys'
TODO
WhatsApp bietet eine geräteübergreifende API, mit der Baileys als zweiter WhatsApp-Client authentifiziert werden kann, indem ein QR-Code mit WhatsApp auf Ihrem Telefon gescannt wird.
import makeWASocket , { DisconnectReason } from '@whiskeysockets/baileys'
import { Boom } from '@hapi/boom'
async function connectToWhatsApp ( ) {
const sock = makeWASocket ( {
// can provide additional config here
printQRInTerminal : true
} )
sock . ev . on ( 'connection.update' , ( update ) => {
const { connection , lastDisconnect } = update
if ( connection === 'close' ) {
const shouldReconnect = ( lastDisconnect . error as Boom ) ?. output ?. statusCode !== DisconnectReason . loggedOut
console . log ( 'connection closed due to ' , lastDisconnect . error , ', reconnecting ' , shouldReconnect )
// reconnect if not logged out
if ( shouldReconnect ) {
connectToWhatsApp ( )
}
} else if ( connection === 'open' ) {
console . log ( 'opened connection' )
}
} )
sock . ev . on ( 'messages.upsert' , m => {
console . log ( JSON . stringify ( m , undefined , 2 ) )
console . log ( 'replying to' , m . messages [ 0 ] . key . remoteJid )
await sock . sendMessage ( m . messages [ 0 ] . key . remoteJid ! , { text : 'Hello there!' } )
} )
}
// run in main file
connectToWhatsApp ( )
Wenn die Verbindung erfolgreich ist, wird auf dem Bildschirm Ihres Terminals ein QR-Code angezeigt. Scannen Sie ihn mit WhatsApp auf Ihrem Telefon und Sie werden angemeldet!
Sie können die Verbindung konfigurieren, indem Sie ein SocketConfig
-Objekt übergeben.
Die gesamte SocketConfig
Struktur wird hier mit Standardwerten erwähnt:
type SocketConfig = {
/** the WS url to connect to WA */
waWebSocketUrl : string | URL
/** Fails the connection if the socket times out in this interval */
connectTimeoutMs : number
/** Default timeout for queries, undefined for no timeout */
defaultQueryTimeoutMs : number | undefined
/** ping-pong interval for WS connection */
keepAliveIntervalMs : number
/** proxy agent */
agent ?: Agent
/** pino logger */
logger : Logger
/** version to connect with */
version : WAVersion
/** override browser config */
browser : WABrowserDescription
/** agent used for fetch requests -- uploading/downloading media */
fetchAgent ?: Agent
/** should the QR be printed in the terminal */
printQRInTerminal : boolean
/** should events be emitted for actions done by this socket connection */
emitOwnEvents : boolean
/** provide a cache to store media, so does not have to be re-uploaded */
mediaCache ?: NodeCache
/** custom upload hosts to upload media to */
customUploadHosts : MediaConnInfo [ 'hosts' ]
/** time to wait between sending new retry requests */
retryRequestDelayMs : number
/** max msg retry count */
maxMsgRetryCount : number
/** time to wait for the generation of the next QR in ms */
qrTimeout ?: number ;
/** provide an auth state object to maintain the auth state */
auth : AuthenticationState
/** manage history processing with this control; by default will sync up everything */
shouldSyncHistoryMessage : ( msg : proto . Message . IHistorySyncNotification ) => boolean
/** transaction capability options for SignalKeyStore */
transactionOpts : TransactionCapabilityOptions
/** provide a cache to store a user's device list */
userDevicesCache ?: NodeCache
/** marks the client as online whenever the socket successfully connects */
markOnlineOnConnect : boolean
/**
* map to store the retry counts for failed messages;
* used to determine whether to retry a message or not */
msgRetryCounterMap ?: MessageRetryMap
/** width for link preview images */
linkPreviewImageThumbnailWidth : number
/** Should Baileys ask the phone for full history, will be received async */
syncFullHistory : boolean
/** Should baileys fire init queries automatically, default true */
fireInitQueries : boolean
/**
* generate a high quality link preview,
* entails uploading the jpegThumbnail to WA
* */
generateHighQualityLinkPreview : boolean
/** options for axios */
options : AxiosRequestConfig < any >
/**
* fetch a message from your store
* implement this so that messages failed to send (solves the "this message can take a while" issue) can be retried
* */
getMessage : ( key : proto . IMessageKey ) => Promise < proto . IMessage | undefined >
}
const conn = makeWASocket ( {
... otherOpts ,
// can use Windows, Ubuntu here too
browser : Browsers . macOS ( 'Desktop' ) ,
syncFullHistory : true
} )
Natürlich möchten Sie den QR-Code nicht jedes Mal scannen, wenn Sie eine Verbindung herstellen möchten.
Sie können also die Anmeldeinformationen laden, um sich erneut anzumelden:
import makeWASocket , { BufferJSON , useMultiFileAuthState } from '@whiskeysockets/baileys'
import * as fs from 'fs'
// utility function to help save the auth state in a single folder
// this function serves as a good guide to help write auth & key states for SQL/no-SQL databases, which I would recommend in any production grade system
const { state , saveCreds } = await useMultiFileAuthState ( 'auth_info_baileys' )
// will use the given state to connect
// so if valid credentials are available -- it'll connect without QR
const conn = makeWASocket ( { auth : state } )
// this will be called as soon as the credentials are updated
conn . ev . on ( 'creds.update' , saveCreds )
Hinweis: Wenn eine Nachricht empfangen/gesendet wird, weil Signalsitzungen aktualisiert werden müssen, werden die Authentifizierungsschlüssel ( authState.keys
) aktualisiert. In jedem Fall müssen Sie die aktualisierten Schlüssel speichern ( authState.keys.set()
wird aufgerufen). Andernfalls wird verhindert, dass Ihre Nachrichten den Empfänger erreichen und andere unerwartete Folgen haben. Die Funktion useMultiFileAuthState
kümmert sich automatisch darum, aber bei jeder anderen ernsthaften Implementierung müssen Sie bei der Schlüsselstatusverwaltung sehr vorsichtig sein.
Baileys löst jetzt das Ereignis connection.update
aus, um Sie darüber zu informieren, dass in der Verbindung etwas aktualisiert wurde. Diese Daten haben folgenden Aufbau:
type ConnectionState = {
/** connection is now open, connecting or closed */
connection : WAConnectionState
/** the error that caused the connection to close */
lastDisconnect ?: {
error : Error
date : Date
}
/** is this a new login */
isNewLogin ?: boolean
/** the current QR code */
qr ?: string
/** has the device received all pending notifications while it was offline */
receivedPendingNotifications ?: boolean
}
Hinweis: Hier werden auch Aktualisierungen des QR angeboten
Baileys verwendet die EventEmitter-Syntax für Ereignisse. Sie sind alle gut getippt, sodass Sie mit einem Intellisense-Editor wie VS Code keine Probleme haben sollten.
Die Ereignisse werden wie hier beschrieben typisiert:
export type BaileysEventMap = {
/** connection state has been updated -- WS closed, opened, connecting etc. */
'connection.update' : Partial < ConnectionState >
/** credentials updated -- some metadata, keys or something */
'creds.update' : Partial < AuthenticationCreds >
/** history sync, everything is reverse chronologically sorted */
'messaging-history.set' : {
chats : Chat [ ]
contacts : Contact [ ]
messages : WAMessage [ ]
isLatest : boolean
}
/** upsert chats */
'chats.upsert' : Chat [ ]
/** update the given chats */
'chats.update' : Partial < Chat > [ ]
/** delete chats with given ID */
'chats.delete' : string [ ]
'labels.association' : LabelAssociation
'labels.edit' : Label
/** presence of contact in a chat updated */
'presence.update' : { id : string , presences : { [ participant : string ] : PresenceData } }
'contacts.upsert' : Contact [ ]
'contacts.update' : Partial < Contact > [ ]
'messages.delete' : { keys : WAMessageKey [ ] } | { jid : string , all : true }
'messages.update' : WAMessageUpdate [ ]
'messages.media-update' : { key : WAMessageKey , media ?: { ciphertext : Uint8Array , iv : Uint8Array } , error ?: Boom } [ ]
/**
* add/update the given messages. If they were received while the connection was online,
* the update will have type: "notify"
* */
'messages.upsert' : { messages : WAMessage [ ] , type : MessageUpsertType }
/** message was reacted to. If reaction was removed -- then "reaction.text" will be falsey */
'messages.reaction' : { key : WAMessageKey , reaction : proto . IReaction } [ ]
'message-receipt.update' : MessageUserReceiptUpdate [ ]
'groups.upsert' : GroupMetadata [ ]
'groups.update' : Partial < GroupMetadata > [ ]
/** apply an action to participants in a group */
'group-participants.update' : { id : string , participants : string [ ] , action : ParticipantAction }
'blocklist.set' : { blocklist : string [ ] }
'blocklist.update' : { blocklist : string [ ] , type : 'add' | 'remove' }
/** Receive an update on a call, including when the call was received, rejected, accepted */
'call' : WACallEvent [ ]
}
Diese Veranstaltungen können Sie so anhören:
const sock = makeWASocket ( )
sock . ev . on ( 'messages.upsert' , ( { messages } ) => {
console . log ( 'got messages' , messages )
} )
Baileys verfügt nicht über einen De-facto-Speicher für Chats, Kontakte oder Nachrichten. Es wurde jedoch eine einfache In-Memory-Implementierung bereitgestellt. Der Store wartet auf Chat-Updates, neue Nachrichten, Nachrichtenaktualisierungen usw., um immer über eine aktuelle Version der Daten zu verfügen.
Es kann wie folgt verwendet werden:
import makeWASocket , { makeInMemoryStore } from '@whiskeysockets/baileys'
// the store maintains the data of the WA connection in memory
// can be written out to a file & read from it
const store = makeInMemoryStore ( { } )
// can be read from a file
store . readFromFile ( './baileys_store.json' )
// saves the state to a file every 10s
setInterval ( ( ) => {
store . writeToFile ( './baileys_store.json' )
} , 10_000 )
const sock = makeWASocket ( { } )
// will listen from this socket
// the store can listen from a new socket once the current socket outlives its lifetime
store . bind ( sock . ev )
sock . ev . on ( 'chats.upsert' , ( ) => {
// can use "store.chats" however you want, even after the socket dies out
// "chats" => a KeyedDB instance
console . log ( 'got chats' , store . chats . all ( ) )
} )
sock . ev . on ( 'contacts.upsert' , ( ) => {
console . log ( 'got contacts' , Object . values ( store . contacts ) )
} )
Der Store bietet auch einige einfache Funktionen wie loadMessages
, die den Store nutzen, um den Datenabruf zu beschleunigen.
Hinweis: Ich empfehle dringend, speziell für MD-Verbindungen einen eigenen Datenspeicher zu erstellen, da das Speichern des gesamten Chat-Verlaufs einer Person im Speicher eine schreckliche RAM-Verschwendung darstellt.
Senden Sie alle Arten von Nachrichten mit einer einzigen Funktion:
import { MessageType , MessageOptions , Mimetype } from '@whiskeysockets/baileys'
const id = '[email protected]' // the WhatsApp ID
// send a simple text!
const sentMsg = await sock . sendMessage ( id , { text : 'oh hello there' } )
// send a reply messagge
const sentMsg = await sock . sendMessage ( id , { text : 'oh hello there' } , { quoted : message } )
// send a mentions message
const sentMsg = await sock . sendMessage ( id , { text : '@12345678901' , mentions : [ '[email protected]' ] } )
// send a location!
const sentMsg = await sock . sendMessage (
id ,
{ location : { degreesLatitude : 24.121231 , degreesLongitude : 55.1121221 } }
)
// send a contact!
const vcard = 'BEGIN:VCARDn' // metadata of the contact card
+ 'VERSION:3.0n'
+ 'FN:Jeff Singhn' // full name
+ 'ORG:Ashoka Uni;n' // the organization of the contact
+ 'TEL;type=CELL;type=VOICE;waid=911234567890:+91 12345 67890n' // WhatsApp ID + phone number
+ 'END:VCARD'
const sentMsg = await sock . sendMessage (
id ,
{
contacts : {
displayName : 'Jeff' ,
contacts : [ { vcard } ]
}
}
)
const reactionMessage = {
react : {
text : "?" , // use an empty string to remove the reaction
key : message . key
}
}
const sendMsg = await sock . sendMessage ( id , reactionMessage )
link-preview-js
als Abhängigkeit zu Ihrem Projekt mit yarn add link-preview-js
hinzu // send a link
const sentMsg = await sock . sendMessage ( id , { text : 'Hi, this was sent using https://github.com/adiwajshing/baileys' } )
Das Versenden von Medien (Videos, Aufkleber, Bilder) ist einfacher und effizienter als je zuvor.
import { MessageType , MessageOptions , Mimetype } from '@whiskeysockets/baileys'
// Sending gifs
await sock . sendMessage (
id ,
{
video : fs . readFileSync ( "Media/ma_gif.mp4" ) ,
caption : "hello!" ,
gifPlayback : true
}
)
await sock . sendMessage (
id ,
{
video : "./Media/ma_gif.mp4" ,
caption : "hello!" ,
gifPlayback : true ,
ptv : false // if set to true, will send as a `video note`
}
)
// send an audio file
await sock . sendMessage (
id ,
{ audio : { url : "./Media/audio.mp3" } , mimetype : 'audio/mp4' }
{ url : "Media/audio.mp3" } , // can send mp3, mp4, & ogg
)
id
ist die WhatsApp-ID der Person oder Gruppe, an die Sie die Nachricht senden.[country code][phone number]@s.whatsapp.net
vorliegen[email protected]
.[email protected]
haben.[timestamp of creation]@broadcast
.status@broadcast
.yarn add jimp
oder yarn add sharp
jimp
“ oder „ sharp
“ als Abhängigkeit hinzu. Miniaturansichten für Videos können auch automatisch generiert werden, allerdings muss ffmpeg
auf Ihrem System installiert sein. const info : MessageOptions = {
quoted : quotedMessage , // the message you want to quote
contextInfo : { forwardingScore : 2 , isForwarded : true } , // some random context info (can show a forwarded message with this too)
timestamp : Date ( ) , // optional, if you want to manually set the timestamp of the message
caption : "hello there!" , // (for media messages) the caption to send with the media (cannot be sent with stickers though)
jpegThumbnail : "23GD#4/==" , /* (for location & media messages) has to be a base 64 encoded JPEG if you want to send a custom thumb,
or set to null if you don't want to send a thumbnail.
Do not enter this field if you want to automatically generate a thumb
*/
mimetype : Mimetype . pdf , /* (for media messages) specify the type of media (optional for all media types except documents),
import {Mimetype} from '@whiskeysockets/baileys'
*/
fileName : 'somefile.pdf' , // (for media messages) file name for the media
/* will send audio messages as voice notes, if set to true */
ptt : true ,
/** Should it send as a disappearing messages.
* By default 'chat' -- which follows the setting of the chat */
ephemeralExpiration : WA_DEFAULT_EPHEMERAL
}
const msg = getMessageFromStore ( '[email protected]' , 'HSJHJWH7323HSJSJ' ) // implement this on your end
await sock . sendMessage ( '[email protected]' , { forward : msg } ) // WA forward the message!
Eine Reihe von Nachrichtenschlüsseln muss explizit als „jetzt gelesen“ markiert werden. Bei mehreren Geräten können Sie mit Baileys Web nicht einen gesamten „Chat“ als gelesen markieren. Das bedeutet, dass Sie den Überblick über ungelesene Nachrichten behalten müssen.
const key = {
remoteJid : '[email protected]' ,
id : 'AHASHH123123AHGA' , // id of the message you want to read
participant : '[email protected]' // the ID of the user that sent the message (undefined for individual chats)
}
// pass to readMessages function
// can pass multiple keys to read multiple messages as well
await sock . readMessages ( [ key ] )
Die Nachrichten-ID ist die eindeutige Kennung der Nachricht, die Sie als gelesen markieren. Bei einer WAMessage
kann auf die messageID
mit messageID = message.key.id
zugegriffen werden.
await sock . sendPresenceUpdate ( 'available' , id )
Dadurch weiß die Person/Gruppe mit id
, ob Sie online, offline sind, tippen usw.
presence
kann eine der folgenden sein:
type WAPresence = 'unavailable' | 'available' | 'composing' | 'recording' | 'paused'
Die Präsenz erlischt nach ca. 10 Sekunden.
Hinweis: In der Multi-Geräte-Version von WhatsApp sendet WA keine Push-Benachrichtigungen an das Gerät, wenn ein Desktop-Client aktiv ist. Wenn Sie diese Benachrichtigungen erhalten möchten, markieren Sie Ihren Baileys-Client mit sock.sendPresenceUpdate('unavailable')
offline.
Wenn Sie die erhaltenen Medien speichern möchten
import { writeFile } from 'fs/promises'
import { downloadMediaMessage } from '@whiskeysockets/baileys'
sock . ev . on ( 'messages.upsert' , async ( { messages } ) => {
const m = messages [ 0 ]
if ( ! m . message ) return // if there is no text or media message
const messageType = Object . keys ( m . message ) [ 0 ] // get what type of message it is -- text, image, video
// if the message is an image
if ( messageType === 'imageMessage' ) {
// download the message
const buffer = await downloadMediaMessage (
m ,
'buffer' ,
{ } ,
{
logger ,
// pass this so that baileys can request a reupload of media
// that has been deleted
reuploadRequest : sock . updateMediaMessage
}
)
// save to file
await writeFile ( './my-download.jpeg' , buffer )
}
}
Hinweis: WhatsApp entfernt alte Medien automatisch von seinen Servern. Damit das Gerät auf die Medien zugreifen kann, ist ein erneuter Upload durch ein anderes Gerät erforderlich, auf dem diese Medien vorhanden sind. Dies kann erreicht werden mit:
const updatedMediaMsg = await sock . updateMediaMessage ( msg )
const jid = '[email protected]' // can also be a group
const response = await sock . sendMessage ( jid , { text : 'hello!' } ) // send a message
// sends a message to delete the given message
// this deletes the message for everyone
await sock . sendMessage ( jid , { delete : response . key } )
Hinweis: Das Löschen für sich selbst wird über chatModify
unterstützt (nächster Abschnitt).
const jid = '[email protected]'
await sock . sendMessage ( jid , {
text : 'updated text goes here' ,
edit : response . key ,
} ) ;
WA verwendet eine verschlüsselte Kommunikationsform, um Chat-/App-Updates zu senden. Dies wurde größtenteils implementiert und Sie können die folgenden Updates senden:
Archivieren Sie einen Chat
const lastMsgInChat = await getLastMessageInChat ( '[email protected]' ) // implement this on your end
await sock . chatModify ( { archive : true , lastMessages : [ lastMsgInChat ] } , '[email protected]' )
Einen Chat stummschalten bzw. die Stummschaltung aufheben
// mute for 8 hours
await sock . chatModify ( { mute : 8 * 60 * 60 * 1000 } , '[email protected]' , [ ] )
// unmute
await sock . chatModify ( { mute : null } , '[email protected]' , [ ] )
Markieren Sie einen Chat als gelesen/ungelesen
const lastMsgInChat = await getLastMessageInChat ( '[email protected]' ) // implement this on your end
// mark it unread
await sock . chatModify ( { markRead : false , lastMessages : [ lastMsgInChat ] } , '[email protected]' )
Eine Nachricht für mich löschen
await sock . chatModify (
{ clear : { messages : [ { id : 'ATWYHDNNWU81732J' , fromMe : true , timestamp : "1654823909" } ] } } ,
'[email protected]' ,
[ ]
)
Einen Chat löschen
const lastMsgInChat = await getLastMessageInChat ( '[email protected]' ) // implement this on your end
await sock . chatModify ( {
delete : true ,
lastMessages : [ { key : lastMsgInChat . key , messageTimestamp : lastMsgInChat . messageTimestamp } ]
} ,
'[email protected]' )
Einen Chat anpinnen/lösen
await sock . chatModify ( {
pin : true // or `false` to unpin
} ,
'[email protected]' )
Eine Nachricht markieren bzw. die Markierung aufheben
await sock . chatModify ( {
star : {
messages : [ { id : 'messageID' , fromMe : true // or `false` }],
star : true // - true: Star Message; false: Unstar Message
} } , '[email protected]' ) ;
Hinweis: Wenn Sie eines Ihrer Updates vermasseln, kann WA Sie von allen Ihren Geräten abmelden und Sie müssen sich erneut anmelden.
const jid = '[email protected]' // can also be a group
// turn on disappearing messages
await sock . sendMessage (
jid ,
// this is 1 week in seconds -- how long you want messages to appear for
{ disappearingMessagesInChat : WA_DEFAULT_EPHEMERAL }
)
// will send as a disappearing message
await sock . sendMessage ( jid , { text : 'hello' } , { ephemeralExpiration : WA_DEFAULT_EPHEMERAL } )
// turn off disappearing messages
await sock . sendMessage (
jid ,
{ disappearingMessagesInChat : false }
)
const id = '123456'
const [ result ] = await sock . onWhatsApp ( id )
if ( result . exists ) console . log ( ` ${ id } exists on WhatsApp, as jid: ${ result . jid } ` )
const status = await sock . fetchStatus ( "[email protected]" )
console . log ( "status: " + status )
const status = 'Hello World!'
await sock . updateProfileStatus ( status )
const name = 'My name'
await sock . updateProfileName ( name )
// for low res picture
const ppUrl = await sock . profilePictureUrl ( "[email protected]" )
console . log ( "download profile picture from: " + ppUrl )
// for high res picture
const ppUrl = await sock . profilePictureUrl ( "[email protected]" , 'image' )
const jid = '[email protected]' // can be your own too
await sock . updateProfilePicture ( jid , { url : './new-profile-picture.jpeg' } )
const jid = '[email protected]' // can be your own too
await sock . removeProfilePicture ( jid )
// the presence update is fetched and called here
sock . ev . on ( 'presence.update' , json => console . log ( json ) )
// request updates for a chat
await sock . presenceSubscribe ( "[email protected]" )
await sock . updateBlockStatus ( "[email protected]" , "block" ) // Block user
await sock . updateBlockStatus ( "[email protected]" , "unblock" ) // Unblock user
const profile = await sock . getBusinessProfile ( "[email protected]" )
console . log ( "business description: " + profile . description + ", category: " + profile . category )
Ersetzen Sie xyz
natürlich durch eine tatsächliche ID.
Um eine Gruppe zu erstellen
// title & participants
const group = await sock . groupCreate ( "My Fab Group" , [ "[email protected]" , "[email protected]" ] )
console . log ( "created group with id: " + group . gid )
sock . sendMessage ( group . id , { text : 'hello there' } ) // say hello to everyone on the group
Um Personen zu einer Gruppe hinzuzufügen/zu entfernen oder Personen herabzustufen/befördern
// id & people to add to the group (will throw error if it fails)
const response = await sock . groupParticipantsUpdate (
"[email protected]" ,
[ "[email protected]" , "[email protected]" ] ,
"add" // replace this parameter with "remove", "demote" or "promote"
)
Um das Thema der Gruppe zu ändern
await sock . groupUpdateSubject ( "[email protected]" , "New Subject!" )
Um die Beschreibung der Gruppe zu ändern
await sock . groupUpdateDescription ( "[email protected]" , "New Description!" )
Um Gruppeneinstellungen zu ändern
// only allow admins to send messages
await sock . groupSettingUpdate ( "[email protected]" , 'announcement' )
// allow everyone to send messages
await sock . groupSettingUpdate ( "[email protected]" , 'not_announcement' )
// allow everyone to modify the group's settings -- like display picture etc.
await sock . groupSettingUpdate ( "[email protected]" , 'unlocked' )
// only allow admins to modify the group's settings
await sock . groupSettingUpdate ( "[email protected]" , 'locked' )
Eine Gruppe verlassen
await sock . groupLeave ( "[email protected]" ) // (will throw error if it fails)
Um den Einladungscode für eine Gruppe zu erhalten
const code = await sock . groupInviteCode ( "[email protected]" )
console . log ( "group code: " + code )
Um den Einladungscode in einer Gruppe zu widerrufen
const code = await sock . groupRevokeInvite ( "[email protected]" )
console . log ( "New group code: " + code )
Um die Metadaten einer Gruppe abzufragen
const metadata = await sock . groupMetadata ( "[email protected]" )
console . log ( metadata . id + ", title: " + metadata . subject + ", description: " + metadata . desc )
Um der Gruppe beizutreten, verwenden Sie den Einladungscode
const response = await sock . groupAcceptInvite ( "xxx" )
console . log ( "joined to: " + response )
Ersetzen Sie xxx
natürlich durch den Einladungscode.
Um Gruppeninformationen per Einladungscode zu erhalten
const response = await sock . groupGetInviteInfo ( "xxx" )
console . log ( "group information: " + response )
Um der Gruppe mit groupInviteMessage beizutreten
const response = await sock . groupAcceptInviteV4 ( "[email protected]" , groupInviteMessage )
console . log ( "joined to: " + response )
Ersetzen Sie xxx
natürlich durch den Einladungscode.
Um eine Liste zu erhalten, beantragen Sie den Beitritt
const response = await sock . groupRequestParticipantsList ( "[email protected]" )
console . log ( response )
So genehmigen/ablehnen Sie eine Beitrittsanfrage
const response = await sock . groupRequestParticipantsUpdate (
"[email protected]" , // id group,
[ "[email protected]" , "[email protected]" ] ,
"approve" // replace this parameter with "reject"
)
console . log ( response )
const privacySettings = await sock . fetchPrivacySettings ( true )
console . log ( "privacy settings: " + privacySettings )
const value = 'all' // 'contacts' | 'contact_blacklist' | 'none'
await sock . updateLastSeenPrivacy ( value )
const value = 'all' // 'match_last_seen'
await sock . updateOnlinePrivacy ( value )
const value = 'all' // 'contacts' | 'contact_blacklist' | 'none'
await sock . updateProfilePicturePrivacy ( value )
const value = 'all' // 'contacts' | 'contact_blacklist' | 'none'
await sock . updateStatusPrivacy ( value )
const value = 'all' // 'none'
await sock . updateReadReceiptsPrivacy ( value )
const value = 'all' // 'contacts' | 'contact_blacklist'
await sock . updateGroupsAddPrivacy ( value )
const duration = 86400 // 604800 | 7776000 | 0
await sock . updateDefaultDisappearingMode ( duration )
Nachrichten können an Sendungen und Geschichten gesendet werden. Sie müssen in sendMessage die folgenden Nachrichtenoptionen hinzufügen, etwa so:
sock . sendMessage ( jid , { image : { url : url } , caption : caption } , { backgroundColor : backgroundColor , font : font , statusJidList : statusJidList , broadcast : true } )
Der Nachrichtentext kann eine erweiterte Textnachricht, eine Bildnachricht, eine Videonachricht oder eine Sprachnachricht sein
Sie können in den Nachrichtenoptionen die Hintergrundfarbe und andere Optionen hinzufügen
Broadcast: True aktiviert den Broadcast-Modus
statusJidList: Eine Liste der Personen, die Sie erhalten können und die Sie angeben müssen. Diese Personen erhalten diese Statusmeldung.
Sie können Nachrichten an Broadcast-Listen auf die gleiche Weise senden, wie Sie Nachrichten an Gruppen und einzelne Chats senden.
Derzeit unterstützt WA Web das Erstellen von Broadcast-Listen nicht, Sie können diese jedoch trotzdem löschen.
Broadcast-IDs haben das Format 12345678@broadcast
So fragen Sie die Empfänger und Namen einer Broadcast-Liste ab:
const bList = await sock . getBroadcastListInfo ( "1234@broadcast" )
console . log ( `list name: ${ bList . name } , recps: ${ bList . recipients } ` )
Baileys wurde mit Blick auf benutzerdefinierte Funktionen geschrieben. Anstatt das Projekt zu forken und die Interna neu zu schreiben, können Sie einfach Ihre eigenen Erweiterungen schreiben.
Aktivieren Sie zunächst die Protokollierung nicht bearbeiteter Nachrichten von WhatsApp, indem Sie Folgendes festlegen:
const sock = makeWASocket ( {
logger : P ( { level : 'debug' } ) ,
} )
Dadurch können Sie alle Arten von Nachrichten sehen, die WhatsApp in der Konsole sendet.
Einige Beispiele:
Funktion zum Verfolgen des Akkuladestands Ihres Telefons. Sie aktivieren die Protokollierung und in der Konsole wird eine Meldung zu Ihrem Akku angezeigt: {"level":10,"fromMe":false,"frame":{"tag":"ib","attrs":{"from":"@s.whatsapp.net"},"content":[{"tag":"edge_routing","attrs":{},"content":[{"tag":"routing_info","attrs":{},"content":{"type":"Buffer","data":[8,2,8,5]}}]}]},"msg":"communication"}
Der „Rahmen“ ist die empfangene Nachricht, er besteht aus drei Komponenten:
tag
– worum es in diesem Frame geht (z. B. hat die Nachricht „Nachricht“)attrs
– ein Zeichenfolgen-Schlüssel-Wert-Paar mit einigen Metadaten (enthält normalerweise die ID der Nachricht)content
– die tatsächlichen Daten (z. B. enthält ein Nachrichtenknoten den tatsächlichen Nachrichteninhalt)Sie können einen Rückruf für eine Veranstaltung wie folgt registrieren:
// for any message with tag 'edge_routing'
sock . ws . on ( `CB:edge_routing` , ( node : BinaryNode ) => { } )
// for any message with tag 'edge_routing' and id attribute = abcd
sock . ws . on ( `CB:edge_routing,id:abcd` , ( node : BinaryNode ) => { } )
// for any message with tag 'edge_routing', id attribute = abcd & first content node routing_info
sock . ws . on ( `CB:edge_routing,id:abcd,routing_info` , ( node : BinaryNode ) => { } )
Außerdem ist dieses Repo jetzt unter GPL 3 lizenziert, da es libsignal-node verwendet