Baileys - WhatsApp Web API TypeScript 库
Baileys 是一个基于 WebSocket 的 TypeScript 库,用于与 WhatsApp Web API 交互。它不需要 Selenium 或任何浏览器,直接使用 WebSocket 进行通信,相比传统方案可节省约 500MB 内存。该库支持与 WhatsApp 的多设备版本和网页版进行交互。
·
Baileys - WhatsApp Web API TypeScript 库
项目描述
Baileys 是一个基于 WebSocket 的 TypeScript 库,用于与 WhatsApp Web API 交互。它不需要 Selenium 或任何浏览器,直接使用 WebSocket 进行通信,相比传统方案可节省约 500MB 内存。该库支持与 WhatsApp 的多设备版本和网页版进行交互。
功能特性
- 🚀 直接 WebSocket 连接:无需浏览器或 Selenium,直接与 WhatsApp Web 通信
- 💾 内存高效:相比传统方案节省约 500MB 内存
- 📱 多设备支持:支持 WhatsApp 多设备版本和网页版
- 🔒 端到端加密:实现 WhatsApp 的端到端加密协议
- 📦 模块化设计:提供清晰的 API 和模块化结构
- 🛠 TypeScript 支持:完整的类型定义和类型安全
- 🔄 实时同步:支持消息、联系人、群组等实时同步
安装指南
Baileys 需要 Node.js 20+ 环境运行:
npm install @whiskeysockets/baileys
或使用 yarn:
yarn add @whiskeysockets/baileys
使用说明
基本连接示例
import makeWASocket from '@whiskeysockets/baileys'
// 启动连接
const sock = makeWASocket({
// 可配置选项
printQRInTerminal: true
})
// 监听连接更新
sock.ev.on('connection.update', (update) => {
const { connection, lastDisconnect } = update
if(connection === 'close') {
// 重新连接逻辑
} else if(connection === 'open') {
console.log('成功连接')
}
})
// 监听新消息
sock.ev.on('messages.upsert', ({ messages }) => {
console.log('收到新消息:', messages)
})
发送消息
// 发送文本消息
await sock.sendMessage('1234567890@s.whatsapp.net', { text: '你好!' })
// 发送图片
await sock.sendMessage('1234567890@s.whatsapp.net', {
image: { url: 'path/to/image.jpg' },
caption: '这是一张图片'
})
核心代码
WebSocket 连接核心
export const makeSocket = (config: SocketConfig) => {
const { waWebSocketUrl, connectTimeoutMs, logger, version } = config
const url = typeof waWebSocketUrl === 'string'
? new URL(waWebSocketUrl)
: waWebSocketUrl
const sock = new WebSocket(url, {
origin: DEFAULT_ORIGIN,
headers: config.options?.headers,
handshakeTimeout: connectTimeoutMs
})
// 处理消息接收
sock.on('message', data => {
const node = decodeBinaryNode(data)
logger.trace({ node }, '收到二进制节点')
// 处理消息逻辑...
})
return {
sendNode: (node: BinaryNode) => {
const buffer = encodeBinaryNode(node)
sock.send(buffer)
},
// ...其他方法
}
}
消息加密解密
export class GroupCipher {
private readonly senderKeyStore: SenderKeyStore
private readonly senderKeyName: SenderKeyName
constructor(senderKeyStore: SenderKeyStore, senderKeyName: SenderKeyName) {
this.senderKeyStore = senderKeyStore
this.senderKeyName = senderKeyName
}
public async encrypt(paddedPlaintext: Uint8Array | string): Promise<Uint8Array> {
const record = await this.senderKeyStore.loadSenderKey(this.senderKeyName)
const senderKeyState = record.getSenderKeyState()
const iteration = senderKeyState.getSenderChainKey().getIteration()
const senderKey = this.getSenderKey(senderKeyState, iteration + 1)
const ciphertext = await this.getCipherText(
senderKey.getIv(),
senderKey.getCipherKey(),
paddedPlaintext
)
const senderKeyMessage = new SenderKeyMessage(
senderKeyState.getKeyId(),
senderKey.getIteration(),
ciphertext,
senderKeyState.getSigningKeyPrivate()
)
return senderKeyMessage.serialize()
}
}
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐

所有评论(0)