NodeJS 创建和管理whatsapp web js的多个示例

u4vypkhs  于 2023-01-01  发布在  Node.js
关注(0)|答案(1)|浏览(302)

我在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;

现在,对于一个express API调用,例如/new-client?id=client-id,我为这个类创建了一个新对象。
我想要的是创建这个类的几个对象,它们在后台运行,我可以得到任何带有client-id的客户端,类似于session. getClient(client-id)。
如何做到这一点?
我尝试过使用authstrategy每次创建一个新对象,然后在API响应关闭后销毁它,但是速度非常慢。

kupeojn6

kupeojn61#

我已经修复了这个问题,创建了一个单独的客户端管理器示例,负责根据唯一标识符存储客户端示例。每次我们需要从特定客户端发送消息时,管理器将根据客户端的唯一密钥返回客户端。
为方便起见,我使用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的示例,它将用于记录每个会话。对于每个相应的get message-send请求,我们将能够使用所需的WhatsApp会话。

相关问题