sulla
2.4.0
Sulla 是一個 JavaScript 函式庫,它為 Whatsapp 提供高級 API 控制,因此可以將其配置為自動化回應或輕鬆通過 Whatsapp 的任何資料。
它是使用 puppeteer 建構的
從2.3.5
版本開始,sulla 似乎已經達到了非常豐富和穩定的功能和架構。儘管我很樂意,但我無法在這個專案上投入大量時間,因此請考慮查看 sulla 的分叉版本,其他開發人員可以在其中投入更多時間和支援。
推薦積極支持的基於蘇拉的項目:
毒液
wpp連接
開放 wa/wa 自動化
> npm i sulla --save
// Supports ES6
// import { create, Whatsapp } from 'sulla';
const sulla = require ( 'sulla' ) ;
sulla . create ( ) . then ( ( client ) => start ( client ) ) ;
function start ( client ) {
client . onMessage ( ( message ) => {
if ( message . body === 'Hi' ) {
client . sendText ( message . from , ' Hello from sulla!' ) ;
}
} ) ;
}
create()
函數後, sulla將建立一個whatsapp web實例。如果您尚未登錄,它將在終端中列印二維碼。用手機掃描一下,就可以出發了! create()
函數,可以同時建立多個會話: // Init sales whatsapp bot
sulla . create ( 'sales' ) . then ( ( salesClient ) => { ... } ) ;
// Init support whatsapp bot
sulla . create ( 'support' ) . then ( ( supportClient ) => { ... } ) ;
Sulla create()
方法的第三個參數可以有以下可選參數:
create ( 'sessionName' , qrCallback , {
headless : true , // Headless chrome
devtools : false , // Open devtools by default
useChrome : true , // If false will use Chromium instance
debug : false , // Opens a debug session
logQR : true // Logs QR automatically in terminal
browserArgs : [ '' ] // Parameters to be added into the chrome browser instance
refreshQR : 15000 , // Will refresh QR every 15 seconds, 0 will load QR once. Default is 30 seconds
} ) ;
預設情況下,二維碼將出現在終端機上。如果您需要將二維碼傳遞到其他地方,請按以下方式操作:
const fs = require ( 'fs' ) ;
// Second create() parameter is the QR callback
sulla . create ( 'session-marketing' , ( base64Qr , asciiQR ) => {
// To log the QR in the terminal
console . log ( asciiQR ) ;
// To write it somewhere else in a file
exportQR ( base64Qr , 'marketing-qr.png' ) ;
} ) ;
// Writes QR in specified path
function exportQR ( qrCode , path ) {
qrCode = qrCode . replace ( 'data:image/png;base64,' , '' ) ;
const imageBuffer = Buffer . from ( qrCode , 'base64' ) ;
// Creates 'marketing-qr.png' file
fs . writeFileSync ( path , imageBuffer ) ;
}
Puppeteer 負責檔案下載。解密正在盡可能快地完成(超過本機方法)。支援大檔案!
import fs = require ( 'fs' ) ;
import mime = require ( 'mime-types' ) ;
client . onMessage ( async ( message ) => {
if ( message . isMedia ) {
const buffer = await client . downloadFile ( message ) ;
// At this point you can do whatever you want with the buffer
// Most likely you want to write it into a file
const fileName = `some-file-name. ${ mime . extension ( message . mimetype ) } ` ;
fs . writeFile ( fileName , buffer , function ( err ) {
...
} ) ;
}
} ) ;
並未列出所有可用功能,為了進一步查看,每個可用功能都可以在此處和此處找到
chatId
可以是@c.us
或-@c.us
// Send basic text
await client . sendText ( chatId , ' Hello from sulla!' ) ;
// Send image
await client . sendImage (
chatId ,
'path/to/img.jpg' ,
'image-name.jpg' ,
'Caption text'
) ;
// Send @tagged message
await client . sendMentioned ( chatId , 'Hello @5218113130740 and @5218243160777!' , [
'5218113130740' ,
'5218243160777' ,
] ) ;
// Reply to a message
await client . reply ( chatId , 'This is a reply!' , message . id . toString ( ) ) ;
// Send file (sulla will take care of mime types, just need the path)
await client . sendFile ( chatId , 'path/to/file.pdf' , 'cv.pdf' , 'Curriculum' ) ;
// Send gif
await client . sendVideoAsGif (
chatId ,
'path/to/video.mp4' ,
'video.gif' ,
'Gif image file'
) ;
// Send contact
// contactId: [email protected]
await client . sendContact ( chatId , contactId ) ;
// Forwards messages
await client . forwardMessages ( chatId , [ message . id . toString ( ) ] , true ) ;
// Send sticker
await client . sendImageAsSticker ( chatId , 'path/to/image.jpg' ) ;
// Send location
await client . sendLocation (
chatId ,
25.6801987 ,
- 100.4060626 ,
'Some address, Washington DC' ,
'Subtitle'
) ;
// Send seen ✔️✔️
await client . sendSeen ( chatId ) ;
// Start typing...
await client . startTyping ( chatId ) ;
// Stop typing
await client . stopTyping ( chatId ) ;
// Set chat state (0: Typing, 1: Recording, 2: Paused)
await client . setChatState ( chatId , 0 | 1 | 2 ) ;
// Retrieve contacts
const contacts = await client . getAllContacts ( ) ;
// Retrieve all messages in chat
const allMessages = await client . loadAndGetAllMessagesInChat ( chatId ) ;
// Retrieve contact status
const status = await client . getStatus ( contactId ) ;
// Retrieve user profile
const user = await client . getNumberProfile ( contactId ) ;
// Retrieve all unread message
const messages = await client . getAllUnreadMessages ( ) ;
// Retrieve all chats
const chats = await client . getAllChats ( ) ;
// Retrieve all groups
const chats = await client . getAllGroups ( ) ;
// Retrieve profile fic (as url)
const url = await client . getProfilePicFromServer ( chatId ) ;
// Retrieve chat/conversation
const chat = await client . getChat ( chatId ) ;
// groupId or chatId: leaveGroup [email protected]
// Leave group
await client . leaveGroup ( groupId ) ;
// Get group members
await client . getGroupMembers ( groupId ) ;
// Get group members ids
await client . getGroupMembersIds ( groupId ) ;
// Generate group invite url link
await client . getGroupInviteLink ( groupId ) ;
// Create group (title, participants to add)
await client . createGroup ( 'Group name' , [ '[email protected]' , '[email protected]' ] ) ;
// Remove participant
await client . removeParticipant ( groupId , '[email protected]' ) ;
// Add participant
await client . addParticipant ( groupId , '[email protected]' ) ;
// Promote participant (Give admin privileges)
await client . promoteParticipant ( groupId , '[email protected]' ) ;
// Demote particiapnt (Revoke admin privileges)
await client . demoteParticipant ( groupId , '[email protected]' ) ;
// Get group admins
await client . getGroupAdmins ( groupId ) ;
// Set client status
await client . setProfileStatus ( 'On vacations! ✈️' ) ;
// Set client profile name
await client . setProfileName ( 'Sulla bot' ) ;
// Get device info
await client . getHostDevice ( ) ;
// Get connection state
await client . getConnectionState ( ) ;
// Get battery level
await client . getBatteryLevel ( ) ;
// Is connected
await client . isConnected ( ) ;
// Get whatsapp web version
await client . getWAVersion ( ) ;
// Listen to messages
client . onMessage ( message => {
...
} )
// Listen to state changes
client . onStateChange ( state => {
...
} ) ;
// Listen to ack's
client . onAck ( ack => {
...
} ) ;
// Listen to live location
// chatId: '[email protected]'
client . onLiveLocation ( chatId , ( liveLocation ) => {
...
} ) ;
// chatId looks like this: '[email protected]'
// Event interface is in here: https://github.com/danielcardeenas/sulla/blob/master/src/api/model/participant-event.ts
client . onParticipantsChanged ( chatId , ( event ) => {
...
} ) ;
// Listen when client has been added to a group
client . onAddedToGroup ( chatEvent => {
...
} ) ;
// Delete chat
await client . deleteChat ( chatId ) ;
// Clear chat messages
await client . clearChat ( chatId ) ;
// Delete message (last parameter: delete only locally)
await client . deleteMessage ( chatId , message . id . toString ( ) , false ) ;
// Retrieve a number profile / check if contact is a valid whatsapp number
const profile = await client . getNumberProfile ( '[email protected]' ) ;
有一些技巧可以更好地使用蘇拉。
// In case of being logged out of whatsapp web
// Force it to keep the current session
// State change
client . onStateChange ( ( state ) => {
console . log ( state ) ;
const conflits = [
sulla . SocketState . CONFLICT ,
sulla . SocketState . UNPAIRED ,
sulla . SocketState . UNLAUNCHED ,
] ;
if ( conflits . includes ( state ) ) {
client . useHere ( ) ;
}
} ) ;
另請參閱 Whatsapp 連結 請小心,因為這很可能會導致 Whatsapp 被禁止,請始終保持您的聯絡人更新!
await client . sendMessageToId ( '[email protected]' , 'Hello from sulla! ' ) ;
如果您需要一次執行多個會話,只需將會話名稱傳遞給create()
方法即可。
async ( ) => {
const marketingClient = await sulla . create ( 'marketing' ) ;
const salesClient = await sulla . create ( 'sales' ) ;
const supportClient = await sulla . create ( 'support' ) ;
} ;
正確關閉會話以確保下次登入時保存會話(因此不會再次要求進行二維碼掃描)。因此,不要使用 CTRL+C,
// Catch ctrl+C
process . on ( 'SIGINT' , function ( ) {
client . close ( ) ;
} ) ;
// Try-catch close
try {
...
} catch ( error ) {
client . close ( ) ;
}
建造蘇拉非常簡單,儘管它包含 3 個主要項目
> npm run build:wapi
> npm run build:build:middleware
> npm run build:jsQR
> npm run build:sulla
要建置整個項目,只需運行
> npm run build
需要維護人員,我一個人無法跟上所有的更新。如果您有興趣,請打開拉取請求。
歡迎請求請求。對於重大更改,請先開啟一個問題來討論您想要更改的內容。