UNPKG

icqq

Version:

QQ protocol for NodeJS!

247 lines (246 loc) 8.85 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getCmdWhiteList = exports.getApiQQVer = exports.submitSsoPacket = exports.requestSignToken = exports.getSign = exports.getT544 = void 0; const axios_1 = __importDefault(require("axios")); const base_client_1 = require("./base-client"); const constants_1 = require("./constants"); async function getT544(cmd) { let sign = constants_1.BUF0; if (this.sig.sign_api_addr && this.apk.qua) { const time = Date.now(); let post_params = { ver: this.apk.ver, uin: this.uin || 0, data: cmd, guid: this.device.guid.toString('hex'), version: this.apk.sdkver }; let url = new URL(this.sig.sign_api_addr); let path = url.pathname; if (path.substring(path.length - 1) === '/') { path += 'energy'; } else { path = path.replace(/\/sign$/, '/energy'); } url.pathname = path; const data = await get.bind(this)(url.href, post_params, true); const log = `getT544:${cmd} result(${Date.now() - time}ms):${JSON.stringify(data)}`; if (data.code === 0) { this.emit("internal.verbose", log, base_client_1.VerboseLevel.Debug); if (typeof (data.data) === 'string') { sign = Buffer.from(data.data, 'hex'); } else if (typeof (data.data?.sign) === 'string') { sign = Buffer.from(data.data.sign, 'hex'); if (typeof (data.data.t553) === 'string') this.sig.t553 = Buffer.from(data.data.t553, 'hex'); } } else { this.emit("internal.verbose", `签名api异常:${log}`, base_client_1.VerboseLevel.Error); } } return this.generateT544Packet(cmd, sign); } exports.getT544 = getT544; async function getSign(cmd, seq, body) { let params = constants_1.BUF0; if (!this.sig.sign_api_addr) { return params; } let qImei36 = this.device.qImei36 || this.device.qImei16; if (this.apk.qua) { const time = Date.now(); let post_params = { ver: this.apk.ver, qua: this.apk.qua, uin: this.uin || 0, cmd: cmd, seq: seq, androidId: this.device.android_id, qimei36: qImei36 || this.device.android_id, guid: this.device.guid.toString('hex'), buffer: body.toString('hex') }; let url = new URL(this.sig.sign_api_addr); let path = url.pathname; if (path.substring(path.length - 1) === '/') { path += 'sign'; } url.pathname = path; const data = await get.bind(this)(url.href, post_params, true); const log = `sign:${cmd} seq:${seq} result(${Date.now() - time}ms):${JSON.stringify(data)}`; if (data.code === 0) { this.emit("internal.verbose", log, base_client_1.VerboseLevel.Debug); const Data = data.data || {}; params = this.generateSignPacket(Data.sign, Data.token, Data.extra); let list = Data.ssoPacketList || Data.requestCallback || []; if (list.length > 0) this.ssoPacketListHandler(list); } else { this.emit("internal.verbose", `签名api异常:${log}`, base_client_1.VerboseLevel.Error); } } return params; } exports.getSign = getSign; async function requestSignToken() { if (!this.sig.sign_api_addr) { return []; } let qImei36 = this.device.qImei36 || this.device.qImei16; if (this.apk.qua) { const time = Date.now(); let post_params = { ver: this.apk.ver, qua: this.apk.qua, uin: this.uin || 0, androidId: this.device.android_id, qimei36: qImei36 || this.device.android_id, guid: this.device.guid.toString('hex'), }; let url = new URL(this.sig.sign_api_addr); let path = url.pathname; if (path.substring(path.length - 1) === '/') { path += 'request_token'; } else { path = path.replace(/\/sign$/, '/request_token'); } url.pathname = path; const data = await get.bind(this)(url.href, post_params, true); this.emit("internal.verbose", `requestSignToken result(${Date.now() - time}ms): ${JSON.stringify(data)}`, base_client_1.VerboseLevel.Debug); if (data.code === 0) { let ssoPacketList = data.data?.ssoPacketList || data.data?.requestCallback || data.data; if (!ssoPacketList || ssoPacketList.length < 1) return []; return ssoPacketList; } } return []; } exports.requestSignToken = requestSignToken; async function submitSsoPacket(cmd, callbackId, body) { if (!this.sig.sign_api_addr) { return []; } let qImei36 = this.device.qImei36 || this.device.qImei16; if (this.apk.qua) { const time = Date.now(); let post_params = { ver: this.apk.ver, qua: this.apk.qua, uin: this.uin || 0, cmd: cmd, callbackId: callbackId, androidId: this.device.android_id, qimei36: qImei36 || this.device.android_id, buffer: body.toString('hex'), guid: this.device.guid.toString('hex'), }; let url = new URL(this.sig.sign_api_addr); let path = url.pathname; if (path.substring(path.length - 1) === '/') { path += 'submit'; } else { path = path.replace(/\/sign$/, '/submit'); } url.pathname = path; const data = await get.bind(this)(url.href, post_params, true); this.emit("internal.verbose", `submitSsoPacket result(${Date.now() - time}ms): ${JSON.stringify(data)}`, base_client_1.VerboseLevel.Debug); if (data.code === 0) { let ssoPacketList = data.data?.ssoPacketList || data.data?.requestCallback || data.data; if (!ssoPacketList || ssoPacketList.length < 1) return []; return ssoPacketList; } } return []; } exports.submitSsoPacket = submitSsoPacket; async function getApiQQVer() { let QQVer = this.config.ver; if (!this.sig.sign_api_addr) { return QQVer; } const apks = this.getApkInfoList(this.config.platform); const packageName = this.apk.id; let url = new URL(this.sig.sign_api_addr); let path = url.pathname; if (path.substring(path.length - 1) === '/') { path += 'ver'; } else { path = path.replace(/\/sign$/, '/ver'); } url.pathname = path; const data = await get.bind(this)(url.href); if (data.code === 0) { const vers = data?.data[packageName]; if (vers && vers.length > 0) { for (let ver of vers) { if (apks.find(val => val.ver === ver)) { QQVer = ver; break; } } } } return QQVer; } exports.getApiQQVer = getApiQQVer; async function getCmdWhiteList() { let whiteList = []; if (!this.sig.sign_api_addr) { return whiteList; } let url = new URL(this.sig.sign_api_addr); let path = url.pathname; if (path.substring(path.length - 1) === '/') { path += 'cmd_whitelist'; } else { path = path.replace(/\/sign$/, '/cmd_whitelist'); } url.pathname = path; const data = await get.bind(this)(url.href, { ver: this.apk.ver, uin: this.uin || 0 }); if (data.code === 0) { whiteList = data?.data?.list || []; } return whiteList; } exports.getCmdWhiteList = getCmdWhiteList; async function get(url, params = {}, post = false) { const config = { timeout: 20000, headers: { 'User-Agent': `icqq@${this.pkg.version} (Released on ${this.pkg.upday})`, 'Content-Type': "application/x-www-form-urlencoded" } }; let data = { code: -1 }; let num = 0; while (data.code == -1 && num < 3) { if (num > 0) await new Promise((resolve) => setTimeout(resolve, 2000)); num++; if (post) { data = await axios_1.default.post(url, params, config).catch(err => ({ data: { code: -1, msg: err?.message } })); } else { config.params = params; data = await axios_1.default.get(url, config).catch(err => ({ data: { code: -1, msg: err?.message } })); } data = data.data; } return data; }