创建和管理多个WhatsApp Web JS实例

4

我在文件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。 我为这个类创建了一个新对象。

我想要的是创建几个这个类的对象,它们保持在后台运行,并且我可以通过客户端ID获取任何客户端,就像session.getClient(client-id)一样。

如何实现这一点?

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

1个回答

1
我已经通过创建一个单例客户端管理器实例来解决了这个问题,它将负责根据唯一标识存储客户端实例。每当我们需要从特定客户端发送消息时,管理器都会根据客户端的唯一键返回客户端。
为了方便起见,我使用了express-session中间件的会话ID作为实例的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;

createWAClient - 用于创建新的Whatsapp Web会话实例。

getClientFromSessionId - 用于根据其唯一键检索实例。

restorePreviousSessions - 当服务器重新启动时,使用此函数加载以前登录的会话,以便无需麻烦地使用它们。

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


我尝试过了,但 sessionIdVsClientInstance 仍然为空,我该如何将客户端添加到其中? - E. Zahra
嗨,帕斯,请与我联系。我有关于你的解决方案要分享的重要事情。nelsonekpenyong@xiiela.com - Nelson Ekpenyong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接