كانت هذه المكتبة في الأصل مشروعًا لـ CS-2362 في جامعة أشوكا وهي ليست تابعة أو معتمدة من WhatsApp بأي حال من الأحوال. استخدم وفقًا لتقديرك الخاص. لا البريد المزعج الناس مع هذا. نحن لا نشجع أي استخدام لبرامج الملاحقة أو الرسائل المجمعة أو الآلية.
لا يمكن تحميل Baileys والقائمين عليها المسؤولية عن سوء استخدام هذا التطبيق، كما هو مذكور في ترخيص MIT. لا يتغاضى القائمون على Baileys بأي شكل من الأشكال عن استخدام هذا التطبيق في ممارسات تنتهك شروط خدمة WhatsApp. يدعو القائمون على هذا التطبيق إلى المسؤولية الشخصية لمستخدميه لاستخدام هذا التطبيق بطريقة عادلة، كما هو مقصود للاستخدام.
لا يتطلب Baileys أن يكون السيلينيوم أو أي متصفح آخر واجهة مع WhatsApp Web، فهو يفعل ذلك مباشرة باستخدام WebSocket . عدم تشغيل السيلينيوم أو Chromimum يوفر عليك ما يقرب من نصف جيجا من ذاكرة الوصول العشوائي :/ يدعم Baileys التفاعل مع إصدارات WhatsApp المتعددة الأجهزة والويب. شكرًا لـpokearaujo على كتابة ملاحظاته حول طريقة عمل WhatsApp MultiDevice. شكرًا أيضًا لـSigalor على كتابة ملاحظاته حول طريقة عمل WhatsApp Web وشكرًا لـRhymen على التنفيذ.
كان لا بد من إزالة المستودع الأصلي بواسطة المؤلف الأصلي - ونواصل الآن التطوير في هذا المستودع هنا. هذا هو المستودع الرسمي الوحيد ويحتفظ به المجتمع. انضم إلى الديسكورد هنا
قم بفحص وتشغيل example.ts لرؤية مثال لاستخدام المكتبة. يغطي البرنامج النصي حالات الاستخدام الأكثر شيوعًا. لتشغيل البرنامج النصي النموذجي، قم بتنزيل الريبو أو نسخه ثم اكتب ما يلي في الوحدة الطرفية:
cd path/to/Baileys
yarn
yarn example
استخدم الإصدار الثابت:
yarn add @whiskeysockets/baileys
استخدم الإصدار المتطور (لا يوجد ضمان للاستقرار، ولكن أحدث الإصلاحات + الميزات)
yarn add github:WhiskeySockets/Baileys
ثم قم باستيراد الكود الخاص بك باستخدام:
import makeWASocket from '@whiskeysockets/baileys'
المهام
يوفر WhatsApp واجهة برمجة تطبيقات متعددة الأجهزة تسمح بمصادقة Baileys كعميل WhatsApp ثانٍ عن طريق مسح رمز الاستجابة السريعة باستخدام 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
} )
من الواضح أنك لا تريد الاستمرار في مسح رمز الاستجابة السريعة في كل مرة تريد فيها الاتصال.
لذلك، يمكنك تحميل بيانات الاعتماد لتسجيل الدخول مرة أخرى:
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، حيث أن تخزين سجل الدردشة بالكامل لشخص ما في الذاكرة يعد إهدارًا رهيبًا لذاكرة الوصول العشوائي.
إرسال جميع أنواع الرسائل بوظيفة واحدة:
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 للشخص أو المجموعة التي ترسل الرسالة إليها.[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
بالمعرف الفعلي.
لإنشاء مجموعة
// 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"}
"الإطار" هو الرسالة المستلمة، ويتكون من ثلاثة مكونات:
tag
- ما يدور حوله هذا الإطار (على سبيل المثال، ستحتوي الرسالة على "رسالة")attrs
- زوج سلسلة مفاتيح وقيمة مع بعض البيانات الوصفية (يحتوي على معرف الرسالة عادةً)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 ) => { } )
أيضًا، تم ترخيص هذا الريبو الآن بموجب GPL 3 لأنه يستخدم عقدة libsignal