创建和管理 Whatsapp Web JS 的多个实例

2024-03-29

我的文件中有一个类whatsappWebSession.

import { Client, LocalAuth } from "whatsapp-web.js";

class WhatsappWebSession {
  constructor(callback, readyCallback) {
    this.client = new Client({
      puppeteer: {
        headless: true,
        args: \[
          '--no-sandbox',
        \]
      },
      authStrategy: new LocalAuth({
        clientId: 'client-id',
        dataPath: './session.json',
      })
    });
    this.client.on('qr', (qr) =\> {
      this.qr = qr;
      callback(qr);
    });
    this.client.on('ready', () =\> {
      console.log('Client is ready!');
      readyCallback();
    });

    this.client.initialize();
  }

  getQr() {
    return this.qr;
  }

  getClient() {
    return this.client;
  }

  async destroy() {
    await this.client.destroy();
  }

  async restart() {
    await this.destroy();
    this.client = new Client();
    this.client.on('qr', (qr) => {
      this.qr = qr;
    });
    this.client.initialize();
  }
}

export default WhatsappWebSession;

例如,现在进行快速 API 调用/new-client?id=client-id。 我为这个类创建一个新对象。

我想要的是像我创建这个类的几个对象,它们仍然在后台运行,并且我可以获得任何具有 client-id 的客户端,例如 session.getClient(client-id) 。

如何实现这一目标?

我尝试使用 authstrategy 每次创建一个新对象,然后在 API 响应关闭后销毁它。 但速度非常慢。


我通过创建一个单例客户端管理器实例解决了这个问题,该实例将负责根据唯一标识符存储客户端实例。每次我们需要从特定客户端发送消息时,管理器都会根据客户端的唯一密钥返回客户端。

为了方便起见,我使用了来自的会话IDexpress-session中间件作为实例的 uniqueId。

经理的代码:

const { Client, LocalAuth } = require("whatsapp-web.js");
const QRCode = require("qrcode");
const { readdir } = require("fs/promises");
const { WhatsappWebSession } = require('./WhatsappWebSession')

const getDirectories = async source =>
  (await readdir(source, { withFileTypes: true }))
    .filter(dirent => dirent.isDirectory())
    .map(dirent => dirent.name);

class WhatsappSessionManager {
  sessionIdVsClientInstance = {};

  constructor() {
    this.sessionIdVsClientInstance = {};
    return this;
  }

  createWAClient = (sessionId, qrGenerationCallback, readyInstanceCallback) => {
    return new WhatsappWebSession(sessionId, qrGenerationCallback, readyInstanceCallback);
  };

  async restorePreviousSessions() {
    const directoryNames = await getDirectories(
      "../.wwebjs_auth"
    );
    const sessionIds = directoryNames.map(name => name.split("-")[1]);

    sessionIds.forEach(sessionId => {
      this.createWAClient(sessionId);
    });
  }

  getClientFromSessionId = sessionId => {
    return this.sessionIdVsClientInstance[sessionId];
  };
}

const singularWhatsappSessionManager = new WhatsappSessionManager();
module.exports = singularWhatsappSessionManager;

创建WA客户端- 用于创建 Whatsapp Web 会话的新实例

获取ClientFromSessionId- 用于根据实例的唯一键检索实例

恢复以前的会话- 当服务器重新启动时,使用此功能加载以前登录的会话,以便轻松使用它们。

通过这种方法,我们将始终拥有一个实例WhatsappSessionManager,它将用于保存每个会话的记录。对于每个相应的获取消息发送请求,我们将能够使用所需的 WhatsApp 会话。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建和管理 Whatsapp Web JS 的多个实例 的相关文章

随机推荐