เดิมห้องสมุดนี้เคยเป็นโครงการสำหรับ CS-2362 ที่มหาวิทยาลัย Ashoka และไม่มีส่วนเกี่ยวข้องหรือรับรองโดย WhatsApp แต่อย่างใด ใช้ตามดุลยพินิจของคุณเอง อย่าสแปมผู้คนด้วยสิ่งนี้ เราไม่สนับสนุนการใช้สตอล์กเกอร์แวร์ การส่งข้อความจำนวนมากหรือข้อความอัตโนมัติ
Baileys และผู้ดูแลไม่สามารถรับผิดชอบต่อการใช้แอปพลิเคชันนี้ในทางที่ผิด ตามที่ระบุไว้ในใบอนุญาต MIT ผู้ดูแล Baileys ไม่ยอมรับการใช้แอปพลิเคชันนี้ในทางปฏิบัติที่ละเมิดข้อกำหนดในการให้บริการของ WhatsApp ในทางใดทางหนึ่ง ผู้ดูแลแอปพลิเคชันนี้เรียกร้องความรับผิดชอบส่วนบุคคลของผู้ใช้ในการใช้แอปพลิเคชันนี้อย่างยุติธรรมตามที่มีจุดประสงค์เพื่อใช้งาน
Baileys ไม่ต้องการ Selenium หรือเบราว์เซอร์อื่นใดในการเชื่อมต่อกับ WhatsApp Web แต่ทำได้โดยตรงโดยใช้ WebSocket การไม่ใช้ Selenium หรือ Chromimum ช่วยให้คุณประหยัดได้ประมาณ ครึ่งกิกะ บิต :/ Baileys รองรับการโต้ตอบกับ WhatsApp เวอร์ชันหลายอุปกรณ์และเว็บ ขอขอบคุณ @pokearaujo สำหรับการเขียนข้อสังเกตเกี่ยวกับการทำงานของ WhatsApp Multi-Device นอกจากนี้ ขอขอบคุณ @Sigalor ที่เขียนข้อสังเกตเกี่ยวกับการทำงานของ WhatsApp Web และขอขอบคุณ @Rhymen สำหรับการใช้งาน go
ผู้เขียนต้นฉบับต้องลบพื้นที่เก็บข้อมูลดั้งเดิมออก - ขณะนี้เราดำเนินการพัฒนาในพื้นที่เก็บข้อมูลนี้ต่อไปที่นี่ นี่เป็นพื้นที่เก็บข้อมูลอย่างเป็นทางการเพียงแห่งเดียวและได้รับการดูแลโดยชุมชน เข้าร่วม Discord ที่นี่
ตรวจสอบและเรียกใช้ example.ts เพื่อดูตัวอย่างการใช้งานไลบรารี สคริปต์ครอบคลุมกรณีการใช้งานทั่วไปส่วนใหญ่ หากต้องการเรียกใช้สคริปต์ตัวอย่าง ให้ดาวน์โหลดหรือโคลน repo จากนั้นพิมพ์ข้อความต่อไปนี้ในเทอร์มินัล:
cd path/to/Baileys
yarn
yarn example
ใช้เวอร์ชันเสถียร:
yarn add @whiskeysockets/baileys
ใช้เวอร์ชัน Edge (ไม่รับประกันความเสถียร แต่มีการแก้ไข + คุณสมบัติล่าสุด)
yarn add github:WhiskeySockets/Baileys
จากนั้นนำเข้าโค้ดของคุณโดยใช้:
import makeWASocket from '@whiskeysockets/baileys'
สิ่งที่ต้องทำ
WhatsApp มี API หลายอุปกรณ์ที่ช่วยให้ Baileys ได้รับการรับรองว่าเป็นไคลเอ็นต์ WhatsApp ตัวที่สองโดยการสแกนโค้ด QR ด้วย WhatsApp บนโทรศัพท์ของคุณ
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 ( )
หากการเชื่อมต่อสำเร็จ คุณจะเห็นรหัส QR พิมพ์อยู่บนหน้าจอเทอร์มินัลของคุณ สแกนด้วย WhatsApp บนโทรศัพท์ของคุณ แล้วคุณจะเข้าสู่ระบบ!
คุณสามารถกำหนดค่าการเชื่อมต่อได้โดยส่งวัตถุ SocketConfig
โครงสร้าง SocketConfig
ทั้งหมดถูกกล่าวถึงที่นี่พร้อมค่าเริ่มต้น:
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
} )
เห็นได้ชัดว่าคุณไม่ต้องการสแกนโค้ด QR ทุกครั้งที่คุณต้องการเชื่อมต่อ
ดังนั้น คุณสามารถโหลดข้อมูลรับรองเพื่อกลับเข้าสู่ระบบได้:
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 )
หมายเหตุ: เมื่อได้รับ/ส่งข้อความ เนื่องจากเซสชันสัญญาณจำเป็นต้องอัปเดต คีย์การรับรองความถูกต้อง ( authState.keys
) จะถูกอัปเดต เมื่อใดก็ตามที่เกิดเหตุการณ์เช่นนี้ คุณต้องบันทึกคีย์ที่อัปเดต (เรียกว่า authState.keys.set()
) การไม่ทำเช่นนั้นจะป้องกันไม่ให้ข้อความของคุณส่งถึงผู้รับและทำให้เกิดผลที่ไม่คาดคิดอื่นๆ ฟังก์ชัน useMultiFileAuthState
จะดูแลสิ่งนั้นโดยอัตโนมัติ แต่สำหรับการใช้งานที่จริงจังอื่นๆ คุณจะต้องระมัดระวังอย่างมากกับการจัดการสถานะคีย์
ตอนนี้ Baileys จะเริ่มเหตุการณ์ connection.update
เพื่อแจ้งให้คุณทราบว่ามีบางอย่างอัปเดตในการเชื่อมต่อ ข้อมูลนี้มีโครงสร้างดังต่อไปนี้:
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
}
หมายเหตุ: สิ่งนี้ยังมีการอัปเดตใด ๆ สำหรับ QR ด้วย
Baileys ใช้ไวยากรณ์ EventEmitter สำหรับเหตุการณ์ ทั้งหมดได้รับการพิมพ์อย่างดี ดังนั้นคุณไม่ควรมีปัญหาใดๆ กับโปรแกรมแก้ไข Intellisense เช่น VS Code
เหตุการณ์จะถูกพิมพ์ตามที่กล่าวไว้ที่นี่:
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 [ ]
}
คุณสามารถฟังเหตุการณ์เหล่านี้ได้ดังนี้:
const sock = makeWASocket ( )
sock . ev . on ( 'messages.upsert' , ( { messages } ) => {
console . log ( 'got messages' , messages )
} )
Baileys ไม่มีพื้นที่จัดเก็บข้อมูลสำหรับการแชท รายชื่อติดต่อ หรือข้อความ อย่างไรก็ตาม มีการจัดเตรียมการใช้งานในหน่วยความจำแบบง่ายๆ ร้านค้าจะรับฟังการอัปเดตแชท ข้อความใหม่ การอัปเดตข้อความ ฯลฯ เพื่อให้มีข้อมูลเวอร์ชันอัปเดตอยู่เสมอ
มันสามารถใช้ได้ดังต่อไปนี้:
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 ) )
} )
ร้านค้ายังมีฟังก์ชันง่ายๆ บางอย่าง เช่น loadMessages
ที่ใช้ร้านค้าเพื่อเพิ่มความเร็วในการดึงข้อมูล
หมายเหตุ: ฉันขอแนะนำอย่างยิ่งให้สร้างที่เก็บข้อมูลของคุณเองโดยเฉพาะสำหรับการเชื่อมต่อ MD เนื่องจากการจัดเก็บประวัติการแชททั้งหมดของใครบางคนไว้ในหน่วยความจำจะทำให้เปลือง RAM อย่างมาก
ส่งข้อความทุกประเภทด้วยฟังก์ชันเดียว:
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
เป็นการพึ่งพาโครงการของคุณด้วย 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' } )
การส่งสื่อ (วิดีโอ สติกเกอร์ รูปภาพ) ง่ายและมีประสิทธิภาพมากกว่าที่เคย
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
คือ WhatsApp ID ของบุคคลหรือกลุ่มที่คุณส่งข้อความถึง[country code][phone number]@s.whatsapp.net
[email protected]
[email protected]
[timestamp of creation]@broadcast
status@broadcast
jimp
หรือ sharp
เป็นการพึ่งพาในโปรเจ็กต์ของคุณโดยใช้ yarn add jimp
หรือ yarn add sharp
ภาพขนาดย่อสำหรับวิดีโอสามารถสร้างได้โดยอัตโนมัติ แต่คุณต้องติดตั้ง ffmpeg
ในระบบของคุณ 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!
ชุดคีย์ข้อความจะต้องทำเครื่องหมายว่าอ่านแล้วอย่างชัดเจน ในหลายอุปกรณ์ คุณไม่สามารถทำเครื่องหมาย "แชท" ทั้งหมดว่าอ่านได้เหมือนเช่นเคยกับ Baileys Web ซึ่งหมายความว่าคุณต้องติดตามข้อความที่ยังไม่ได้อ่าน
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 ] )
รหัสข้อความคือตัวระบุเฉพาะของข้อความที่คุณทำเครื่องหมายว่าอ่านแล้ว บน WAMessage
คุณสามารถเข้าถึง messageID
ได้โดยใช้ messageID = message.key.id
await sock . sendPresenceUpdate ( 'available' , id )
ซึ่งจะทำให้บุคคล/กลุ่มที่มี id
ทราบว่าคุณกำลังออนไลน์ ออฟไลน์ กำลังพิมพ์ ฯลฯ
presence
อาจเป็นหนึ่งในสิ่งต่อไปนี้:
type WAPresence = 'unavailable' | 'available' | 'composing' | 'recording' | 'paused'
การแสดงตนจะสิ้นสุดลงหลังจากผ่านไปประมาณ 10 วินาที
หมายเหตุ: ใน WhatsApp เวอร์ชันหลายอุปกรณ์ หากไคลเอนต์เดสก์ท็อปทำงานอยู่ WA จะไม่ส่งการแจ้งเตือนแบบพุชไปยังอุปกรณ์ หากคุณต้องการรับการแจ้งเตือนดังกล่าว -- ทำเครื่องหมายไคลเอ็นต์ Baileys ของคุณแบบออฟไลน์โดยใช้ sock.sendPresenceUpdate('unavailable')
หากคุณต้องการบันทึกสื่อที่คุณได้รับ
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 )
}
}
หมายเหตุ: WhatsApp จะลบสื่อเก่าออกจากเซิร์ฟเวอร์โดยอัตโนมัติ เพื่อให้อุปกรณ์เข้าถึงสื่อดังกล่าวได้ จำเป็นต้องอัปโหลดซ้ำโดยอุปกรณ์อื่นที่มีสื่อนั้น สามารถทำได้โดยใช้:
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 } )
หมายเหตุ: รองรับการลบตัวเองผ่าน chatModify
(หัวข้อถัดไป)
const jid = '[email protected]'
await sock . sendMessage ( jid , {
text : 'updated text goes here' ,
edit : response . key ,
} ) ;
WA ใช้รูปแบบการสื่อสารที่เข้ารหัสเพื่อส่งการอัปเดตแชท/แอป มีการใช้งานเป็นส่วนใหญ่แล้ว และคุณสามารถส่งการอัปเดตต่อไปนี้:
เก็บถาวรการแชท
const lastMsgInChat = await getLastMessageInChat ( '[email protected]' ) // implement this on your end
await sock . chatModify ( { archive : true , lastMessages : [ lastMsgInChat ] } , '[email protected]' )
ปิดเสียง/เปิดเสียงการแชท
// mute for 8 hours
await sock . chatModify ( { mute : 8 * 60 * 60 * 1000 } , '[email protected]' , [ ] )
// unmute
await sock . chatModify ( { mute : null } , '[email protected]' , [ ] )
ทำเครื่องหมายแชทว่าอ่านแล้ว/ยังไม่ได้อ่าน
const lastMsgInChat = await getLastMessageInChat ( '[email protected]' ) // implement this on your end
// mark it unread
await sock . chatModify ( { markRead : false , lastMessages : [ lastMsgInChat ] } , '[email protected]' )
ลบข้อความให้ฉัน
await sock . chatModify (
{ clear : { messages : [ { id : 'ATWYHDNNWU81732J' , fromMe : true , timestamp : "1654823909" } ] } } ,
'[email protected]' ,
[ ]
)
ลบแชท
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]' )
ปักหมุด/เลิกปักหมุดแชท
await sock . chatModify ( {
pin : true // or `false` to unpin
} ,
'[email protected]' )
ติดดาว/เลิกติดดาวข้อความ
await sock . chatModify ( {
star : {
messages : [ { id : 'messageID' , fromMe : true // or `false` }],
star : true // - true: Star Message; false: Unstar Message
} } , '[email protected]' ) ;
หมายเหตุ: หากคุณทำให้การอัปเดตรายการใดรายการหนึ่งของคุณผิดพลาด WA สามารถนำคุณออกจากระบบอุปกรณ์ทั้งหมดได้ และคุณจะต้องเข้าสู่ระบบอีกครั้ง
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 )
แน่นอนแทนที่ xyz
ด้วย ID จริง
เพื่อสร้างกลุ่ม
// 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
เพื่อเพิ่ม/ลบบุคคลออกจากกลุ่มหรือลดระดับ/เลื่อนตำแหน่งบุคคล
// 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"
)
เพื่อเปลี่ยนเรื่องของกลุ่ม
await sock . groupUpdateSubject ( "[email protected]" , "New Subject!" )
หากต้องการเปลี่ยนคำอธิบายของกลุ่ม
await sock . groupUpdateDescription ( "[email protected]" , "New Description!" )
หากต้องการเปลี่ยนการตั้งค่ากลุ่ม
// 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' )
เพื่อออกจากกลุ่ม
await sock . groupLeave ( "[email protected]" ) // (will throw error if it fails)
เพื่อรับรหัสเชิญเข้ากลุ่ม
const code = await sock . groupInviteCode ( "[email protected]" )
console . log ( "group code: " + code )
หากต้องการเพิกถอนรหัสเชิญในกลุ่ม
const code = await sock . groupRevokeInvite ( "[email protected]" )
console . log ( "New group code: " + code )
เพื่อสอบถามข้อมูลเมตาของกลุ่ม
const metadata = await sock . groupMetadata ( "[email protected]" )
console . log ( metadata . id + ", title: " + metadata . subject + ", description: " + metadata . desc )
เพื่อเข้าร่วมกลุ่มโดยใช้รหัสเชิญ
const response = await sock . groupAcceptInvite ( "xxx" )
console . log ( "joined to: " + response )
แน่นอน แทนที่ xxx
ด้วยรหัสเชิญ
เพื่อรับข้อมูลกลุ่มด้วยรหัสเชิญ
const response = await sock . groupGetInviteInfo ( "xxx" )
console . log ( "group information: " + response )
หากต้องการเข้าร่วมกลุ่มโดยใช้ groupInviteMessage
const response = await sock . groupAcceptInviteV4 ( "[email protected]" , groupInviteMessage )
console . log ( "joined to: " + response )
แน่นอน แทนที่ xxx
ด้วยรหัสเชิญ
เพื่อรับรายการขอเข้าร่วม
const response = await sock . groupRequestParticipantsList ( "[email protected]" )
console . log ( response )
เพื่ออนุมัติ/ปฏิเสธคำขอเข้าร่วม
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 )
สามารถส่งข้อความไปยังการออกอากาศและเรื่องราวได้ คุณต้องเพิ่มตัวเลือกข้อความต่อไปนี้ใน sendMessage เช่นนี้
sock . sendMessage ( jid , { image : { url : url } , caption : caption } , { backgroundColor : backgroundColor , font : font , statusJidList : statusJidList , broadcast : true } )
เนื้อหาของข้อความอาจเป็นข้อความแบบขยายหรือข้อความรูปภาพหรือข้อความวิดีโอหรือข้อความเสียง
คุณสามารถเพิ่มสีพื้นหลังและตัวเลือกอื่นๆ ในตัวเลือกข้อความได้
ออกอากาศ: จริง เปิดใช้งานโหมดออกอากาศ
statusJidList: รายชื่อบุคคลที่คุณจะได้รับซึ่งคุณต้องระบุ ซึ่งเป็นบุคคลที่จะได้รับข้อความสถานะนี้
คุณสามารถส่งข้อความไปยังรายการบรอดแคสต์ได้ด้วยวิธีเดียวกับที่คุณส่งข้อความไปยังกลุ่มและการแชทส่วนตัว
ขณะนี้ WA Web ไม่รองรับการสร้างรายการออกอากาศ แต่คุณยังสามารถลบรายการออกอากาศได้
รหัสการออกอากาศอยู่ในรูปแบบ 12345678@broadcast
หากต้องการสอบถามผู้รับและชื่อรายการออกอากาศ:
const bList = await sock . getBroadcastListInfo ( "1234@broadcast" )
console . log ( `list name: ${ bList . name } , recps: ${ bList . recipients } ` )
Baileys เขียนขึ้นโดยคำนึงถึงฟังก์ชันการทำงานที่กำหนดเอง แทนที่จะแยกโปรเจ็กต์และเขียนภายในใหม่ คุณสามารถเขียนส่วนขยายของคุณเองได้
ขั้นแรก เปิดใช้งานการบันทึกข้อความที่ไม่ได้จัดการจาก WhatsApp โดยการตั้งค่า:
const sock = makeWASocket ( {
logger : P ( { level : 'debug' } ) ,
} )
สิ่งนี้จะช่วยให้คุณเห็นข้อความทุกประเภทที่ WhatsApp ส่งในคอนโซล
ตัวอย่างบางส่วน:
ฟังก์ชั่นติดตามเปอร์เซ็นต์แบตเตอรี่ของโทรศัพท์ของคุณ คุณเปิดใช้งานการบันทึกและคุณจะเห็นข้อความเกี่ยวกับแบตเตอรี่ของคุณปรากฏขึ้นในคอนโซล: {"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"}
"เฟรม" คือสิ่งที่ข้อความได้รับ ซึ่งมีองค์ประกอบ 3 ส่วน:
tag
-- เฟรมนี้เกี่ยวกับอะไร (เช่น ข้อความจะมี "ข้อความ")attrs
- คู่คีย์-ค่าสตริงพร้อมข้อมูลเมตาบางส่วน (โดยปกติจะมี ID ของข้อความ)content
-- ข้อมูลจริง (เช่น โหนดข้อความจะมีเนื้อหาข้อความจริงอยู่ในนั้น)คุณสามารถลงทะเบียนการติดต่อกลับสำหรับเหตุการณ์ได้โดยใช้สิ่งต่อไปนี้:
// 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 ) => { } )
นอกจากนี้ repo นี้ได้รับอนุญาตภายใต้ GPL 3 แล้ว เนื่องจากใช้ libsignal-node