@ohos-ports/zca-js 2.2.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +225 -0
- package/dist/Errors/ZaloApiError.d.ts +4 -0
- package/dist/Errors/ZaloApiError.js +7 -0
- package/dist/Errors/ZaloApiLoginQRAborted.d.ts +4 -0
- package/dist/Errors/ZaloApiLoginQRAborted.js +7 -0
- package/dist/Errors/ZaloApiLoginQRDeclined.d.ts +4 -0
- package/dist/Errors/ZaloApiLoginQRDeclined.js +7 -0
- package/dist/Errors/ZaloApiMissingImageMetadataGetter.d.ts +4 -0
- package/dist/Errors/ZaloApiMissingImageMetadataGetter.js +7 -0
- package/dist/Errors/index.d.ts +4 -0
- package/dist/Errors/index.js +4 -0
- package/dist/apis/acceptFriendRequest.d.ts +2 -0
- package/dist/apis/acceptFriendRequest.js +28 -0
- package/dist/apis/addGroupBlockedMember.d.ts +2 -0
- package/dist/apis/addGroupBlockedMember.js +28 -0
- package/dist/apis/addGroupDeputy.d.ts +2 -0
- package/dist/apis/addGroupDeputy.js +30 -0
- package/dist/apis/addPollOptions.d.ts +14 -0
- package/dist/apis/addPollOptions.js +26 -0
- package/dist/apis/addQuickMessage.d.ts +11 -0
- package/dist/apis/addQuickMessage.js +60 -0
- package/dist/apis/addReaction.d.ts +18 -0
- package/dist/apis/addReaction.js +294 -0
- package/dist/apis/addUnreadMark.d.ts +8 -0
- package/dist/apis/addUnreadMark.js +52 -0
- package/dist/apis/addUserToGroup.d.ts +5 -0
- package/dist/apis/addUserToGroup.js +34 -0
- package/dist/apis/blockUser.d.ts +2 -0
- package/dist/apis/blockUser.js +28 -0
- package/dist/apis/blockViewFeed.d.ts +2 -0
- package/dist/apis/blockViewFeed.js +30 -0
- package/dist/apis/changeAccountAvatar.d.ts +3 -0
- package/dist/apis/changeAccountAvatar.js +52 -0
- package/dist/apis/changeFriendAlias.d.ts +2 -0
- package/dist/apis/changeFriendAlias.js +27 -0
- package/dist/apis/changeGroupAvatar.d.ts +3 -0
- package/dist/apis/changeGroupAvatar.js +44 -0
- package/dist/apis/changeGroupName.d.ts +4 -0
- package/dist/apis/changeGroupName.js +32 -0
- package/dist/apis/changeGroupOwner.d.ts +4 -0
- package/dist/apis/changeGroupOwner.js +30 -0
- package/dist/apis/createAutoReply.d.ts +14 -0
- package/dist/apis/createAutoReply.js +37 -0
- package/dist/apis/createBankAccount.d.ts +8 -0
- package/dist/apis/createBankAccount.js +32 -0
- package/dist/apis/createCatalog.d.ts +7 -0
- package/dist/apis/createCatalog.js +29 -0
- package/dist/apis/createGroup.d.ts +28 -0
- package/dist/apis/createGroup.js +43 -0
- package/dist/apis/createNote.d.ts +7 -0
- package/dist/apis/createNote.js +47 -0
- package/dist/apis/createPoll.d.ts +36 -0
- package/dist/apis/createPoll.js +40 -0
- package/dist/apis/createProductCatalog.d.ts +23 -0
- package/dist/apis/createProductCatalog.js +50 -0
- package/dist/apis/createReminder.d.ts +12 -0
- package/dist/apis/createReminder.js +63 -0
- package/dist/apis/custom.d.ts +9 -0
- package/dist/apis/custom.js +15 -0
- package/dist/apis/deleteAutoReply.d.ts +5 -0
- package/dist/apis/deleteAutoReply.js +29 -0
- package/dist/apis/deleteAvatar.d.ts +9 -0
- package/dist/apis/deleteAvatar.js +27 -0
- package/dist/apis/deleteBankAccount.d.ts +11 -0
- package/dist/apis/deleteBankAccount.js +32 -0
- package/dist/apis/deleteCatalog.d.ts +2 -0
- package/dist/apis/deleteCatalog.js +28 -0
- package/dist/apis/deleteChat.d.ts +19 -0
- package/dist/apis/deleteChat.js +50 -0
- package/dist/apis/deleteGroupInviteBox.d.ts +9 -0
- package/dist/apis/deleteGroupInviteBox.js +27 -0
- package/dist/apis/deleteMessage.d.ts +14 -0
- package/dist/apis/deleteMessage.js +52 -0
- package/dist/apis/deleteProductCatalog.d.ts +10 -0
- package/dist/apis/deleteProductCatalog.js +31 -0
- package/dist/apis/disableGroupLink.d.ts +2 -0
- package/dist/apis/disableGroupLink.js +24 -0
- package/dist/apis/disperseGroup.d.ts +2 -0
- package/dist/apis/disperseGroup.js +28 -0
- package/dist/apis/editNote.d.ts +17 -0
- package/dist/apis/editNote.js +46 -0
- package/dist/apis/editReminder.d.ts +13 -0
- package/dist/apis/editReminder.js +61 -0
- package/dist/apis/enableGroupLink.d.ts +6 -0
- package/dist/apis/enableGroupLink.js +25 -0
- package/dist/apis/fetchAccountInfo.d.ts +5 -0
- package/dist/apis/fetchAccountInfo.js +10 -0
- package/dist/apis/findUser.d.ts +3 -0
- package/dist/apis/findUser.js +42 -0
- package/dist/apis/findUserByUsername.d.ts +3 -0
- package/dist/apis/findUserByUsername.js +27 -0
- package/dist/apis/forwardMessage.d.ts +24 -0
- package/dist/apis/forwardMessage.js +99 -0
- package/dist/apis/getAliasList.d.ts +8 -0
- package/dist/apis/getAliasList.js +27 -0
- package/dist/apis/getAllFriends.d.ts +3 -0
- package/dist/apis/getAllFriends.js +34 -0
- package/dist/apis/getAllGroups.d.ts +7 -0
- package/dist/apis/getAllGroups.js +10 -0
- package/dist/apis/getArchivedChatList.d.ts +5 -0
- package/dist/apis/getArchivedChatList.js +23 -0
- package/dist/apis/getAutoDeleteChat.d.ts +9 -0
- package/dist/apis/getAutoDeleteChat.js +21 -0
- package/dist/apis/getAutoReplyList.d.ts +6 -0
- package/dist/apis/getAutoReplyList.js +24 -0
- package/dist/apis/getAvatarList.d.ts +12 -0
- package/dist/apis/getAvatarList.js +28 -0
- package/dist/apis/getAvatarUrlProfile.d.ts +7 -0
- package/dist/apis/getAvatarUrlProfile.js +30 -0
- package/dist/apis/getBizAccount.d.ts +24 -0
- package/dist/apis/getBizAccount.js +27 -0
- package/dist/apis/getCatalogList.d.ts +18 -0
- package/dist/apis/getCatalogList.js +32 -0
- package/dist/apis/getCloseFriends.d.ts +3 -0
- package/dist/apis/getCloseFriends.js +20 -0
- package/dist/apis/getContext.d.ts +1 -0
- package/dist/apis/getContext.js +4 -0
- package/dist/apis/getCookie.d.ts +1 -0
- package/dist/apis/getCookie.js +9 -0
- package/dist/apis/getFriendBoardList.d.ts +5 -0
- package/dist/apis/getFriendBoardList.js +26 -0
- package/dist/apis/getFriendOnlines.d.ts +10 -0
- package/dist/apis/getFriendOnlines.js +35 -0
- package/dist/apis/getFriendRecommendations.d.ts +42 -0
- package/dist/apis/getFriendRecommendations.js +27 -0
- package/dist/apis/getFriendRequestStatus.d.ts +8 -0
- package/dist/apis/getFriendRequestStatus.js +25 -0
- package/dist/apis/getFullAvatar.d.ts +5 -0
- package/dist/apis/getFullAvatar.js +25 -0
- package/dist/apis/getGroupBlockedMember.d.ts +23 -0
- package/dist/apis/getGroupBlockedMember.js +29 -0
- package/dist/apis/getGroupChatHistory.d.ts +8 -0
- package/dist/apis/getGroupChatHistory.js +36 -0
- package/dist/apis/getGroupInfo.d.ts +16 -0
- package/dist/apis/getGroupInfo.js +32 -0
- package/dist/apis/getGroupInviteBoxInfo.d.ts +32 -0
- package/dist/apis/getGroupInviteBoxInfo.js +38 -0
- package/dist/apis/getGroupInviteBoxList.d.ts +38 -0
- package/dist/apis/getGroupInviteBoxList.js +31 -0
- package/dist/apis/getGroupLinkDetail.d.ts +9 -0
- package/dist/apis/getGroupLinkDetail.js +25 -0
- package/dist/apis/getGroupLinkInfo.d.ts +34 -0
- package/dist/apis/getGroupLinkInfo.js +28 -0
- package/dist/apis/getGroupMembersInfo.d.ts +17 -0
- package/dist/apis/getGroupMembersInfo.js +24 -0
- package/dist/apis/getHiddenConversations.d.ts +11 -0
- package/dist/apis/getHiddenConversations.js +23 -0
- package/dist/apis/getLabels.d.ts +7 -0
- package/dist/apis/getLabels.js +28 -0
- package/dist/apis/getListBank.d.ts +5 -0
- package/dist/apis/getListBank.js +20 -0
- package/dist/apis/getListBankAccount.d.ts +7 -0
- package/dist/apis/getListBankAccount.js +27 -0
- package/dist/apis/getListBoard.d.ts +21 -0
- package/dist/apis/getListBoard.js +45 -0
- package/dist/apis/getListDevice.d.ts +10 -0
- package/dist/apis/getListDevice.js +22 -0
- package/dist/apis/getListReminder.d.ts +28 -0
- package/dist/apis/getListReminder.js +47 -0
- package/dist/apis/getMultiUsersByPhones.d.ts +5 -0
- package/dist/apis/getMultiUsersByPhones.js +39 -0
- package/dist/apis/getMute.d.ts +13 -0
- package/dist/apis/getMute.js +22 -0
- package/dist/apis/getOwnId.d.ts +1 -0
- package/dist/apis/getOwnId.js +4 -0
- package/dist/apis/getPendingGroupMembers.d.ts +11 -0
- package/dist/apis/getPendingGroupMembers.js +27 -0
- package/dist/apis/getPinConversations.d.ts +5 -0
- package/dist/apis/getPinConversations.js +22 -0
- package/dist/apis/getPollDetail.d.ts +3 -0
- package/dist/apis/getPollDetail.js +30 -0
- package/dist/apis/getProductCatalogList.d.ts +20 -0
- package/dist/apis/getProductCatalogList.js +33 -0
- package/dist/apis/getQR.d.ts +4 -0
- package/dist/apis/getQR.js +29 -0
- package/dist/apis/getQuickMessageList.d.ts +7 -0
- package/dist/apis/getQuickMessageList.js +24 -0
- package/dist/apis/getRelatedFriendGroup.d.ts +6 -0
- package/dist/apis/getRelatedFriendGroup.js +30 -0
- package/dist/apis/getReminder.d.ts +3 -0
- package/dist/apis/getReminder.js +25 -0
- package/dist/apis/getReminderResponses.d.ts +5 -0
- package/dist/apis/getReminderResponses.js +24 -0
- package/dist/apis/getSentFriendRequest.d.ts +18 -0
- package/dist/apis/getSentFriendRequest.js +24 -0
- package/dist/apis/getSettings.d.ts +3 -0
- package/dist/apis/getSettings.js +20 -0
- package/dist/apis/getStickerCategoryDetail.d.ts +3 -0
- package/dist/apis/getStickerCategoryDetail.js +24 -0
- package/dist/apis/getStickers.d.ts +1 -0
- package/dist/apis/getStickers.js +40 -0
- package/dist/apis/getStickersDetail.d.ts +3 -0
- package/dist/apis/getStickersDetail.js +40 -0
- package/dist/apis/getUnreadMark.d.ts +14 -0
- package/dist/apis/getUnreadMark.js +30 -0
- package/dist/apis/getUserInfo.d.ts +8 -0
- package/dist/apis/getUserInfo.js +44 -0
- package/dist/apis/inviteUserToGroups.d.ts +10 -0
- package/dist/apis/inviteUserToGroups.js +30 -0
- package/dist/apis/joinGroupInviteBox.d.ts +2 -0
- package/dist/apis/joinGroupInviteBox.js +25 -0
- package/dist/apis/joinGroupLink.d.ts +2 -0
- package/dist/apis/joinGroupLink.js +27 -0
- package/dist/apis/keepAlive.d.ts +4 -0
- package/dist/apis/keepAlive.js +22 -0
- package/dist/apis/lastOnline.d.ts +7 -0
- package/dist/apis/lastOnline.js +26 -0
- package/dist/apis/leaveGroup.d.ts +4 -0
- package/dist/apis/leaveGroup.js +33 -0
- package/dist/apis/listen.d.ts +102 -0
- package/dist/apis/listen.js +425 -0
- package/dist/apis/lockPoll.d.ts +2 -0
- package/dist/apis/lockPoll.js +28 -0
- package/dist/apis/login.d.ts +3 -0
- package/dist/apis/login.js +96 -0
- package/dist/apis/loginQR.d.ts +71 -0
- package/dist/apis/loginQR.js +365 -0
- package/dist/apis/lostFocus.d.ts +4 -0
- package/dist/apis/lostFocus.js +23 -0
- package/dist/apis/parseLink.d.ts +21 -0
- package/dist/apis/parseLink.js +27 -0
- package/dist/apis/registerCatalog.d.ts +2 -0
- package/dist/apis/registerCatalog.js +27 -0
- package/dist/apis/rejectFriendRequest.d.ts +2 -0
- package/dist/apis/rejectFriendRequest.js +27 -0
- package/dist/apis/removeFriend.d.ts +2 -0
- package/dist/apis/removeFriend.js +28 -0
- package/dist/apis/removeFriendAlias.d.ts +2 -0
- package/dist/apis/removeFriendAlias.js +24 -0
- package/dist/apis/removeGroupBlockedMember.d.ts +2 -0
- package/dist/apis/removeGroupBlockedMember.js +28 -0
- package/dist/apis/removeGroupDeputy.d.ts +2 -0
- package/dist/apis/removeGroupDeputy.js +30 -0
- package/dist/apis/removeQuickMessage.d.ts +5 -0
- package/dist/apis/removeQuickMessage.js +27 -0
- package/dist/apis/removeReminder.d.ts +3 -0
- package/dist/apis/removeReminder.js +40 -0
- package/dist/apis/removeUnreadMark.d.ts +8 -0
- package/dist/apis/removeUnreadMark.js +50 -0
- package/dist/apis/removeUserFromGroup.d.ts +4 -0
- package/dist/apis/removeUserFromGroup.js +34 -0
- package/dist/apis/resetHiddenConversPin.d.ts +2 -0
- package/dist/apis/resetHiddenConversPin.js +20 -0
- package/dist/apis/reuseAvatar.d.ts +2 -0
- package/dist/apis/reuseAvatar.js +26 -0
- package/dist/apis/reviewPendingMemberRequest.d.ts +14 -0
- package/dist/apis/reviewPendingMemberRequest.js +38 -0
- package/dist/apis/scanURL.d.ts +4 -0
- package/dist/apis/scanURL.js +28 -0
- package/dist/apis/searchSticker.d.ts +3 -0
- package/dist/apis/searchSticker.js +28 -0
- package/dist/apis/sendBankCard.d.ts +9 -0
- package/dist/apis/sendBankCard.js +37 -0
- package/dist/apis/sendCard.d.ts +10 -0
- package/dist/apis/sendCard.js +59 -0
- package/dist/apis/sendDeliveredEvent.d.ts +16 -0
- package/dist/apis/sendDeliveredEvent.js +55 -0
- package/dist/apis/sendFriendRequest.d.ts +2 -0
- package/dist/apis/sendFriendRequest.js +39 -0
- package/dist/apis/sendLink.d.ts +10 -0
- package/dist/apis/sendLink.js +61 -0
- package/dist/apis/sendMessage.d.ts +99 -0
- package/dist/apis/sendMessage.js +452 -0
- package/dist/apis/sendReport.d.ts +17 -0
- package/dist/apis/sendReport.js +53 -0
- package/dist/apis/sendSeenEvent.d.ts +16 -0
- package/dist/apis/sendSeenEvent.js +63 -0
- package/dist/apis/sendSticker.d.ts +10 -0
- package/dist/apis/sendSticker.js +57 -0
- package/dist/apis/sendTypingEvent.d.ts +5 -0
- package/dist/apis/sendTypingEvent.js +33 -0
- package/dist/apis/sendVideo.d.ts +35 -0
- package/dist/apis/sendVideo.js +118 -0
- package/dist/apis/sendVoice.d.ts +12 -0
- package/dist/apis/sendVoice.js +73 -0
- package/dist/apis/setHiddenConversations.d.ts +3 -0
- package/dist/apis/setHiddenConversations.js +39 -0
- package/dist/apis/setMute.d.ts +20 -0
- package/dist/apis/setMute.js +67 -0
- package/dist/apis/setPinnedConversations.d.ts +3 -0
- package/dist/apis/setPinnedConversations.js +34 -0
- package/dist/apis/sharePoll.d.ts +2 -0
- package/dist/apis/sharePoll.js +28 -0
- package/dist/apis/unblockUser.d.ts +2 -0
- package/dist/apis/unblockUser.js +28 -0
- package/dist/apis/undo.d.ts +9 -0
- package/dist/apis/undo.js +42 -0
- package/dist/apis/undoFriendRequest.d.ts +2 -0
- package/dist/apis/undoFriendRequest.js +27 -0
- package/dist/apis/updateActiveStatus.d.ts +4 -0
- package/dist/apis/updateActiveStatus.js +27 -0
- package/dist/apis/updateArchivedChatList.d.ts +10 -0
- package/dist/apis/updateArchivedChatList.js +34 -0
- package/dist/apis/updateAutoDeleteChat.d.ts +9 -0
- package/dist/apis/updateAutoDeleteChat.js +40 -0
- package/dist/apis/updateAutoReply.d.ts +15 -0
- package/dist/apis/updateAutoReply.js +38 -0
- package/dist/apis/updateBankAccount.d.ts +9 -0
- package/dist/apis/updateBankAccount.js +31 -0
- package/dist/apis/updateCatalog.d.ts +11 -0
- package/dist/apis/updateCatalog.js +30 -0
- package/dist/apis/updateGroupSettings.d.ts +40 -0
- package/dist/apis/updateGroupSettings.js +43 -0
- package/dist/apis/updateHiddenConversPin.d.ts +2 -0
- package/dist/apis/updateHiddenConversPin.js +30 -0
- package/dist/apis/updateLabels.d.ts +15 -0
- package/dist/apis/updateLabels.js +34 -0
- package/dist/apis/updateLang.d.ts +6 -0
- package/dist/apis/updateLang.js +30 -0
- package/dist/apis/updateProductCatalog.d.ts +25 -0
- package/dist/apis/updateProductCatalog.js +51 -0
- package/dist/apis/updateProfile.d.ts +20 -0
- package/dist/apis/updateProfile.js +43 -0
- package/dist/apis/updateProfileBio.d.ts +2 -0
- package/dist/apis/updateProfileBio.js +27 -0
- package/dist/apis/updateQuickMessage.d.ts +11 -0
- package/dist/apis/updateQuickMessage.js +61 -0
- package/dist/apis/updateSettings.d.ts +16 -0
- package/dist/apis/updateSettings.js +90 -0
- package/dist/apis/upgradeGroupToCommunity.d.ts +2 -0
- package/dist/apis/upgradeGroupToCommunity.js +27 -0
- package/dist/apis/uploadAttachment.d.ts +50 -0
- package/dist/apis/uploadAttachment.js +197 -0
- package/dist/apis/uploadProductPhoto.d.ts +14 -0
- package/dist/apis/uploadProductPhoto.js +50 -0
- package/dist/apis/votePoll.d.ts +5 -0
- package/dist/apis/votePoll.js +29 -0
- package/dist/apis.d.ts +317 -0
- package/dist/apis.js +317 -0
- package/dist/cjs/Errors/ZaloApiError.cjs +11 -0
- package/dist/cjs/Errors/ZaloApiLoginQRAborted.cjs +12 -0
- package/dist/cjs/Errors/ZaloApiLoginQRDeclined.cjs +12 -0
- package/dist/cjs/Errors/ZaloApiMissingImageMetadataGetter.cjs +12 -0
- package/dist/cjs/apis/acceptFriendRequest.cjs +33 -0
- package/dist/cjs/apis/addGroupBlockedMember.cjs +33 -0
- package/dist/cjs/apis/addGroupDeputy.cjs +35 -0
- package/dist/cjs/apis/addPollOptions.cjs +31 -0
- package/dist/cjs/apis/addQuickMessage.cjs +65 -0
- package/dist/cjs/apis/addReaction.cjs +308 -0
- package/dist/cjs/apis/addUnreadMark.cjs +66 -0
- package/dist/cjs/apis/addUserToGroup.cjs +39 -0
- package/dist/cjs/apis/blockUser.cjs +33 -0
- package/dist/cjs/apis/blockViewFeed.cjs +35 -0
- package/dist/cjs/apis/changeAccountAvatar.cjs +57 -0
- package/dist/cjs/apis/changeFriendAlias.cjs +32 -0
- package/dist/cjs/apis/changeGroupAvatar.cjs +49 -0
- package/dist/cjs/apis/changeGroupName.cjs +37 -0
- package/dist/cjs/apis/changeGroupOwner.cjs +35 -0
- package/dist/cjs/apis/createAutoReply.cjs +42 -0
- package/dist/cjs/apis/createBankAccount.cjs +37 -0
- package/dist/cjs/apis/createCatalog.cjs +34 -0
- package/dist/cjs/apis/createGroup.cjs +48 -0
- package/dist/cjs/apis/createNote.cjs +52 -0
- package/dist/cjs/apis/createPoll.cjs +45 -0
- package/dist/cjs/apis/createProductCatalog.cjs +55 -0
- package/dist/cjs/apis/createReminder.cjs +77 -0
- package/dist/cjs/apis/custom.cjs +19 -0
- package/dist/cjs/apis/deleteAutoReply.cjs +34 -0
- package/dist/cjs/apis/deleteAvatar.cjs +32 -0
- package/dist/cjs/apis/deleteBankAccount.cjs +37 -0
- package/dist/cjs/apis/deleteCatalog.cjs +33 -0
- package/dist/cjs/apis/deleteChat.cjs +64 -0
- package/dist/cjs/apis/deleteGroupInviteBox.cjs +32 -0
- package/dist/cjs/apis/deleteMessage.cjs +66 -0
- package/dist/cjs/apis/deleteProductCatalog.cjs +36 -0
- package/dist/cjs/apis/disableGroupLink.cjs +29 -0
- package/dist/cjs/apis/disperseGroup.cjs +33 -0
- package/dist/cjs/apis/editNote.cjs +51 -0
- package/dist/cjs/apis/editReminder.cjs +75 -0
- package/dist/cjs/apis/enableGroupLink.cjs +30 -0
- package/dist/cjs/apis/fetchAccountInfo.cjs +15 -0
- package/dist/cjs/apis/findUser.cjs +56 -0
- package/dist/cjs/apis/findUserByUsername.cjs +41 -0
- package/dist/cjs/apis/forwardMessage.cjs +113 -0
- package/dist/cjs/apis/getAliasList.cjs +32 -0
- package/dist/cjs/apis/getAllFriends.cjs +48 -0
- package/dist/cjs/apis/getAllGroups.cjs +15 -0
- package/dist/cjs/apis/getArchivedChatList.cjs +28 -0
- package/dist/cjs/apis/getAutoDeleteChat.cjs +26 -0
- package/dist/cjs/apis/getAutoReplyList.cjs +29 -0
- package/dist/cjs/apis/getAvatarList.cjs +33 -0
- package/dist/cjs/apis/getAvatarUrlProfile.cjs +44 -0
- package/dist/cjs/apis/getBizAccount.cjs +32 -0
- package/dist/cjs/apis/getCatalogList.cjs +37 -0
- package/dist/cjs/apis/getCloseFriends.cjs +25 -0
- package/dist/cjs/apis/getContext.cjs +9 -0
- package/dist/cjs/apis/getCookie.cjs +14 -0
- package/dist/cjs/apis/getFriendBoardList.cjs +31 -0
- package/dist/cjs/apis/getFriendOnlines.cjs +40 -0
- package/dist/cjs/apis/getFriendRecommendations.cjs +32 -0
- package/dist/cjs/apis/getFriendRequestStatus.cjs +30 -0
- package/dist/cjs/apis/getFullAvatar.cjs +30 -0
- package/dist/cjs/apis/getGroupBlockedMember.cjs +34 -0
- package/dist/cjs/apis/getGroupChatHistory.cjs +51 -0
- package/dist/cjs/apis/getGroupInfo.cjs +37 -0
- package/dist/cjs/apis/getGroupInviteBoxInfo.cjs +43 -0
- package/dist/cjs/apis/getGroupInviteBoxList.cjs +36 -0
- package/dist/cjs/apis/getGroupLinkDetail.cjs +30 -0
- package/dist/cjs/apis/getGroupLinkInfo.cjs +33 -0
- package/dist/cjs/apis/getGroupMembersInfo.cjs +29 -0
- package/dist/cjs/apis/getHiddenConversations.cjs +28 -0
- package/dist/cjs/apis/getLabels.cjs +33 -0
- package/dist/cjs/apis/getListBank.cjs +25 -0
- package/dist/cjs/apis/getListBankAccount.cjs +32 -0
- package/dist/cjs/apis/getListBoard.cjs +59 -0
- package/dist/cjs/apis/getListDevice.cjs +27 -0
- package/dist/cjs/apis/getListReminder.cjs +61 -0
- package/dist/cjs/apis/getMultiUsersByPhones.cjs +53 -0
- package/dist/cjs/apis/getMute.cjs +27 -0
- package/dist/cjs/apis/getOwnId.cjs +9 -0
- package/dist/cjs/apis/getPendingGroupMembers.cjs +32 -0
- package/dist/cjs/apis/getPinConversations.cjs +27 -0
- package/dist/cjs/apis/getPollDetail.cjs +35 -0
- package/dist/cjs/apis/getProductCatalogList.cjs +38 -0
- package/dist/cjs/apis/getQR.cjs +34 -0
- package/dist/cjs/apis/getQuickMessageList.cjs +29 -0
- package/dist/cjs/apis/getRelatedFriendGroup.cjs +35 -0
- package/dist/cjs/apis/getReminder.cjs +30 -0
- package/dist/cjs/apis/getReminderResponses.cjs +29 -0
- package/dist/cjs/apis/getSentFriendRequest.cjs +29 -0
- package/dist/cjs/apis/getSettings.cjs +25 -0
- package/dist/cjs/apis/getStickerCategoryDetail.cjs +29 -0
- package/dist/cjs/apis/getStickers.cjs +45 -0
- package/dist/cjs/apis/getStickersDetail.cjs +45 -0
- package/dist/cjs/apis/getUnreadMark.cjs +35 -0
- package/dist/cjs/apis/getUserInfo.cjs +58 -0
- package/dist/cjs/apis/inviteUserToGroups.cjs +35 -0
- package/dist/cjs/apis/joinGroupInviteBox.cjs +30 -0
- package/dist/cjs/apis/joinGroupLink.cjs +32 -0
- package/dist/cjs/apis/keepAlive.cjs +27 -0
- package/dist/cjs/apis/lastOnline.cjs +31 -0
- package/dist/cjs/apis/leaveGroup.cjs +38 -0
- package/dist/cjs/apis/listen.cjs +440 -0
- package/dist/cjs/apis/lockPoll.cjs +33 -0
- package/dist/cjs/apis/login.cjs +102 -0
- package/dist/cjs/apis/loginQR.cjs +370 -0
- package/dist/cjs/apis/lostFocus.cjs +28 -0
- package/dist/cjs/apis/parseLink.cjs +32 -0
- package/dist/cjs/apis/registerCatalog.cjs +32 -0
- package/dist/cjs/apis/rejectFriendRequest.cjs +32 -0
- package/dist/cjs/apis/removeFriend.cjs +33 -0
- package/dist/cjs/apis/removeFriendAlias.cjs +29 -0
- package/dist/cjs/apis/removeGroupBlockedMember.cjs +33 -0
- package/dist/cjs/apis/removeGroupDeputy.cjs +35 -0
- package/dist/cjs/apis/removeQuickMessage.cjs +32 -0
- package/dist/cjs/apis/removeReminder.cjs +54 -0
- package/dist/cjs/apis/removeUnreadMark.cjs +64 -0
- package/dist/cjs/apis/removeUserFromGroup.cjs +39 -0
- package/dist/cjs/apis/resetHiddenConversPin.cjs +25 -0
- package/dist/cjs/apis/reuseAvatar.cjs +31 -0
- package/dist/cjs/apis/reviewPendingMemberRequest.cjs +43 -0
- package/dist/cjs/apis/scanURL.cjs +33 -0
- package/dist/cjs/apis/searchSticker.cjs +33 -0
- package/dist/cjs/apis/sendBankCard.cjs +51 -0
- package/dist/cjs/apis/sendCard.cjs +73 -0
- package/dist/cjs/apis/sendDeliveredEvent.cjs +69 -0
- package/dist/cjs/apis/sendFriendRequest.cjs +44 -0
- package/dist/cjs/apis/sendLink.cjs +75 -0
- package/dist/cjs/apis/sendMessage.cjs +466 -0
- package/dist/cjs/apis/sendReport.cjs +67 -0
- package/dist/cjs/apis/sendSeenEvent.cjs +77 -0
- package/dist/cjs/apis/sendSticker.cjs +71 -0
- package/dist/cjs/apis/sendTypingEvent.cjs +47 -0
- package/dist/cjs/apis/sendVideo.cjs +132 -0
- package/dist/cjs/apis/sendVoice.cjs +87 -0
- package/dist/cjs/apis/setHiddenConversations.cjs +53 -0
- package/dist/cjs/apis/setMute.cjs +81 -0
- package/dist/cjs/apis/setPinnedConversations.cjs +48 -0
- package/dist/cjs/apis/sharePoll.cjs +33 -0
- package/dist/cjs/apis/unblockUser.cjs +33 -0
- package/dist/cjs/apis/undo.cjs +56 -0
- package/dist/cjs/apis/undoFriendRequest.cjs +32 -0
- package/dist/cjs/apis/updateActiveStatus.cjs +32 -0
- package/dist/cjs/apis/updateArchivedChatList.cjs +39 -0
- package/dist/cjs/apis/updateAutoDeleteChat.cjs +54 -0
- package/dist/cjs/apis/updateAutoReply.cjs +43 -0
- package/dist/cjs/apis/updateBankAccount.cjs +36 -0
- package/dist/cjs/apis/updateCatalog.cjs +35 -0
- package/dist/cjs/apis/updateGroupSettings.cjs +48 -0
- package/dist/cjs/apis/updateHiddenConversPin.cjs +35 -0
- package/dist/cjs/apis/updateLabels.cjs +39 -0
- package/dist/cjs/apis/updateLang.cjs +35 -0
- package/dist/cjs/apis/updateProductCatalog.cjs +56 -0
- package/dist/cjs/apis/updateProfile.cjs +48 -0
- package/dist/cjs/apis/updateProfileBio.cjs +32 -0
- package/dist/cjs/apis/updateQuickMessage.cjs +66 -0
- package/dist/cjs/apis/updateSettings.cjs +95 -0
- package/dist/cjs/apis/upgradeGroupToCommunity.cjs +32 -0
- package/dist/cjs/apis/uploadAttachment.cjs +211 -0
- package/dist/cjs/apis/uploadProductPhoto.cjs +55 -0
- package/dist/cjs/apis/votePoll.cjs +34 -0
- package/dist/cjs/apis.cjs +322 -0
- package/dist/cjs/context.cjs +34 -0
- package/dist/cjs/index.cjs +159 -0
- package/dist/cjs/models/AutoReply.cjs +9 -0
- package/dist/cjs/models/Bank.cjs +263 -0
- package/dist/cjs/models/Board.cjs +8 -0
- package/dist/cjs/models/DeliveredMessage.cjs +23 -0
- package/dist/cjs/models/Enum.cjs +27 -0
- package/dist/cjs/models/FriendEvent.cjs +87 -0
- package/dist/cjs/models/Group.cjs +13 -0
- package/dist/cjs/models/GroupEvent.cjs +94 -0
- package/dist/cjs/models/Message.cjs +35 -0
- package/dist/cjs/models/Reaction.cjs +74 -0
- package/dist/cjs/models/Reminder.cjs +9 -0
- package/dist/cjs/models/SeenMessage.cjs +23 -0
- package/dist/cjs/models/Typing.cjs +23 -0
- package/dist/cjs/models/Undo.cjs +16 -0
- package/dist/cjs/models/ZBusiness.cjs +39 -0
- package/dist/cjs/update.cjs +34 -0
- package/dist/cjs/utils.cjs +703 -0
- package/dist/cjs/zalo.cjs +112 -0
- package/dist/context.d.ts +179 -0
- package/dist/context.js +28 -0
- package/dist/index.d.ts +166 -0
- package/dist/index.js +14 -0
- package/dist/models/Attachment.d.ts +9 -0
- package/dist/models/Attachment.js +1 -0
- package/dist/models/AutoReply.d.ts +20 -0
- package/dist/models/AutoReply.js +7 -0
- package/dist/models/Bank.d.ts +291 -0
- package/dist/models/Bank.js +262 -0
- package/dist/models/Board.d.ts +60 -0
- package/dist/models/Board.js +6 -0
- package/dist/models/Catalog.d.ts +16 -0
- package/dist/models/Catalog.js +1 -0
- package/dist/models/DeliveredMessage.d.ts +27 -0
- package/dist/models/DeliveredMessage.js +17 -0
- package/dist/models/Enum.d.ts +21 -0
- package/dist/models/Enum.js +25 -0
- package/dist/models/FriendEvent.d.ts +107 -0
- package/dist/models/FriendEvent.js +83 -0
- package/dist/models/Group.d.ts +125 -0
- package/dist/models/Group.js +11 -0
- package/dist/models/GroupEvent.d.ts +178 -0
- package/dist/models/GroupEvent.js +90 -0
- package/dist/models/Label.d.ts +10 -0
- package/dist/models/Label.js +1 -0
- package/dist/models/Message.d.ts +91 -0
- package/dist/models/Message.js +29 -0
- package/dist/models/ProductCatalog.d.ts +17 -0
- package/dist/models/ProductCatalog.js +1 -0
- package/dist/models/QuickMessage.d.ts +25 -0
- package/dist/models/QuickMessage.js +1 -0
- package/dist/models/Reaction.d.ts +85 -0
- package/dist/models/Reaction.js +70 -0
- package/dist/models/Reminder.d.ts +51 -0
- package/dist/models/Reminder.js +7 -0
- package/dist/models/SeenMessage.d.ts +26 -0
- package/dist/models/SeenMessage.js +17 -0
- package/dist/models/Sticker.d.ts +27 -0
- package/dist/models/Sticker.js +1 -0
- package/dist/models/Typing.d.ts +24 -0
- package/dist/models/Typing.js +17 -0
- package/dist/models/Undo.d.ts +34 -0
- package/dist/models/Undo.js +12 -0
- package/dist/models/User.d.ts +70 -0
- package/dist/models/User.js +1 -0
- package/dist/models/ZBusiness.d.ts +22 -0
- package/dist/models/ZBusiness.js +35 -0
- package/dist/models/index.d.ts +22 -0
- package/dist/models/index.js +22 -0
- package/dist/update.d.ts +2 -0
- package/dist/update.js +29 -0
- package/dist/utils.d.ts +167 -0
- package/dist/utils.js +719 -0
- package/dist/zalo.d.ts +41 -0
- package/dist/zalo.js +107 -0
- package/index.d.ts +2 -0
- package/package.json +85 -0
package/dist/utils.js
ADDED
|
@@ -0,0 +1,719 @@
|
|
|
1
|
+
import cryptojs from "crypto-js";
|
|
2
|
+
import crypto from "node:crypto";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import pako from "pako";
|
|
6
|
+
import SparkMD5 from "spark-md5";
|
|
7
|
+
import toughCookie from "tough-cookie";
|
|
8
|
+
import JSONBig from "json-bigint";
|
|
9
|
+
import { isContextSession } from "./context.js";
|
|
10
|
+
import { ZaloApiError, ZaloApiMissingImageMetadataGetter } from "./Errors/index.js";
|
|
11
|
+
import { FriendEventType } from "./models/FriendEvent.js";
|
|
12
|
+
import { GroupEventType } from "./models/GroupEvent.js";
|
|
13
|
+
export const isBun = typeof Bun !== "undefined";
|
|
14
|
+
export function hasOwn(obj, key) {
|
|
15
|
+
return Object.prototype.hasOwnProperty.call(obj, key);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get signed key for API requests.
|
|
19
|
+
*
|
|
20
|
+
* @param type
|
|
21
|
+
* @param params
|
|
22
|
+
* @returns MD5 hash
|
|
23
|
+
*
|
|
24
|
+
*/
|
|
25
|
+
export function getSignKey(type, params) {
|
|
26
|
+
const n = [];
|
|
27
|
+
for (const s in params) {
|
|
28
|
+
if (hasOwn(params, s)) {
|
|
29
|
+
n.push(s);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
n.sort();
|
|
33
|
+
let a = "zsecure" + type;
|
|
34
|
+
for (let s = 0; s < n.length; s++)
|
|
35
|
+
a += params[n[s]];
|
|
36
|
+
return cryptojs.MD5(a).toString();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
* @param baseURL
|
|
41
|
+
* @param params
|
|
42
|
+
* @param apiVersion automatically add zalo api version to url params
|
|
43
|
+
* @returns
|
|
44
|
+
*
|
|
45
|
+
*/
|
|
46
|
+
export function makeURL(ctx, baseURL, params = {}, apiVersion = true) {
|
|
47
|
+
const url = new URL(baseURL);
|
|
48
|
+
for (const key in params) {
|
|
49
|
+
if (hasOwn(params, key)) {
|
|
50
|
+
url.searchParams.append(key, params[key].toString());
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (apiVersion) {
|
|
54
|
+
if (!url.searchParams.has("zpw_ver"))
|
|
55
|
+
url.searchParams.set("zpw_ver", ctx.API_VERSION.toString());
|
|
56
|
+
if (!url.searchParams.has("zpw_type"))
|
|
57
|
+
url.searchParams.set("zpw_type", ctx.API_TYPE.toString());
|
|
58
|
+
}
|
|
59
|
+
return url.toString();
|
|
60
|
+
}
|
|
61
|
+
export class ParamsEncryptor {
|
|
62
|
+
constructor({ type, imei, firstLaunchTime }) {
|
|
63
|
+
this.zcid = null;
|
|
64
|
+
this.enc_ver = "v2";
|
|
65
|
+
this.zcid = null;
|
|
66
|
+
this.encryptKey = null;
|
|
67
|
+
this.createZcid(type, imei, firstLaunchTime);
|
|
68
|
+
this.zcid_ext = ParamsEncryptor.randomString();
|
|
69
|
+
this.createEncryptKey();
|
|
70
|
+
}
|
|
71
|
+
getEncryptKey() {
|
|
72
|
+
if (!this.encryptKey)
|
|
73
|
+
throw new ZaloApiError("getEncryptKey: didn't create encryptKey yet");
|
|
74
|
+
return this.encryptKey;
|
|
75
|
+
}
|
|
76
|
+
createZcid(type, imei, firstLaunchTime) {
|
|
77
|
+
if (!type || !imei || !firstLaunchTime)
|
|
78
|
+
throw new ZaloApiError("createZcid: missing params");
|
|
79
|
+
const msg = `${type},${imei},${firstLaunchTime}`;
|
|
80
|
+
const s = ParamsEncryptor.encodeAES("3FC4F0D2AB50057BCE0D90D9187A22B1", msg, "hex", true);
|
|
81
|
+
this.zcid = s;
|
|
82
|
+
}
|
|
83
|
+
createEncryptKey(e = 0) {
|
|
84
|
+
const t = (e, t) => {
|
|
85
|
+
const { even: n } = ParamsEncryptor.processStr(e), { even: a, odd: s } = ParamsEncryptor.processStr(t);
|
|
86
|
+
if (!n || !a || !s)
|
|
87
|
+
return !1;
|
|
88
|
+
const i = n.slice(0, 8).join("") + a.slice(0, 12).join("") + s.reverse().slice(0, 12).join("");
|
|
89
|
+
return (this.encryptKey = i), !0;
|
|
90
|
+
};
|
|
91
|
+
if (!this.zcid || !this.zcid_ext)
|
|
92
|
+
throw new ZaloApiError("createEncryptKey: zcid or zcid_ext is null");
|
|
93
|
+
try {
|
|
94
|
+
const n = cryptojs.MD5(this.zcid_ext).toString().toUpperCase();
|
|
95
|
+
if (t(n, this.zcid) || !(e < 3))
|
|
96
|
+
return !1;
|
|
97
|
+
this.createEncryptKey(e + 1);
|
|
98
|
+
}
|
|
99
|
+
catch (_a) {
|
|
100
|
+
if (e < 3)
|
|
101
|
+
this.createEncryptKey(e + 1);
|
|
102
|
+
}
|
|
103
|
+
return !0;
|
|
104
|
+
}
|
|
105
|
+
getParams() {
|
|
106
|
+
return this.zcid
|
|
107
|
+
? {
|
|
108
|
+
zcid: this.zcid,
|
|
109
|
+
zcid_ext: this.zcid_ext,
|
|
110
|
+
enc_ver: this.enc_ver,
|
|
111
|
+
}
|
|
112
|
+
: null;
|
|
113
|
+
}
|
|
114
|
+
static processStr(e) {
|
|
115
|
+
if (!e || "string" != typeof e)
|
|
116
|
+
return {
|
|
117
|
+
even: null,
|
|
118
|
+
odd: null,
|
|
119
|
+
};
|
|
120
|
+
const [t, n] = [...e].reduce((e, t, n) => (e[n % 2].push(t), e), [[], []]);
|
|
121
|
+
return {
|
|
122
|
+
even: t,
|
|
123
|
+
odd: n,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
static randomString(e, t) {
|
|
127
|
+
const n = e || 6, a = t && e && t > e ? t : 12;
|
|
128
|
+
let s = Math.floor(Math.random() * (a - n + 1)) + n;
|
|
129
|
+
if (s > 12) {
|
|
130
|
+
let e = "";
|
|
131
|
+
for (; s > 0;) {
|
|
132
|
+
e += Math.random()
|
|
133
|
+
.toString(16)
|
|
134
|
+
.substr(2, s > 12 ? 12 : s);
|
|
135
|
+
s -= 12;
|
|
136
|
+
}
|
|
137
|
+
return e;
|
|
138
|
+
}
|
|
139
|
+
return Math.random().toString(16).substr(2, s);
|
|
140
|
+
}
|
|
141
|
+
static encodeAES(e, message, type, uppercase, s = 0) {
|
|
142
|
+
if (!message)
|
|
143
|
+
return null;
|
|
144
|
+
try {
|
|
145
|
+
{
|
|
146
|
+
const encoder = "hex" == type ? cryptojs.enc.Hex : cryptojs.enc.Base64;
|
|
147
|
+
const key = cryptojs.enc.Utf8.parse(e);
|
|
148
|
+
const cfg = {
|
|
149
|
+
words: [0, 0, 0, 0],
|
|
150
|
+
sigBytes: 16,
|
|
151
|
+
};
|
|
152
|
+
const encrypted = cryptojs.AES.encrypt(message, key, {
|
|
153
|
+
iv: cfg,
|
|
154
|
+
mode: cryptojs.mode.CBC,
|
|
155
|
+
padding: cryptojs.pad.Pkcs7,
|
|
156
|
+
}).ciphertext.toString(encoder);
|
|
157
|
+
return uppercase ? encrypted.toUpperCase() : encrypted;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch (_a) {
|
|
161
|
+
return s < 3 ? ParamsEncryptor.encodeAES(e, message, type, uppercase, s + 1) : null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
export function decryptResp(key, data) {
|
|
166
|
+
let n = null;
|
|
167
|
+
try {
|
|
168
|
+
n = decodeRespAES(key, data);
|
|
169
|
+
const parsed = JSON.parse(n);
|
|
170
|
+
return parsed;
|
|
171
|
+
}
|
|
172
|
+
catch (_a) {
|
|
173
|
+
return n;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function decodeRespAES(key, data) {
|
|
177
|
+
data = decodeURIComponent(data);
|
|
178
|
+
const parsedKey = cryptojs.enc.Utf8.parse(key);
|
|
179
|
+
const n = {
|
|
180
|
+
words: [0, 0, 0, 0],
|
|
181
|
+
sigBytes: 16,
|
|
182
|
+
};
|
|
183
|
+
return cryptojs.AES.decrypt({
|
|
184
|
+
ciphertext: cryptojs.enc.Base64.parse(data),
|
|
185
|
+
}, parsedKey, {
|
|
186
|
+
iv: n,
|
|
187
|
+
mode: cryptojs.mode.CBC,
|
|
188
|
+
padding: cryptojs.pad.Pkcs7,
|
|
189
|
+
}).toString(cryptojs.enc.Utf8);
|
|
190
|
+
}
|
|
191
|
+
export function decodeBase64ToBuffer(data) {
|
|
192
|
+
return Buffer.from(data, "base64");
|
|
193
|
+
}
|
|
194
|
+
export function decodeUnit8Array(data) {
|
|
195
|
+
try {
|
|
196
|
+
return new TextDecoder().decode(data);
|
|
197
|
+
}
|
|
198
|
+
catch (_a) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
export function encodeAES(secretKey, data, t = 0) {
|
|
203
|
+
try {
|
|
204
|
+
const key = cryptojs.enc.Base64.parse(secretKey);
|
|
205
|
+
return cryptojs.AES.encrypt(data, key, {
|
|
206
|
+
iv: cryptojs.enc.Hex.parse("00000000000000000000000000000000"),
|
|
207
|
+
mode: cryptojs.mode.CBC,
|
|
208
|
+
padding: cryptojs.pad.Pkcs7,
|
|
209
|
+
}).ciphertext.toString(cryptojs.enc.Base64);
|
|
210
|
+
}
|
|
211
|
+
catch (_a) {
|
|
212
|
+
return t < 3 ? encodeAES(secretKey, data, t + 1) : null;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
export function decodeAES(secretKey, data, t = 0) {
|
|
216
|
+
try {
|
|
217
|
+
data = decodeURIComponent(data);
|
|
218
|
+
const key = cryptojs.enc.Base64.parse(secretKey);
|
|
219
|
+
return cryptojs.AES.decrypt({
|
|
220
|
+
ciphertext: cryptojs.enc.Base64.parse(data),
|
|
221
|
+
}, key, {
|
|
222
|
+
iv: cryptojs.enc.Hex.parse("00000000000000000000000000000000"),
|
|
223
|
+
mode: cryptojs.mode.CBC,
|
|
224
|
+
padding: cryptojs.pad.Pkcs7,
|
|
225
|
+
}).toString(cryptojs.enc.Utf8);
|
|
226
|
+
}
|
|
227
|
+
catch (_a) {
|
|
228
|
+
return t < 3 ? decodeAES(secretKey, data, t + 1) : null;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
export async function getDefaultHeaders(ctx, origin = "https://chat.zalo.me") {
|
|
232
|
+
if (!ctx.cookie)
|
|
233
|
+
throw new ZaloApiError("Cookie is not available");
|
|
234
|
+
if (!ctx.userAgent)
|
|
235
|
+
throw new ZaloApiError("User agent is not available");
|
|
236
|
+
return {
|
|
237
|
+
Accept: "application/json, text/plain, */*",
|
|
238
|
+
"Accept-Encoding": "gzip, deflate, br, zstd",
|
|
239
|
+
"Accept-Language": "en-US,en;q=0.9",
|
|
240
|
+
"content-type": "application/x-www-form-urlencoded",
|
|
241
|
+
Cookie: await ctx.cookie.getCookieString(origin),
|
|
242
|
+
Origin: "https://chat.zalo.me",
|
|
243
|
+
Referer: "https://chat.zalo.me/",
|
|
244
|
+
"User-Agent": ctx.userAgent,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
export async function request(ctx, url, options, raw = false) {
|
|
248
|
+
var _a, _b;
|
|
249
|
+
if (!ctx.cookie)
|
|
250
|
+
ctx.cookie = new toughCookie.CookieJar();
|
|
251
|
+
const origin = new URL(url).origin;
|
|
252
|
+
const defaultHeaders = await getDefaultHeaders(ctx, origin);
|
|
253
|
+
if (!raw) {
|
|
254
|
+
if (options) {
|
|
255
|
+
options.headers = Object.assign(defaultHeaders, options.headers || {});
|
|
256
|
+
}
|
|
257
|
+
else
|
|
258
|
+
options = { headers: defaultHeaders };
|
|
259
|
+
}
|
|
260
|
+
const _options = Object.assign(Object.assign({}, (options !== null && options !== void 0 ? options : {})), (isBun ? {
|
|
261
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
262
|
+
// @ts-ignore
|
|
263
|
+
proxy: (_b = (_a = ctx.options.agent) === null || _a === void 0 ? void 0 : _a.proxy) === null || _b === void 0 ? void 0 : _b.href
|
|
264
|
+
} : { agent: ctx.options.agent }));
|
|
265
|
+
const response = await ctx.options.polyfill(url, _options);
|
|
266
|
+
const setCookieRaw = response.headers.get("set-cookie");
|
|
267
|
+
if (setCookieRaw && !raw) {
|
|
268
|
+
// Use getSetCookie() (Node.js 18+) to properly parse multi-cookie headers.
|
|
269
|
+
// The split(", ") method breaks cookies containing Expires dates with commas
|
|
270
|
+
// (e.g., "Expires=Wed, 18 Mar 2026..."), causing critical cookies like
|
|
271
|
+
// zpsid and zpw_sek to be lost during QR login flow.
|
|
272
|
+
let cookieStrings;
|
|
273
|
+
if (typeof response.headers.getSetCookie === "function") {
|
|
274
|
+
cookieStrings = response.headers.getSetCookie();
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
cookieStrings = setCookieRaw.split(", ");
|
|
278
|
+
}
|
|
279
|
+
for (const cookie of cookieStrings) {
|
|
280
|
+
const parsed = toughCookie.Cookie.parse(cookie);
|
|
281
|
+
try {
|
|
282
|
+
if (parsed)
|
|
283
|
+
await ctx.cookie.setCookie(parsed, parsed.domain != "zalo.me" ? `https://${parsed.domain}` : origin);
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
logger(ctx).error(error);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
const redirectURL = response.headers.get("location");
|
|
291
|
+
if (redirectURL) {
|
|
292
|
+
const redirectOptions = Object.assign({}, options);
|
|
293
|
+
redirectOptions.method = "GET";
|
|
294
|
+
if (!raw) {
|
|
295
|
+
redirectOptions.headers = new Headers(redirectOptions.headers);
|
|
296
|
+
redirectOptions.headers.set("Referer", "https://id.zalo.me/");
|
|
297
|
+
}
|
|
298
|
+
return await request(ctx, redirectURL, redirectOptions);
|
|
299
|
+
}
|
|
300
|
+
return response;
|
|
301
|
+
}
|
|
302
|
+
export async function getImageMetaData(ctx, filePath) {
|
|
303
|
+
if (!ctx.options.imageMetadataGetter) {
|
|
304
|
+
throw new ZaloApiMissingImageMetadataGetter();
|
|
305
|
+
}
|
|
306
|
+
const imageData = await ctx.options.imageMetadataGetter(filePath);
|
|
307
|
+
if (!imageData) {
|
|
308
|
+
throw new ZaloApiError("Failed to get image metadata");
|
|
309
|
+
}
|
|
310
|
+
const fileName = filePath.split("/").pop();
|
|
311
|
+
return {
|
|
312
|
+
fileName,
|
|
313
|
+
totalSize: imageData.size,
|
|
314
|
+
width: imageData.width,
|
|
315
|
+
height: imageData.height,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
export async function getFileSize(filePath) {
|
|
319
|
+
return fs.promises.stat(filePath).then((s) => s.size);
|
|
320
|
+
}
|
|
321
|
+
export async function getGifMetaData(ctx, filePath) {
|
|
322
|
+
if (!ctx.options.imageMetadataGetter) {
|
|
323
|
+
throw new ZaloApiMissingImageMetadataGetter();
|
|
324
|
+
}
|
|
325
|
+
const gifData = await ctx.options.imageMetadataGetter(filePath);
|
|
326
|
+
if (!gifData) {
|
|
327
|
+
throw new ZaloApiError("Failed to get gif metadata");
|
|
328
|
+
}
|
|
329
|
+
const fileName = path.basename(filePath);
|
|
330
|
+
return {
|
|
331
|
+
fileName,
|
|
332
|
+
totalSize: gifData.size,
|
|
333
|
+
width: gifData.width,
|
|
334
|
+
height: gifData.height,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
export async function decodeEventData(parsed, cipherKey) {
|
|
338
|
+
if (typeof parsed.data !== "string")
|
|
339
|
+
throw new ZaloApiError(`Invalid data, expected string but got ${typeof parsed.data}`);
|
|
340
|
+
if (typeof parsed.encrypt !== "number")
|
|
341
|
+
throw new ZaloApiError(`Invalid encrypt type, expected number but got ${typeof parsed.encrypt}`);
|
|
342
|
+
if (parsed.encrypt < 0 || parsed.encrypt > 3)
|
|
343
|
+
throw new ZaloApiError(`Invalid encrypt type, expected 0-3 but got ${parsed.encrypt}`);
|
|
344
|
+
const rawData = parsed.data;
|
|
345
|
+
const encryptType = parsed.encrypt;
|
|
346
|
+
if (encryptType === 0)
|
|
347
|
+
return JSON.parse(rawData);
|
|
348
|
+
const decodedBuffer = decodeBase64ToBuffer(encryptType === 1 ? rawData : decodeURIComponent(rawData));
|
|
349
|
+
let decryptedBuffer = decodedBuffer;
|
|
350
|
+
if (encryptType !== 1) {
|
|
351
|
+
if (cipherKey && decodedBuffer.length >= 48) {
|
|
352
|
+
const algorithm = {
|
|
353
|
+
name: "AES-GCM",
|
|
354
|
+
iv: decodedBuffer.subarray(0, 16),
|
|
355
|
+
tagLength: 128,
|
|
356
|
+
additionalData: decodedBuffer.subarray(16, 32),
|
|
357
|
+
};
|
|
358
|
+
const dataSource = decodedBuffer.subarray(32);
|
|
359
|
+
const cryptoKey = await crypto.subtle.importKey("raw", decodeBase64ToBuffer(cipherKey), algorithm, false, [
|
|
360
|
+
"decrypt",
|
|
361
|
+
]);
|
|
362
|
+
decryptedBuffer = await crypto.subtle.decrypt(algorithm, cryptoKey, dataSource);
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
throw new ZaloApiError("Invalid data length or missing cipher key");
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
const decompressedBuffer = encryptType === 3 ? new Uint8Array(decryptedBuffer) : pako.inflate(decryptedBuffer);
|
|
369
|
+
const decodedData = decodeUnit8Array(decompressedBuffer);
|
|
370
|
+
if (!decodedData)
|
|
371
|
+
return;
|
|
372
|
+
return JSONBig.parse(decodedData);
|
|
373
|
+
}
|
|
374
|
+
export async function getMd5LargeFileObject(source, fileSize) {
|
|
375
|
+
const buffer = typeof source == "string" ? await fs.promises.readFile(source) : source.data;
|
|
376
|
+
return new Promise((resolve) => {
|
|
377
|
+
let currentChunk = 0;
|
|
378
|
+
const chunkSize = 2097152, // Read in chunks of 2MB
|
|
379
|
+
chunks = Math.ceil(fileSize / chunkSize), spark = new SparkMD5.ArrayBuffer();
|
|
380
|
+
function loadNext() {
|
|
381
|
+
const start = currentChunk * chunkSize, end = start + chunkSize >= fileSize ? fileSize : start + chunkSize;
|
|
382
|
+
spark.append(new Uint8Array(buffer.subarray(start, end)).buffer);
|
|
383
|
+
currentChunk++;
|
|
384
|
+
if (currentChunk < chunks) {
|
|
385
|
+
loadNext();
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
resolve({
|
|
389
|
+
currentChunk,
|
|
390
|
+
data: spark.end(),
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
loadNext();
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
export const logger = (ctx) => ({
|
|
398
|
+
verbose: (...args) => {
|
|
399
|
+
if (ctx.options.logging)
|
|
400
|
+
console.log("\x1b[35m🚀 VERBOSE\x1b[0m", ...args);
|
|
401
|
+
},
|
|
402
|
+
info: (...args) => {
|
|
403
|
+
if (ctx.options.logging)
|
|
404
|
+
console.log("\x1b[34mINFO\x1b[0m", ...args);
|
|
405
|
+
},
|
|
406
|
+
warn: (...args) => {
|
|
407
|
+
if (ctx.options.logging)
|
|
408
|
+
console.log("\x1b[33mWARN\x1b[0m", ...args);
|
|
409
|
+
},
|
|
410
|
+
error: (...args) => {
|
|
411
|
+
if (ctx.options.logging)
|
|
412
|
+
console.log("\x1b[31mERROR\x1b[0m", ...args);
|
|
413
|
+
},
|
|
414
|
+
success: (...args) => {
|
|
415
|
+
if (ctx.options.logging)
|
|
416
|
+
console.log("\x1b[32mSUCCESS\x1b[0m", ...args);
|
|
417
|
+
},
|
|
418
|
+
timestamp: (...args) => {
|
|
419
|
+
const now = new Date().toISOString();
|
|
420
|
+
if (ctx.options.logging)
|
|
421
|
+
console.log(`\x1b[90m[${now}]\x1b[0m`, ...args);
|
|
422
|
+
},
|
|
423
|
+
});
|
|
424
|
+
export function getClientMessageType(msgType) {
|
|
425
|
+
if (msgType === "webchat")
|
|
426
|
+
return 1;
|
|
427
|
+
if (msgType === "chat.voice")
|
|
428
|
+
return 31;
|
|
429
|
+
if (msgType === "chat.photo")
|
|
430
|
+
return 32;
|
|
431
|
+
if (msgType === "chat.sticker")
|
|
432
|
+
return 36;
|
|
433
|
+
if (msgType === "chat.doodle")
|
|
434
|
+
return 37;
|
|
435
|
+
if (msgType === "chat.recommended")
|
|
436
|
+
return 38;
|
|
437
|
+
if (msgType === "chat.link")
|
|
438
|
+
return 38; // don't know || if (msgType === "chat.link") return 1;
|
|
439
|
+
if (msgType === "chat.video.msg")
|
|
440
|
+
return 44; // not sure
|
|
441
|
+
if (msgType === "share.file")
|
|
442
|
+
return 46;
|
|
443
|
+
if (msgType === "chat.gif")
|
|
444
|
+
return 49;
|
|
445
|
+
if (msgType === "chat.location.new")
|
|
446
|
+
return 43;
|
|
447
|
+
return 1;
|
|
448
|
+
}
|
|
449
|
+
export function strPadLeft(e, t, n) {
|
|
450
|
+
const a = (e = "" + e).length;
|
|
451
|
+
return a === n ? e : a > n ? e.slice(-n) : t.repeat(n - a) + e;
|
|
452
|
+
}
|
|
453
|
+
export function formatTime(format, timestamp = Date.now()) {
|
|
454
|
+
const date = new Date(timestamp);
|
|
455
|
+
// using lib Intl
|
|
456
|
+
const options = {
|
|
457
|
+
year: "numeric",
|
|
458
|
+
month: "2-digit",
|
|
459
|
+
day: "2-digit",
|
|
460
|
+
hour: "2-digit",
|
|
461
|
+
minute: "2-digit",
|
|
462
|
+
second: "2-digit",
|
|
463
|
+
// hour12: false, // true or false is same <(")
|
|
464
|
+
};
|
|
465
|
+
const formatted = new Intl.DateTimeFormat("vi-VN", options).format(date);
|
|
466
|
+
if (format.includes("%H") || format.includes("%d")) {
|
|
467
|
+
return format
|
|
468
|
+
.replace("%H", date.getHours().toString().padStart(2, "0"))
|
|
469
|
+
.replace("%M", date.getMinutes().toString().padStart(2, "0"))
|
|
470
|
+
.replace("%S", date.getSeconds().toString().padStart(2, "0"))
|
|
471
|
+
.replace("%d", date.getDate().toString().padStart(2, "0"))
|
|
472
|
+
.replace("%m", (date.getMonth() + 1).toString().padStart(2, "0"))
|
|
473
|
+
.replace("%Y", date.getFullYear().toString());
|
|
474
|
+
}
|
|
475
|
+
return formatted;
|
|
476
|
+
}
|
|
477
|
+
export function getFullTimeFromMillisecond(e) {
|
|
478
|
+
const t = new Date(e);
|
|
479
|
+
return (strPadLeft(t.getHours(), "0", 2) +
|
|
480
|
+
":" +
|
|
481
|
+
strPadLeft(t.getMinutes(), "0", 2) +
|
|
482
|
+
" " +
|
|
483
|
+
strPadLeft(t.getDate(), "0", 2) +
|
|
484
|
+
"/" +
|
|
485
|
+
strPadLeft(t.getMonth() + 1, "0", 2) +
|
|
486
|
+
"/" +
|
|
487
|
+
t.getFullYear());
|
|
488
|
+
}
|
|
489
|
+
export function getFileExtension(e) {
|
|
490
|
+
return path.extname(e).slice(1);
|
|
491
|
+
}
|
|
492
|
+
export function getFileName(e) {
|
|
493
|
+
return path.basename(e);
|
|
494
|
+
}
|
|
495
|
+
export function removeUndefinedKeys(e) {
|
|
496
|
+
for (const t in e)
|
|
497
|
+
if (e[t] === undefined)
|
|
498
|
+
delete e[t];
|
|
499
|
+
return e;
|
|
500
|
+
}
|
|
501
|
+
export function getGroupEventType(act) {
|
|
502
|
+
if (act == "join_request")
|
|
503
|
+
return GroupEventType.JOIN_REQUEST;
|
|
504
|
+
if (act == "join")
|
|
505
|
+
return GroupEventType.JOIN;
|
|
506
|
+
if (act == "leave")
|
|
507
|
+
return GroupEventType.LEAVE;
|
|
508
|
+
if (act == "remove_member")
|
|
509
|
+
return GroupEventType.REMOVE_MEMBER;
|
|
510
|
+
if (act == "block_member")
|
|
511
|
+
return GroupEventType.BLOCK_MEMBER;
|
|
512
|
+
if (act == "update_setting")
|
|
513
|
+
return GroupEventType.UPDATE_SETTING;
|
|
514
|
+
if (act == "update_avatar")
|
|
515
|
+
return GroupEventType.UPDATE_AVATAR;
|
|
516
|
+
if (act == "update")
|
|
517
|
+
return GroupEventType.UPDATE;
|
|
518
|
+
if (act == "new_link")
|
|
519
|
+
return GroupEventType.NEW_LINK;
|
|
520
|
+
if (act == "add_admin")
|
|
521
|
+
return GroupEventType.ADD_ADMIN;
|
|
522
|
+
if (act == "remove_admin")
|
|
523
|
+
return GroupEventType.REMOVE_ADMIN;
|
|
524
|
+
if (act == "new_pin_topic")
|
|
525
|
+
return GroupEventType.NEW_PIN_TOPIC;
|
|
526
|
+
if (act == "update_pin_topic")
|
|
527
|
+
return GroupEventType.UPDATE_PIN_TOPIC;
|
|
528
|
+
if (act == "update_topic")
|
|
529
|
+
return GroupEventType.UPDATE_TOPIC;
|
|
530
|
+
if (act == "update_board")
|
|
531
|
+
return GroupEventType.UPDATE_BOARD;
|
|
532
|
+
if (act == "remove_board")
|
|
533
|
+
return GroupEventType.REMOVE_BOARD;
|
|
534
|
+
if (act == "reorder_pin_topic")
|
|
535
|
+
return GroupEventType.REORDER_PIN_TOPIC;
|
|
536
|
+
if (act == "unpin_topic")
|
|
537
|
+
return GroupEventType.UNPIN_TOPIC;
|
|
538
|
+
if (act == "remove_topic")
|
|
539
|
+
return GroupEventType.REMOVE_TOPIC;
|
|
540
|
+
if (act == "accept_remind")
|
|
541
|
+
return GroupEventType.ACCEPT_REMIND;
|
|
542
|
+
if (act == "reject_remind")
|
|
543
|
+
return GroupEventType.REJECT_REMIND;
|
|
544
|
+
if (act == "remind_topic")
|
|
545
|
+
return GroupEventType.REMIND_TOPIC;
|
|
546
|
+
return GroupEventType.UNKNOWN;
|
|
547
|
+
}
|
|
548
|
+
export function getFriendEventType(act) {
|
|
549
|
+
if (act == "add")
|
|
550
|
+
return FriendEventType.ADD;
|
|
551
|
+
if (act == "remove")
|
|
552
|
+
return FriendEventType.REMOVE;
|
|
553
|
+
if (act == "block")
|
|
554
|
+
return FriendEventType.BLOCK;
|
|
555
|
+
if (act == "unblock")
|
|
556
|
+
return FriendEventType.UNBLOCK;
|
|
557
|
+
if (act == "block_call")
|
|
558
|
+
return FriendEventType.BLOCK_CALL;
|
|
559
|
+
if (act == "unblock_call")
|
|
560
|
+
return FriendEventType.UNBLOCK_CALL;
|
|
561
|
+
if (act == "req_v2")
|
|
562
|
+
return FriendEventType.REQUEST;
|
|
563
|
+
if (act == "reject")
|
|
564
|
+
return FriendEventType.REJECT_REQUEST;
|
|
565
|
+
if (act == "undo_req")
|
|
566
|
+
return FriendEventType.UNDO_REQUEST;
|
|
567
|
+
if (act == "seen_fr_req")
|
|
568
|
+
return FriendEventType.SEEN_FRIEND_REQUEST;
|
|
569
|
+
if (act == "pin_unpin")
|
|
570
|
+
return FriendEventType.PIN_UNPIN;
|
|
571
|
+
if (act == "pin_create")
|
|
572
|
+
return FriendEventType.PIN_CREATE;
|
|
573
|
+
return FriendEventType.UNKNOWN;
|
|
574
|
+
}
|
|
575
|
+
export async function handleZaloResponse(ctx, response, isEncrypted = true) {
|
|
576
|
+
const result = {
|
|
577
|
+
data: null,
|
|
578
|
+
error: null,
|
|
579
|
+
};
|
|
580
|
+
if (!response.ok) {
|
|
581
|
+
result.error = {
|
|
582
|
+
message: "Request failed with status code " + response.status,
|
|
583
|
+
};
|
|
584
|
+
return result;
|
|
585
|
+
}
|
|
586
|
+
try {
|
|
587
|
+
const jsonData = await response.json();
|
|
588
|
+
if (jsonData.error_code != 0) {
|
|
589
|
+
result.error = {
|
|
590
|
+
message: jsonData.error_message,
|
|
591
|
+
code: jsonData.error_code,
|
|
592
|
+
};
|
|
593
|
+
return result;
|
|
594
|
+
}
|
|
595
|
+
const decodedData = isEncrypted ? JSON.parse(decodeAES(ctx.secretKey, jsonData.data)) : jsonData;
|
|
596
|
+
if (decodedData.error_code != 0) {
|
|
597
|
+
result.error = {
|
|
598
|
+
message: decodedData.error_message,
|
|
599
|
+
code: decodedData.error_code,
|
|
600
|
+
};
|
|
601
|
+
return result;
|
|
602
|
+
}
|
|
603
|
+
result.data = decodedData.data;
|
|
604
|
+
}
|
|
605
|
+
catch (error) {
|
|
606
|
+
logger(ctx).error("Failed to parse response data:", error);
|
|
607
|
+
result.error = {
|
|
608
|
+
message: "Failed to parse response data",
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
return result;
|
|
612
|
+
}
|
|
613
|
+
export async function resolveResponse(ctx, res, cb, isEncrypted) {
|
|
614
|
+
const result = await handleZaloResponse(ctx, res, isEncrypted);
|
|
615
|
+
if (result.error)
|
|
616
|
+
throw new ZaloApiError(result.error.message, result.error.code);
|
|
617
|
+
if (cb)
|
|
618
|
+
return cb(result);
|
|
619
|
+
return result.data;
|
|
620
|
+
}
|
|
621
|
+
export function apiFactory() {
|
|
622
|
+
return (callback) => {
|
|
623
|
+
return (ctx, api) => {
|
|
624
|
+
if (!isContextSession(ctx))
|
|
625
|
+
throw new ZaloApiError("Invalid context " + JSON.stringify(ctx, null, 2));
|
|
626
|
+
const utils = {
|
|
627
|
+
makeURL(baseURL, params, apiVersion) {
|
|
628
|
+
return makeURL(ctx, baseURL, params, apiVersion);
|
|
629
|
+
},
|
|
630
|
+
encodeAES(data, t) {
|
|
631
|
+
return encodeAES(ctx.secretKey, data, t);
|
|
632
|
+
},
|
|
633
|
+
request(url, options, raw) {
|
|
634
|
+
return request(ctx, url, options, raw);
|
|
635
|
+
},
|
|
636
|
+
logger: logger(ctx),
|
|
637
|
+
resolve: (res, cb, isEncrypted) => resolveResponse(ctx, res, cb, isEncrypted),
|
|
638
|
+
};
|
|
639
|
+
return callback(api, ctx, utils);
|
|
640
|
+
};
|
|
641
|
+
};
|
|
642
|
+
}
|
|
643
|
+
export function generateZaloUUID(userAgent) {
|
|
644
|
+
return crypto.randomUUID() + "-" + cryptojs.MD5(userAgent).toString();
|
|
645
|
+
}
|
|
646
|
+
/**
|
|
647
|
+
* Encrypts a 4-digit PIN to a 32-character hex string
|
|
648
|
+
* @param pin 4-digit PIN number
|
|
649
|
+
* @returns 32-character hex string
|
|
650
|
+
*/
|
|
651
|
+
export function encryptPin(pin) {
|
|
652
|
+
return crypto.createHash("md5").update(pin).digest("hex");
|
|
653
|
+
}
|
|
654
|
+
/**
|
|
655
|
+
* Decrypts a 32-character hex string back to 4-digit PIN
|
|
656
|
+
* Note: This is a one-way hash, so we can only verify if a PIN matches the hash
|
|
657
|
+
* @param encryptedPin 32-character hex string
|
|
658
|
+
* @param pin 4-digit PIN to verify
|
|
659
|
+
* @returns true if the PIN matches the hash
|
|
660
|
+
*
|
|
661
|
+
* @example
|
|
662
|
+
* const encryptedPin = (await api.getHiddenConversations()).pin;
|
|
663
|
+
* checking pin created..
|
|
664
|
+
* const isValid = validatePin(encryptedPin, "1234"); // true if pin created is 1234
|
|
665
|
+
* const isInvalid = validatePin(encryptedPin, "5678"); // false if not pin created is 5678
|
|
666
|
+
*/
|
|
667
|
+
export function validatePin(encryptedPin, pin) {
|
|
668
|
+
const hash = crypto.createHash("md5").update(pin).digest("hex");
|
|
669
|
+
return hash === encryptedPin;
|
|
670
|
+
}
|
|
671
|
+
/**
|
|
672
|
+
* Converts a hex color code to a negative color number used by Zalo API
|
|
673
|
+
* @param hex Hex color code (e.g. '#00FF00' or '00FF00')
|
|
674
|
+
* @returns Negative color number (e.g. -16711936)
|
|
675
|
+
*
|
|
676
|
+
* @example
|
|
677
|
+
* const negativeColor = hexToNegativeColor('#00FF00'); // Result: -16711936
|
|
678
|
+
*/
|
|
679
|
+
export function hexToNegativeColor(hex) {
|
|
680
|
+
if (!hex.startsWith("#")) {
|
|
681
|
+
hex = "#" + hex;
|
|
682
|
+
}
|
|
683
|
+
// rgb no alpha
|
|
684
|
+
// const decimal = parseInt(hex.slice(1), 16);
|
|
685
|
+
// return decimal - 4294967296;
|
|
686
|
+
// rgb with alpha
|
|
687
|
+
let hexValue = hex.slice(1);
|
|
688
|
+
if (hexValue.length === 6) {
|
|
689
|
+
hexValue = "FF" + hexValue;
|
|
690
|
+
}
|
|
691
|
+
const decimal = parseInt(hexValue, 16);
|
|
692
|
+
return decimal > 0x7fffffff ? decimal - 4294967296 : decimal;
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Converts a negative color number from Zalo API to hex color code
|
|
696
|
+
* @param negativeColor Negative color number (e.g. -16711936)
|
|
697
|
+
* @returns Hex color code (e.g. '#00FF00')
|
|
698
|
+
*
|
|
699
|
+
* @example
|
|
700
|
+
* const hexColor = negativeColorToHex(-16711936); // Result: '#00FF00'
|
|
701
|
+
*/
|
|
702
|
+
export function negativeColorToHex(negativeColor) {
|
|
703
|
+
// Add 2^32 to get positive number
|
|
704
|
+
const positiveColor = negativeColor + 4294967296;
|
|
705
|
+
// return "#" + positiveColor.toString(16).padStart(6, "0"); // rgb no alpha
|
|
706
|
+
return "#" + positiveColor.toString(16).slice(-6).padStart(6, "0"); // rgb with alpha
|
|
707
|
+
}
|
|
708
|
+
export function normalizeHolderName(input) {
|
|
709
|
+
if (!input)
|
|
710
|
+
return undefined;
|
|
711
|
+
const normalized = input
|
|
712
|
+
.normalize("NFD")
|
|
713
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
714
|
+
.replace(/[đĐ]/g, "d")
|
|
715
|
+
.toUpperCase()
|
|
716
|
+
.replace(/[^A-Z0-9]+/g, " ")
|
|
717
|
+
.trim();
|
|
718
|
+
return normalized.length >= 5 ? normalized : undefined;
|
|
719
|
+
}
|