UNPKG

@warriorteam/zalo-personal

Version:

Unofficial Zalo Personal API for JavaScript - A powerful library for interacting with Zalo personal accounts with URL attachment support

88 lines (87 loc) 3.58 kB
import FormData from "form-data"; import fs from "node:fs"; import { ZaloApiError } from "../Errors/ZaloApiError.js"; import { apiFactory, formatTime, getImageMetaData, isValidUrl, downloadFileFromUrl } from "../utils.js"; export const changeAccountAvatarFactory = apiFactory()((api, ctx, utils) => { const serviceURL = utils.makeURL(`${api.zpwServiceMap.file[0]}/api/profile/upavatar`); /** * Change account avatar * * @param avatarSource Attachment source, can be a file path or an Attachment object * * @throws ZaloApiError */ return async function changeAccountAvatar(avatarSource) { const isSourceFilePath = typeof avatarSource == "string"; const isUrl = typeof avatarSource == "object" && "url" in avatarSource; const isBuffer = typeof avatarSource == "object" && "data" in avatarSource; let processedSource; if (isSourceFilePath) { const imageMetaData = await getImageMetaData(avatarSource); const avatarData = fs.readFileSync(avatarSource); processedSource = { data: avatarData, filename: avatarSource.split("/").pop() || "avatar.jpg", metadata: { totalSize: imageMetaData.totalSize || 0, width: imageMetaData.width, height: imageMetaData.height, }, }; } else if (isUrl) { if (!isValidUrl(avatarSource.url)) throw new ZaloApiError("Invalid URL"); const downloadResult = await downloadFileFromUrl(avatarSource.url, avatarSource.headers); processedSource = { data: downloadResult.data, filename: avatarSource.filename || downloadResult.filename, metadata: downloadResult.metadata, }; } else if (isBuffer) { processedSource = { data: avatarSource.data, filename: avatarSource.filename, metadata: avatarSource.metadata, }; } else { throw new ZaloApiError("Invalid avatar source type"); } const fileSize = processedSource.metadata.totalSize || 0; const params = { avatarSize: 120, clientId: String(ctx.uid + formatTime("%H:%M %d/%m/%Y")), language: ctx.language, metaData: JSON.stringify({ origin: { width: processedSource.metadata.width || 1080, height: processedSource.metadata.height || 1080, }, processed: { width: processedSource.metadata.width || 1080, height: processedSource.metadata.height || 1080, size: fileSize, }, }), }; const avatarData = processedSource.data; const formData = new FormData(); formData.append("fileContent", avatarData, { filename: "blob", contentType: "image/jpeg", }); const encryptedParams = utils.encodeAES(JSON.stringify(params)); if (!encryptedParams) throw new ZaloApiError("Failed to encrypt params"); const response = await utils.request(utils.makeURL(serviceURL, { params: encryptedParams, }), { method: "POST", headers: formData.getHeaders(), body: formData.getBuffer(), }); return utils.resolve(response); }; });