// ProxyPin 脚本 —— 手机本机解密,只抓「完整 mysekai 包(isForceAllReloadOnlyMysekai=True)」, // base64 后 POST 到自建 receiver。等价于 iOS 的 upload.js:全程在手机上,不用 VPS mitmproxy / 8080。 // 【只抓 mysekai】故意不抓 suite —— suite 请求太频繁,抓它会拖住登录/切界面,把游戏搞崩。 // // 用法:ProxyPin → 脚本 → 新建 → 整段粘贴 → 保存并启用。 // 证书:用 ProxyPin 自带 CA(App 里生成/安装),游戏要认得必须【系统信任】(安卓需 root/Magisk)。 // 触发:从外面进一次烤森(=True 完整包)即自动上传。平时正常玩游戏不受影响。 // // 原理:response.rawBody 是原始响应字节(AES 密文);脚本把它 base64 再发出去, // receiver 侧 crypto.decode 会自动 base64 解码 + AES 解密入库。uid 由 receiver 从包体解析,这里不用管。 const RECV = "http://www.rintoolbox.cloud"; // receiver 按当前公开域名动态注入 const REGION = "jp"; // 仅标记,存储按 uid,不影响解码 const _B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; function toBase64(bytes) { const out = []; const n = bytes.length; for (let i = 0; i < n; i += 3) { const b0 = bytes[i] & 0xff; const has1 = i + 1 < n, has2 = i + 2 < n; const b1 = has1 ? (bytes[i + 1] & 0xff) : 0; const b2 = has2 ? (bytes[i + 2] & 0xff) : 0; out.push( _B64[b0 >> 2] + _B64[((b0 & 3) << 4) | (b1 >> 4)] + (has1 ? _B64[((b1 & 15) << 2) | (b2 >> 6)] : "=") + (has2 ? _B64[b2 & 63] : "=") ); } return out.join(""); } async function onRequest(context, request) { return request; } async function onResponse(context, request, response) { try { const path = request.path || ""; const q = request.queries || {}; let kind = null, uid = null, m; if ((m = path.match(/\/api\/user\/(\d+)\/mysekai$/)) && String(q.isForceAllReloadOnlyMysekai) === "True") { kind = "mysekai"; uid = m[1]; } // 只抓 mysekai(进烤森那一下才请求,不影响正常游戏)。 // 不抓 suite:它在登录/回主页/切界面时频繁被请求,base64 大包会拖住响应 -> 游戏"获取错误"/踢回主界面。 // suite 需要的话,单独用网页 /upload 手动传即可。 if (kind && response.rawBody && response.rawBody.length) { // 用 await 等上传【完整发完】再返回 —— 确保 mysekai 整包 POST 到 receiver。 // (不 await 的话:游戏掉线时 ProxyPin 会销毁脚本上下文,未发完的上传被掐断 -> 包发不全。) // 只匹配 mysekai(进烤森才触发),所以这个 await 只影响进烤森那一下,不碰登录/日常 UI。掉线可接受。 await fetch(RECV + "/api/" + REGION + "/user/" + uid + "/upload/" + kind, { method: "POST", headers: { "Content-Type": "text/plain" }, body: toBase64(response.rawBody) }); } } catch (e) { // 静默:抓包脚本出错不该影响游戏响应 } // 不碰 body!直接原样 return —— ProxyPin 默认就会把原始响应转发给游戏(模板即如此)。 // 千万别给 response.body 赋值:一赋值 ProxyPin 就当你改了响应去重序列化,反而把二进制弄坏 -> 游戏登不了。 return response; }