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智能小助手)
公众号二维码
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐