@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
97 lines (96 loc) • 3.77 kB
JavaScript
import { ZaloApiError } from "../Errors/ZaloApiError.js";
import { decryptResp, getSignKey, logger, makeURL, ParamsEncryptor, request } from "../utils.js";
export async function login(ctx, encryptParams) {
const encryptedParams = await getEncryptParam(ctx, encryptParams, "getlogininfo");
try {
const response = await request(ctx, makeURL(ctx, "https://wpa.chat.zalo.me/api/login/getLoginInfo", Object.assign(Object.assign({}, encryptedParams.params), { nretry: 0 })));
if (!response.ok)
throw new ZaloApiError("Failed to fetch login info: " + response.statusText);
const data = await response.json();
if (encryptedParams.enk) {
const decryptedData = decryptResp(encryptedParams.enk, data.data);
return decryptedData != null && typeof decryptedData != "string" ? decryptedData : null;
}
return null;
}
catch (error) {
logger(ctx).error("Login failed:", error);
throw error;
}
}
export async function getServerInfo(ctx, encryptParams) {
const encryptedParams = await getEncryptParam(ctx, encryptParams, "getserverinfo");
if (!encryptedParams.params.signkey || typeof encryptedParams.params.signkey !== "string")
throw new ZaloApiError("Missing signkey");
const response = await request(ctx, makeURL(ctx, "https://wpa.chat.zalo.me/api/login/getServerInfo", {
imei: ctx.imei,
type: ctx.API_TYPE,
client_version: ctx.API_VERSION,
computer_name: "Web",
signkey: encryptedParams.params.signkey,
}, false));
if (!response.ok)
throw new ZaloApiError("Failed to fetch server info: " + response.statusText);
const data = await response.json();
if (data.data == null)
throw new ZaloApiError("Failed to fetch server info: " + data.error_message);
return data.data;
}
async function getEncryptParam(ctx, encryptParams, type) {
const params = {};
const data = {
computer_name: "Web",
imei: ctx.imei,
language: ctx.language,
ts: Date.now(),
};
const encryptedData = await _encryptParam(ctx, data, encryptParams);
if (encryptedData == null)
Object.assign(params, data);
else {
const { encrypted_params, encrypted_data } = encryptedData;
Object.assign(params, encrypted_params);
params.params = encrypted_data;
}
params.type = ctx.API_TYPE;
params.client_version = ctx.API_VERSION;
params.signkey =
type == "getserverinfo"
? getSignKey(type, {
imei: ctx.imei,
type: ctx.API_TYPE,
client_version: ctx.API_VERSION,
computer_name: "Web",
})
: getSignKey(type, params);
return {
params,
enk: encryptedData ? encryptedData.enk : null,
};
}
async function _encryptParam(ctx, data, encryptParams) {
if (encryptParams) {
const encryptor = new ParamsEncryptor({
type: ctx.API_TYPE,
imei: data.imei,
firstLaunchTime: Date.now(),
});
try {
const stringifiedData = JSON.stringify(data);
const encryptedKey = encryptor.getEncryptKey();
const encodedData = ParamsEncryptor.encodeAES(encryptedKey, stringifiedData, "base64", false);
const params = encryptor.getParams();
return params
? {
encrypted_data: encodedData,
encrypted_params: params,
enk: encryptedKey,
}
: null;
}
catch (error) {
throw new ZaloApiError("Failed to encrypt params: " + error);
}
}
return null;
}