Perpustakaan ini awalnya merupakan proyek untuk CS-2362 di Universitas Ashoka dan sama sekali tidak berafiliasi atau didukung oleh WhatsApp. Gunakan sesuai kebijaksanaan Anda sendiri. Jangan mengirim spam ke orang lain dengan ini. Kami tidak menganjurkan penggunaan penguntit, pengiriman pesan massal atau otomatis.
Baileys dan pengelolanya tidak bertanggung jawab atas penyalahgunaan aplikasi ini, sebagaimana tercantum dalam lisensi MIT. Pengelola Baileys sama sekali tidak memaafkan penggunaan aplikasi ini dalam praktik yang melanggar Ketentuan Layanan WhatsApp. Pengelola aplikasi ini meminta tanggung jawab pribadi penggunanya untuk menggunakan aplikasi ini dengan cara yang adil, sebagaimana dimaksudkan untuk digunakan.
Baileys tidak memerlukan Selenium atau browser lain untuk berinteraksi dengan WhatsApp Web, ia melakukannya secara langsung menggunakan WebSocket . Tidak menjalankan Selenium atau Chromimum akan menghemat setengah giga ram :/ Baileys mendukung interaksi dengan WhatsApp versi multi-perangkat & web. Terima kasih kepada @pokearaujo yang telah menuliskan observasinya terhadap cara kerja WhatsApp Multi-Device. Terima kasih juga kepada @Sigalor yang telah menuliskan pengamatannya terhadap cara kerja WhatsApp Web dan terima kasih kepada @Rhymen atas implementasi go .
Repositori asli harus dihapus oleh pembuat aslinya - kami sekarang melanjutkan pengembangan dalam repositori ini di sini. Ini adalah satu-satunya repositori resmi dan dikelola oleh komunitas. Bergabunglah dengan Perselisihan di sini
Periksa & jalankan example.ts untuk melihat contoh penggunaan perpustakaan. Skrip ini mencakup sebagian besar kasus penggunaan umum. Untuk menjalankan skrip contoh, unduh atau kloning repo lalu ketik yang berikut ini di terminal:
cd path/to/Baileys
yarn
yarn example
Gunakan versi stabil:
yarn add @whiskeysockets/baileys
Gunakan versi edge (tidak ada jaminan stabilitas, tetapi perbaikan + fitur terbaru)
yarn add github:WhiskeySockets/Baileys
Kemudian impor kode Anda menggunakan:
import makeWASocket from '@whiskeysockets/baileys'
TODO
WhatsApp menyediakan API multi-perangkat yang memungkinkan Baileys diautentikasi sebagai klien WhatsApp kedua dengan memindai kode QR dengan WhatsApp di ponsel Anda.
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 ( )
Jika koneksi berhasil, Anda akan melihat kode QR tercetak di layar terminal Anda, pindai dengan WhatsApp di ponsel Anda dan Anda akan masuk!
Anda dapat mengonfigurasi koneksi dengan meneruskan objek SocketConfig
.
Seluruh struktur SocketConfig
disebutkan di sini dengan nilai default:
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
} )
Anda tentu tidak ingin terus-menerus memindai kode QR setiap kali ingin terhubung.
Jadi, Anda dapat memuat kredensial untuk masuk kembali:
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 )
Catatan: Saat pesan diterima/dikirim, karena sesi sinyal perlu diperbarui, kunci autentikasi ( authState.keys
) akan diperbarui. Kapan pun hal itu terjadi, Anda harus menyimpan kunci yang diperbarui ( authState.keys.set()
dipanggil). Tidak melakukan hal ini akan mencegah pesan Anda sampai ke penerima dan menyebabkan konsekuensi tak terduga lainnya. Fungsi useMultiFileAuthState
secara otomatis menangani hal itu, tetapi untuk implementasi serius lainnya -- Anda harus sangat berhati-hati dengan manajemen status kunci.
Baileys sekarang mengaktifkan event connection.update
untuk memberi tahu Anda bahwa ada sesuatu yang diperbarui dalam koneksi. Data ini memiliki struktur sebagai berikut:
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
}
Catatan: ini juga menawarkan pembaruan apa pun pada QR
Baileys menggunakan sintaks EventEmitter untuk acara. Semuanya diketik dengan baik, jadi Anda tidak akan mengalami masalah apa pun dengan editor Intellisense seperti VS Code.
Acara diketik seperti yang disebutkan di sini:
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 [ ]
}
Anda dapat mendengarkan acara seperti ini:
const sock = makeWASocket ( )
sock . ev . on ( 'messages.upsert' , ( { messages } ) => {
console . log ( 'got messages' , messages )
} )
Baileys tidak dilengkapi dengan penyimpanan defacto untuk obrolan, kontak, atau pesan. Namun, implementasi sederhana dalam memori telah disediakan. Toko mendengarkan pembaruan obrolan, pesan baru, pembaruan pesan, dll., untuk selalu mendapatkan versi data terkini.
Ini dapat digunakan sebagai berikut:
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 ) )
} )
Penyimpanan juga menyediakan beberapa fungsi sederhana seperti loadMessages
yang memanfaatkan penyimpanan untuk mempercepat pengambilan data.
Catatan: Saya sangat menyarankan untuk membuat penyimpanan data Anda sendiri terutama untuk koneksi MD, karena menyimpan seluruh riwayat obrolan seseorang di memori adalah pemborosan RAM.
Kirim semua jenis pesan dengan satu fungsi:
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
sebagai ketergantungan pada proyek Anda dengan yarn add link-preview-js
// send a link
const sentMsg = await sock . sendMessage ( id , { text : 'Hi, this was sent using https://github.com/adiwajshing/baileys' } )
Mengirim media (video, stiker, gambar) lebih mudah & efisien dari sebelumnya.
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
adalah ID WhatsApp orang atau grup yang Anda kirimi pesan.[country code][phone number]@s.whatsapp.net
[email protected]
.[email protected]
.[timestamp of creation]@broadcast
.status@broadcast
.jimp
atau sharp
sebagai ketergantungan dalam proyek Anda menggunakan yarn add jimp
atau yarn add sharp
. Thumbnail untuk video juga dapat dibuat secara otomatis, namun Anda harus menginstal ffmpeg
di sistem Anda. 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!
Serangkaian kunci pesan harus ditandai secara eksplisit sebagai telah dibaca sekarang. Di multi-perangkat, Anda tidak dapat menandai seluruh "obrolan" dibaca dengan Baileys Web. Ini berarti Anda harus melacak pesan yang belum dibaca.
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 ] )
ID pesan adalah pengidentifikasi unik dari pesan yang Anda tandai sebagai telah dibaca. Pada WAMessage
, messageID
dapat diakses menggunakan messageID = message.key.id
.
await sock . sendPresenceUpdate ( 'available' , id )
Ini memungkinkan orang/grup dengan id
mengetahui apakah Anda sedang online, offline, mengetik, dll.
presence
dapat berupa salah satu dari berikut ini:
type WAPresence = 'unavailable' | 'available' | 'composing' | 'recording' | 'paused'
Kehadirannya akan berakhir setelah sekitar 10 detik.
Catatan: Pada WhatsApp versi multi-perangkat -- jika klien desktop aktif, WA tidak mengirimkan pemberitahuan push ke perangkat. Jika Anda ingin menerima pemberitahuan tersebut -- tandai klien Baileys Anda offline menggunakan sock.sendPresenceUpdate('unavailable')
Jika Anda ingin menyimpan media yang Anda terima
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 )
}
}
Catatan: WhatsApp secara otomatis menghapus media lama dari servernya. Agar perangkat dapat mengakses media tersebut -- diperlukan pengunggahan ulang oleh perangkat lain yang memilikinya. Ini dapat dicapai dengan menggunakan:
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 } )
Catatan: penghapusan untuk diri sendiri didukung melalui chatModify
(bagian selanjutnya)
const jid = '[email protected]'
await sock . sendMessage ( jid , {
text : 'updated text goes here' ,
edit : response . key ,
} ) ;
WA menggunakan bentuk komunikasi terenkripsi untuk mengirim pembaruan obrolan/aplikasi. Ini sebagian besar telah diterapkan dan Anda dapat mengirimkan pembaruan berikut:
Arsipkan obrolan
const lastMsgInChat = await getLastMessageInChat ( '[email protected]' ) // implement this on your end
await sock . chatModify ( { archive : true , lastMessages : [ lastMsgInChat ] } , '[email protected]' )
Menonaktifkan/menyalakan obrolan
// mute for 8 hours
await sock . chatModify ( { mute : 8 * 60 * 60 * 1000 } , '[email protected]' , [ ] )
// unmute
await sock . chatModify ( { mute : null } , '[email protected]' , [ ] )
Tandai obrolan telah dibaca/belum dibaca
const lastMsgInChat = await getLastMessageInChat ( '[email protected]' ) // implement this on your end
// mark it unread
await sock . chatModify ( { markRead : false , lastMessages : [ lastMsgInChat ] } , '[email protected]' )
Hapus pesan untukku
await sock . chatModify (
{ clear : { messages : [ { id : 'ATWYHDNNWU81732J' , fromMe : true , timestamp : "1654823909" } ] } } ,
'[email protected]' ,
[ ]
)
Hapus obrolan
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]' )
Menyematkan/melepaskan sematan obrolan
await sock . chatModify ( {
pin : true // or `false` to unpin
} ,
'[email protected]' )
Membintangi/menghapus bintang pada pesan
await sock . chatModify ( {
star : {
messages : [ { id : 'messageID' , fromMe : true // or `false` }],
star : true // - true: Star Message; false: Unstar Message
} } , '[email protected]' ) ;
Catatan: jika Anda mengacaukan salah satu pembaruan, WA dapat mengeluarkan Anda dari semua perangkat dan Anda harus masuk lagi.
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 )
Tentu saja ganti xyz
dengan ID sebenarnya.
Untuk membuat grup
// 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
Untuk menambah/menghapus orang ke grup atau menurunkan/mempromosikan orang
// 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"
)
Untuk mengubah topik grup
await sock . groupUpdateSubject ( "[email protected]" , "New Subject!" )
Untuk mengubah deskripsi grup
await sock . groupUpdateDescription ( "[email protected]" , "New Description!" )
Untuk mengubah pengaturan grup
// 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' )
Untuk meninggalkan grup
await sock . groupLeave ( "[email protected]" ) // (will throw error if it fails)
Untuk mendapatkan kode undangan grup
const code = await sock . groupInviteCode ( "[email protected]" )
console . log ( "group code: " + code )
Untuk mencabut kode undangan dalam grup
const code = await sock . groupRevokeInvite ( "[email protected]" )
console . log ( "New group code: " + code )
Untuk menanyakan metadata grup
const metadata = await sock . groupMetadata ( "[email protected]" )
console . log ( metadata . id + ", title: " + metadata . subject + ", description: " + metadata . desc )
Untuk bergabung ke grup menggunakan kode undangan
const response = await sock . groupAcceptInvite ( "xxx" )
console . log ( "joined to: " + response )
Tentu saja ganti xxx
dengan kode undangan.
Untuk mendapatkan info grup dengan kode undangan
const response = await sock . groupGetInviteInfo ( "xxx" )
console . log ( "group information: " + response )
Untuk bergabung dengan grup menggunakan groupInviteMessage
const response = await sock . groupAcceptInviteV4 ( "[email protected]" , groupInviteMessage )
console . log ( "joined to: " + response )
Tentu saja ganti xxx
dengan kode undangan.
Untuk mendapatkan daftar, mintalah bergabung
const response = await sock . groupRequestParticipantsList ( "[email protected]" )
console . log ( response )
Untuk menyetujui/menolak permintaan bergabung
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 )
Pesan dapat dikirim ke siaran & cerita. Anda perlu menambahkan opsi pesan berikut di sendMessage, seperti ini:
sock . sendMessage ( jid , { image : { url : url } , caption : caption } , { backgroundColor : backgroundColor , font : font , statusJidList : statusJidList , broadcast : true } )
isi pesan dapat berupa extendedTextMessage atau imageMessage atau videoMessage atau voiceMessage
Anda dapat menambahkan backgroundColor dan opsi lain di opsi pesan
siaran: true mengaktifkan mode siaran
statusJidList: daftar orang-orang yang bisa Anda dapatkan yang perlu Anda berikan, yaitu orang-orang yang akan menerima pesan status ini.
Anda dapat mengirim pesan ke daftar siaran dengan cara yang sama seperti Anda mengirim pesan ke grup & obrolan individu.
Saat ini WA Web tidak mendukung pembuatan daftar siaran, tetapi Anda masih dapat menghapusnya.
ID Siaran dalam format 12345678@broadcast
Untuk menanyakan penerima & nama daftar siaran:
const bList = await sock . getBroadcastListInfo ( "1234@broadcast" )
console . log ( `list name: ${ bList . name } , recps: ${ bList . recipients } ` )
Baileys ditulis dengan mempertimbangkan fungsionalitas khusus. Daripada membagi proyek dan menulis ulang bagian internalnya, Anda cukup menulis ekstensi Anda sendiri.
Pertama, aktifkan pencatatan pesan yang tidak tertangani dari WhatsApp dengan mengatur:
const sock = makeWASocket ( {
logger : P ( { level : 'debug' } ) ,
} )
Ini akan memungkinkan Anda melihat semua jenis pesan yang dikirim WhatsApp di konsol.
Beberapa contoh:
Fungsi untuk melacak persentase baterai ponsel Anda. Anda mengaktifkan logging dan Anda akan melihat pesan tentang baterai Anda muncul di konsol: {"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"}
"Bingkai" adalah pesan yang diterima, ia memiliki tiga komponen:
tag
-- tentang apa bingkai ini (mis. pesan akan memiliki "pesan")attrs
-- pasangan nilai kunci string dengan beberapa metadata (biasanya berisi ID pesan)content
-- data aktual (mis. node pesan akan memiliki konten pesan aktual di dalamnya)Anda dapat mendaftarkan panggilan balik untuk suatu acara menggunakan yang berikut ini:
// 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 ) => { } )
Selain itu, repo ini sekarang dilisensikan di bawah GPL 3 karena menggunakan libsignal-node