我的文件中有一个类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(使用前将#替换为@)