UNPKG

@mi-gpt/miot

Version:

MIoT 非官方 Node.js 客户端

89 lines (86 loc) 2.47 kB
import { RC4, rc4Hash } from './chunk-ZKYHC3VJ.js'; import { randomNoise, signNonce } from './chunk-34CBAQZN.js'; import { jsonDecode, jsonEncode } from '@mi-gpt/utils/parse'; import * as pako from 'pako'; function encodeBase64(text) { return Buffer.from(text).toString("base64"); } function decodeBase64(base64Encoded) { return Buffer.from(base64Encoded, "base64").toString(); } function parseAuthPass(res) { try { return jsonDecode( res.replace("&&&START&&&", "").replace(/:(\d{9,})/g, ':"$1"') // 把 userId 和 nonce 转成 string ) ?? {}; } catch { return {}; } } function encodeQuery(data) { return Object.entries(data).map( ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value == null ? "" : value.toString())}` ).join("&"); } function decodeQuery(str) { const data = {}; if (!str) { return data; } const ss = str.split("&"); for (let i = 0; i < ss.length; i++) { const s = ss[i].split("="); if (s.length != 2) { continue; } const k = decodeURIComponent(s[0]); let v = decodeURIComponent(s[1]); if (/^\[{/.test(v)) { try { v = jsonDecode(v); } catch { } } data[k] = v; } return data; } function encodeMIoT(method, uri, data, ssecurity) { const nonce = randomNoise(); const snonce = signNonce(ssecurity, nonce); const key = Buffer.from(snonce, "base64"); const rc4 = new RC4(key); rc4.update(Buffer.alloc(1024)); const json = jsonEncode(data); const map = { data: json }; map.rc4_hash__ = rc4Hash(method, uri, map, snonce); for (const k in map) { const v = map[k]; map[k] = rc4.update(Buffer.from(v)).toString("base64"); } map.signature = rc4Hash(method, uri, map, snonce); map._nonce = nonce; map.ssecurity = ssecurity; return map; } function decodeMIoT(ssecurity, nonce, data, gzip) { const key = Buffer.from(signNonce(ssecurity, nonce), "base64"); const rc4 = new RC4(key); rc4.update(Buffer.alloc(1024)); let decrypted = rc4.update(Buffer.from(data, "base64")); let error = void 0; if (gzip) { try { decrypted = pako.ungzip(decrypted, { to: "string" }); } catch (err) { error = err; } } const res = jsonDecode(decrypted.toString()); if (!res) { console.error("\u274C decodeMIoT failed", error); } return Promise.resolve(res); } export { decodeBase64, decodeMIoT, decodeQuery, encodeBase64, encodeMIoT, encodeQuery, parseAuthPass };