@warriorteam/zalo-personal
Version:
Unofficial Zalo Personal API for JavaScript - A powerful library for interacting with Zalo personal accounts with URL attachment support, auto-reply, product catalog, and business features
113 lines (109 loc) • 4.72 kB
JavaScript
;
var loginQR = require('./apis/loginQR.cjs');
var login = require('./apis/login.cjs');
var context = require('./context.cjs');
var utils = require('./utils.cjs');
var toughCookie = require('tough-cookie');
var ZaloApiError = require('./Errors/ZaloApiError.cjs');
var update = require('./update.cjs');
var apis = require('./apis.cjs');
class Zalo {
constructor(options = {}) {
this.options = options;
this.enableEncryptParam = true;
}
parseCookies(cookie) {
const cookieArr = Array.isArray(cookie) ? cookie : cookie.cookies;
cookieArr.forEach((e, i) => {
if (typeof e.domain == "string" && e.domain.startsWith("."))
cookieArr[i].domain = e.domain.slice(1);
});
const jar = new toughCookie.CookieJar();
for (const each of cookieArr) {
try {
const cookieObj = toughCookie.Cookie.fromJSON(Object.assign(Object.assign({}, each), { key: each.key || each.name }));
if (cookieObj) {
const domain = cookieObj.domain || "chat.zalo.me";
const url = `https://${domain.startsWith(".") ? domain.slice(1) : domain}`;
jar.setCookieSync(cookieObj, url);
}
}
catch (error) {
utils.logger({
options: {
logging: this.options.logging,
},
}).error("Failed to set cookie:", error);
}
}
return jar;
}
validateParams(credentials) {
if (!credentials.imei || !credentials.cookie || !credentials.userAgent) {
throw new ZaloApiError.ZaloApiError("Missing required params");
}
}
async login(credentials) {
const ctx = context.createContext(this.options.apiType, this.options.apiVersion);
Object.assign(ctx.options, this.options);
return this.loginCookie(ctx, credentials);
}
async loginCookie(ctx, credentials) {
await update.checkUpdate(ctx);
this.validateParams(credentials);
ctx.imei = credentials.imei;
ctx.cookie = this.parseCookies(credentials.cookie);
ctx.userAgent = credentials.userAgent;
ctx.language = credentials.language || "vi";
const loginData = await login.login(ctx, this.enableEncryptParam);
const serverInfo = await login.getServerInfo(ctx, this.enableEncryptParam);
const loginInfo = loginData === null || loginData === void 0 ? void 0 : loginData.data;
if (!loginData || !loginInfo || !serverInfo)
throw new ZaloApiError.ZaloApiError("Đăng nhập thất bại");
ctx.secretKey = loginInfo.zpw_enk;
ctx.uid = loginInfo.uid;
// Zalo currently responds with setttings instead of settings
// they might fix this in the future, so we should have a fallback just in case
ctx.settings = serverInfo.setttings || serverInfo.settings;
ctx.extraVer = serverInfo.extra_ver;
ctx.loginInfo = loginInfo;
if (!context.isContextSession(ctx))
throw new ZaloApiError.ZaloApiError("Khởi tạo ngữ cảnh thất bại.");
utils.logger(ctx).info("Logged in as", loginInfo.uid);
return new apis.API(ctx, loginInfo.zpw_service_map_v3, loginInfo.zpw_ws);
}
async loginQR(options, callback) {
if (!options)
options = {};
if (!options.userAgent)
options.userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0";
if (!options.language)
options.language = "vi";
const ctx = context.createContext(this.options.apiType, this.options.apiVersion);
Object.assign(ctx.options, this.options);
const loginQRResult = await loginQR.loginQR(ctx, options, callback);
if (!loginQRResult)
throw new ZaloApiError.ZaloApiError("Unable to login with QRCode");
const imei = utils.generateZaloUUID(options.userAgent);
if (callback) {
// Thanks to @YanCastle for this great suggestion!
callback({
type: loginQR.LoginQRCallbackEventType.GotLoginInfo,
data: {
cookie: loginQRResult.cookies,
imei,
userAgent: options.userAgent,
},
actions: null,
});
}
return this.loginCookie(ctx, {
cookie: loginQRResult.cookies,
imei,
userAgent: options.userAgent,
language: options.language,
});
}
}
exports.API = apis.API;
exports.Zalo = Zalo;