/** * @name 九号出行 签到 * @description 自动签到领N币 · Token 抓取 * @version 1.0.0 * @author 凉心 * @build 2026-06-18 18:27:25 */ !function(){"use strict";const e=(()=>{const e=e=>e in globalThis;switch(!0){case e("$task"):return"Quantumult X";case e("$loon"):return"Loon";case e("$rocket"):return"Shadowrocket";case e("Egern"):return"Egern";case Boolean(globalThis.$environment?.["surge-version"]):return"Surge";case Boolean(globalThis.$environment?.["stash-version"]):return"Stash";case e("Cloudflare"):return"Worker";case Boolean(globalThis.process?.versions?.node):return"Node.js";default:return}})();class t{static#e=new Map([]);static#t=[];static#a=new Map([]);static clear=()=>{};static count=(e="default")=>{switch(t.#e.has(e)){case!0:t.#e.set(e,t.#e.get(e)+1);break;case!1:t.#e.set(e,0)}t.log(`${e}: ${t.#e.get(e)}`)};static countReset=(e="default")=>{switch(t.#e.has(e)){case!0:t.#e.set(e,0),t.log(`${e}: ${t.#e.get(e)}`);break;case!1:t.warn(`Counter "${e}" doesn’t exist`)}};static debug=(...e)=>{t.#s<4||(e=e.map(e=>`🅱️ ${e}`),t.log(...e))};static error(...a){if(!(t.#s<1)){switch(e){case"Surge":case"Loon":case"Stash":case"Egern":case"Shadowrocket":case"Quantumult X":default:a=a.map(e=>`❌ ${e}`);break;case"Worker":case"Node.js":a=a.map(e=>`❌ ${e?.stack??e}`)}t.log(...a)}}static exception=(...e)=>t.error(...e);static group=e=>t.#t.unshift(e);static groupEnd=()=>t.#t.shift();static info(...e){t.#s<3||(e=e.map(e=>`ℹ️ ${e}`),t.log(...e))}static#s=3;static get logLevel(){switch(t.#s){case 0:return"OFF";case 1:return"ERROR";case 2:return"WARN";case 3:default:return"INFO";case 4:return"DEBUG";case 5:return"ALL"}}static set logLevel(e){switch(typeof e){case"string":e=e.toLowerCase();break;case"number":break;default:e="warn"}switch(e){case 0:case"off":t.#s=0;break;case 1:case"error":t.#s=1;break;case 2:case"warn":case"warning":default:t.#s=2;break;case 3:case"info":t.#s=3;break;case 4:case"debug":t.#s=4;break;case 5:case"all":t.#s=5}}static log=(...e)=>{0!==t.#s&&(e=e.flatMap(e=>{switch(typeof e){case"object":return[JSON.stringify(e)];case"bigint":case"number":case"boolean":return[e.toString()];case"string":return e.split(/\r?\n/u);default:return[e]}}),t.#t.forEach(t=>{(e=e.map(e=>` ${e}`)).unshift(`▼ ${t}:`)}),e=["",...e],console.log(e.join("\n")))};static time=(e="default")=>t.#a.set(e,Date.now());static timeEnd=(e="default")=>t.#a.delete(e);static timeLog=(e="default")=>{const a=t.#a.get(e);a?t.log(`${e}: ${Date.now()-a}ms`):t.warn(`Timer "${e}" doesn’t exist`)};static warn(...e){t.#s<2||(e=e.map(e=>`⚠️ ${e}`),t.log(...e))}}class a{static escape(e){const t={"&":"&","<":"<",">":">",'"':""","'":"'"};return e.replace(/[&<>"']/g,e=>t[e])}static get(e={},t="",s=void 0){Array.isArray(t)||(t=a.toPath(t));const o=t.reduce((e,t)=>Object(e)[t],e);return void 0===o?s:o}static merge(e,...t){if(null==e)return e;for(const s of t)if(null!=s)for(const t of Object.keys(s)){const o=s[t],r=e[t];switch(!0){case a.#o(o)&&a.#o(r):e[t]=a.merge(r,o);break;case o instanceof Map&&r instanceof Map:if(o.size>0)for(const[e,t]of o)r.set(e,t);break;case o instanceof Set&&r instanceof Set:if(o.size>0)for(const e of o)r.add(e);break;case Array.isArray(o)&&0===o.length&&void 0!==r:case o instanceof Map&&0===o.size&&void 0!==r:case o instanceof Set&&0===o.size&&void 0!==r:break;case void 0!==o:e[t]=o}}return e}static#o(e){if(null===e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}static omit(e={},t=[]){return Array.isArray(t)||(t=[t.toString()]),t.forEach(t=>a.unset(e,t)),e}static pick(e={},t=[]){Array.isArray(t)||(t=[t.toString()]);const a=Object.entries(e).filter(([e,a])=>t.includes(e));return Object.fromEntries(a)}static set(e,t,s){return Array.isArray(t)||(t=a.toPath(t)),t.slice(0,-1).reduce((e,a,s)=>Object(e[a])===e[a]?e[a]:e[a]=/^\d+$/.test(t[s+1])?[]:{},e)[t[t.length-1]]=s,e}static toPath(e){return e.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean)}static unescape(e){const t={"&":"&","<":"<",">":">",""":'"',"'":"'"};return e.replace(/&|<|>|"|'/g,e=>t[e])}static unset(e={},t=""){Array.isArray(t)||(t=a.toPath(t));return t.reduce((e,a,s)=>s===t.length-1?(delete e[a],!0):Object(e)[a],e)}}class s{static parse(e){let t={};switch(typeof e){case"string":{const o=e.replace(/^\?/,"");if(!o)break;const r=Object.fromEntries(o.split("&").filter(Boolean).map(e=>{const[t="",a=""]=e.split("=",2);return[s.#r(t).replace(/\[([^\[\]]+)\]/g,".$1"),s.#r(a).replace(/\"/g,"")]}));Object.keys(r).forEach(e=>a.set(t,e,r[e]));break}case"object":switch(e){case null:break;default:{const s={};Object.keys(e).forEach(t=>a.set(s,t,e[t])),t=s;break}}break;case"undefined":t={}}return t}static stringify(e={}){if(!e||"object"!=typeof e)return"";const t=[];return Object.keys(e).forEach(a=>s.#c(e,a,t)),0===t.length?"":t.map(([e,t])=>`${s.#i(s.#n(e))}=${s.#i(t)}`).join("&")}static#c(e,t,o){const r=a.get(e,t);void 0!==r&&(null!==r?Array.isArray(r)?r.forEach((a,r)=>{void 0!==a&&s.#c(e,`${t}[${r}]`,o)}):s.#o(r)?Object.keys(r).forEach(a=>s.#c(e,`${t}.${a}`,o)):o.push([t,String(r)]):o.push([t,""]))}static#n(e){const[t,...s]=a.toPath(e);return s.reduce((e,t)=>/^\d+$/.test(t)?`${e}[${t}]`:`${e}.${t}`,t)}static#o(e){if(null===e||"object"!=typeof e||Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}static#i(e){return encodeURIComponent(e)}static#r(e){return decodeURIComponent(e.replace(/\+/g," "))}}t.debug("☑️ $argument"),globalThis.$argument=s.parse(globalThis.$argument),globalThis.$argument.LogLevel&&(t.logLevel=globalThis.$argument.LogLevel),t.debug("✅ $argument",`$argument: ${JSON.stringify(globalThis.$argument)}`);const o={100:"Continue",101:"Switching Protocols",102:"Processing",103:"Early Hints",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",208:"Already Reported",226:"IM Used",300:"Multiple Choices",301:"Moved Permanently",302:"Found",304:"Not Modified",307:"Temporary Redirect",308:"Permanent Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Content Too Large",414:"URI Too Long",415:"Unsupported Media Type",416:"Range Not Satisfiable",417:"Expectation Failed",418:"I'm a teapot",421:"Misdirected Request",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",425:"Too Early",426:"Upgrade Required",428:"Precondition Required",429:"Too Many Requests",431:"Request Header Fields Too Large",451:"Unavailable For Legal Reasons",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",508:"Loop Detected",510:"Not Extended",511:"Network Authentication Required"};function r(s={}){switch(e){case"Surge":s.policy&&a.set(s,"headers.X-Surge-Policy",s.policy),t.log("🚩 执行结束!",`🕛 ${(new Date).getTime()/1e3-$script.startTime} 秒`),$done(s);break;case"Loon":s.policy&&(s.node=s.policy),t.log("🚩 执行结束!",`🕛 ${(new Date-$script.startTime)/1e3} 秒`),$done(s);break;case"Stash":s.policy&&a.set(s,"headers.X-Stash-Selected-Proxy",encodeURI(s.policy)),t.log("🚩 执行结束!",`🕛 ${(new Date-$script.startTime)/1e3} 秒`),$done(s);break;case"Egern":case"Shadowrocket":t.log("🚩 执行结束!"),$done(s);break;case"Quantumult X":switch(s.policy&&a.set(s,"opts.policy",s.policy),typeof(s=a.pick(s,["status","url","headers","body","bodyBytes"])).status){case"number":s.status=`HTTP/1.1 ${s.status} ${o[s.status]}`;break;case"string":case"undefined":break;default:throw new TypeError(`${Function.name}: 参数类型错误, status 必须为数字或字符串`)}s.body instanceof ArrayBuffer?(s.bodyBytes=s.body,s.body=void 0):ArrayBuffer.isView(s.body)?(s.bodyBytes=s.body.buffer.slice(s.body.byteOffset,s.body.byteLength+s.body.byteOffset),s.body=void 0):s.body&&(s.bodyBytes=void 0),t.log("🚩 执行结束!"),$done(s);break;case"Worker":default:t.log("🚩 执行结束!");break;case"Node.js":t.log("🚩 执行结束!"),process.exit(1)}}function c(a=`ℹ️ ${e} 通知`,s="",o="",r={}){const c=i(r);switch(e){case"Surge":case"Loon":case"Stash":case"Egern":case"Shadowrocket":default:$notification.post(a,s,o,c);break;case"Quantumult X":$notify(a,s,o,c);case"Worker":case"Node.js":}t.group("📣 系统通知"),t.log(a,s,o,JSON.stringify(c,null,2)),t.groupEnd()}const i=a=>{const s={};switch(typeof a){case void 0:break;case"string":case"number":case"boolean":switch(e){case"Surge":case"Stash":case"Egern":default:s.url=a;break;case"Loon":case"Shadowrocket":s.openUrl=a;break;case"Quantumult X":s["open-url"]=a;case"Worker":case"Node.js":}break;case"object":{const t=a.open||a["open-url"]||a.url||a.openUrl,o=a.copy||a["update-pasteboard"]||a.updatePasteboard,r=a.media||a["media-url"]||a.mediaUrl;switch(e){case"Surge":case"Stash":case"Egern":case"Shadowrocket":default:if(t&&(s.action="open-url",s.url=t),o&&(s.action="clipboard",s.text=o),r)switch(!0){case r.startsWith("http"):s["media-url"]=r;break;case r.startsWith("data:"):{const e=/^data:(?\w+\/\w+);base64,(?.+)/,{MIME:t,Base64:o}=r.match(e).groups;s["media-base64"]=o,s["media-base64-mime"]=a.mime||t;break}default:switch(s["media-base64"]=r,!0){case r.startsWith("CiVQREYt"):case r.startsWith("JVBERi0"):s["media-base64-mime"]="application/pdf";break;case r.startsWith("R0lGODdh"):case r.startsWith("R0lGODlh"):s["media-base64-mime"]="image/gif";break;case r.startsWith("iVBORw0KGgo"):s["media-base64-mime"]="image/png";break;case r.startsWith("/9j/"):s["media-base64-mime"]="image/jpg";break;case r.startsWith("Qk02U"):s["media-base64-mime"]="image/bmp"}}a["auto-dismiss"]&&(s["auto-dismiss"]=a["auto-dismiss"]),a.sound&&(s.sound=a.sound);break;case"Loon":t&&(s.openUrl=t),r?.startsWith("http")&&(s.mediaUrl=r);break;case"Quantumult X":t&&(s["open-url"]=t),r?.startsWith("http")&&(s["media-url"]=r),o&&(s["update-pasteboard"]=o);case"Worker":case"Node.js":}break}default:t.error("不支持的通知参数类型: "+typeof a,"")}return s};class n{static data=null;static dataFile="box.dat";static#l=/^@(?[^.]+)(?:\.(?.*))?$/;static getItem(t,s=null){let o=s;switch(t.startsWith("@")){case!0:{const{key:e,path:s}=t.match(n.#l)?.groups;t=e;let r=n.getItem(t,{});"object"!=typeof r&&(r={}),o=a.get(r,s);try{o=JSON.parse(o)}catch{}break}default:switch(e){case"Surge":case"Loon":case"Stash":case"Egern":case"Shadowrocket":o=$persistentStore.read(t);break;case"Quantumult X":o=$prefs.valueForKey(t);break;case"Worker":n.data=n.data??{},o=n.data[t];break;case"Node.js":n.data=n.#d(n.dataFile),o=n.data?.[t];break;default:o=n.data?.[t]||null}try{o=JSON.parse(o)}catch{}}return o??s}static setItem(t=new String,s=new String){let o=!1;if("object"==typeof s)s=JSON.stringify(s);else s=String(s);switch(t.startsWith("@")){case!0:{const{key:e,path:r}=t.match(n.#l)?.groups;t=e;let c=n.getItem(t,{});"object"!=typeof c&&(c={}),a.set(c,r,s),o=n.setItem(t,c);break}default:switch(e){case"Surge":case"Loon":case"Stash":case"Egern":case"Shadowrocket":o=$persistentStore.write(s,t);break;case"Quantumult X":o=$prefs.setValueForKey(s,t);break;case"Worker":n.data=n.data??{},n.data[t]=s,o=!0;break;case"Node.js":n.data=n.#d(n.dataFile),n.data[t]=s,n.#u(n.dataFile),o=!0;break;default:o=n.data?.[t]||null}}return o}static removeItem(t){let s=!1;switch(t.startsWith("@")){case!0:{const{key:e,path:o}=t.match(n.#l)?.groups;t=e;let r=n.getItem(t);"object"!=typeof r&&(r={}),a.unset(r,o),s=n.setItem(t,r);break}default:switch(e){case"Surge":s=$persistentStore.write(null,t);break;case"Loon":case"Stash":case"Egern":case"Shadowrocket":default:s=!1;break;case"Quantumult X":s=$prefs.removeValueForKey(t);break;case"Worker":n.data=n.data??{},delete n.data[t],s=!0;break;case"Node.js":n.data=n.#d(n.dataFile),delete n.data[t],n.#u(n.dataFile),s=!0}}return s}static clear(){let t=!1;switch(e){case"Surge":case"Loon":case"Stash":case"Egern":case"Shadowrocket":default:t=!1;break;case"Quantumult X":t=$prefs.removeAllValues();break;case"Worker":n.data={},t=!0;break;case"Node.js":n.data=n.#d(n.dataFile),n.data={},n.#u(n.dataFile),t=!0}return t}static#d=t=>{if("Node.js"!==e)return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const e=this.path.resolve(t),a=this.path.resolve(process.cwd(),t),s=this.fs.existsSync(e),o=!s&&this.fs.existsSync(a);if(!s&&!o)return{};{const t=s?e:a;try{return JSON.parse(this.fs.readFileSync(t))}catch(e){return{}}}}};static#u=(t=this.dataFile)=>{if("Node.js"===e){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const e=this.path.resolve(t),a=this.path.resolve(process.cwd(),t),s=this.fs.existsSync(e),o=!s&&this.fs.existsSync(a),r=JSON.stringify(this.data);s?this.fs.writeFileSync(e,r):o?this.fs.writeFileSync(a,r):this.fs.writeFileSync(e,r)}}}const l="九号出行 签到",d="Ninebot.Accounts",u="https://cn-cbu-gateway.ninebot.com";function p(e){return e.split(";").map(e=>e.trim()).filter(Boolean).map(e=>{const t=e.indexOf(":");return t<0?null:{deviceId:e.slice(0,t),token:e.slice(t+1)}}).filter(Boolean)}function h(e){return{Accept:"application/json, text/plain, */*",Authorization:e.token,"Content-Type":"application/json",device_id:e.deviceId,language:"zh",from_platform_1:"1",Origin:"https://h5-bj.ninebot.com",Referer:"https://h5-bj.ninebot.com/","User-Agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Segway v6"}}if("undefined"!=typeof $request){const e=$request.url||"";if(/user-sign/i.test(e)){const e=$request.headers||{},a=e.Authorization||e.authorization||"",s=e.device_id||e["device-id"]||e.Device_Id||"";if(a&&s){const e=function(e){const t=p(n.getItem(d)||"").find(t=>t.deviceId===e);return t?.token||""}(s);e!==a&&(!function(e,t){const a=(n.getItem(d)||"").split(";").map(e=>e.trim()).filter(Boolean),s=`${e}:${t}`,o=a.findIndex(t=>t.startsWith(e+":"));o>=0?a[o]=s:a.push(s),n.setItem(d,a.join(";"))}(s,a),t.log("[Ninebot] token saved for",s),c(l,"获取成功",e?"Token 已更新":"Token 已持久化保存"))}else t.log("[Ninebot] missing Authorization or device_id");r({})}else r({})}else(async()=>{const e=p(n.getItem(d)||"");if(!e.length)return c(l,"","未配置账号,请打开 App 签到页抓取 Token"),void r({});const a=[];for(const s of e)try{a.push(await f(s))}catch(e){t.error(s.deviceId,e),a.push("失败")}c(l,"",a.join("\n")),r({})})();async function b(t,s,r={}){const c=await async function(t,s={}){switch(typeof t){case"object":t={...s,...t};break;case"string":t={...s,url:t};break;default:throw new TypeError(`${Function.name}: 参数类型错误, resource 必须为对象或字符串`)}t.method||(t.method="GET",(t.body??t.bodyBytes)&&(t.method="POST")),delete t.headers?.Host,delete t.headers?.[":authority"],delete t.headers?.["Content-Length"],delete t.headers?.["content-length"];const r=t.method.toLocaleLowerCase();if(t.timeout||(t.timeout=5),t.timeout&&(t.timeout=Number.parseInt(t.timeout,10),t.timeout>500&&(t.timeout=Math.round(t.timeout/1e3))),t.timeout)switch(e){case"Loon":case"Quantumult X":case"Worker":case"Node.js":t.timeout=1e3*t.timeout}switch(e){case"Loon":case"Surge":case"Stash":case"Egern":case"Shadowrocket":if(t.policy)switch(e){case"Loon":t.node=t.policy;break;case"Stash":a.set(t,"headers.X-Stash-Selected-Proxy",encodeURI(t.policy));break;case"Shadowrocket":a.set(t,"headers.X-Surge-Proxy",t.policy)}switch("boolean"==typeof t.redirection&&(t["auto-redirect"]=t.redirection),t.bodyBytes&&!t.body&&(t.body=t.bodyBytes,t.bodyBytes=void 0),(t.headers?.Accept||t.headers?.accept)?.split(";")?.[0]){case"application/protobuf":case"application/x-protobuf":case"application/vnd.google.protobuf":case"application/vnd.apple.flatbuffer":case"application/grpc":case"application/grpc-web":case"application/grpc+proto":case"application/octet-stream":t["binary-mode"]=!0}return new Promise((e,a)=>{globalThis.$httpClient[r](t,(s,r,c)=>{s?a(s):(r.ok=/^2\d\d$/.test(r.status),r.statusCode=r.status,r.statusText=o[r.status],c&&(r.body=c,1==t["binary-mode"]&&(r.bodyBytes=c)),e(r))})});case"Quantumult X":return t.policy&&a.set(t,"opts.policy",t.policy),"boolean"==typeof t["auto-redirect"]&&a.set(t,"opts.redirection",t["auto-redirect"]),t.body instanceof ArrayBuffer?(t.bodyBytes=t.body,t.body=void 0):ArrayBuffer.isView(t.body)?(t.bodyBytes=t.body.buffer.slice(t.body.byteOffset,t.body.byteLength+t.body.byteOffset),t.body=void 0):t.body&&(t.bodyBytes=void 0),Promise.race([globalThis.$task.fetch(t).then(e=>{switch(e.ok=/^2\d\d$/.test(e.statusCode),e.status=e.statusCode,e.statusText=o[e.status],(e.headers?.["Content-Type"]??e.headers?.["content-type"])?.split(";")?.[0]){case"application/protobuf":case"application/x-protobuf":case"application/vnd.google.protobuf":case"application/vnd.apple.flatbuffer":case"application/grpc":case"application/grpc-web":case"application/grpc+proto":case"application/octet-stream":e.body=e.bodyBytes}return e.bodyBytes=void 0,e},e=>Promise.reject(e.error)),new Promise((e,a)=>{setTimeout(()=>{a(new Error(`${Function.name}: 请求超时, 请检查网络后重试`))},t.timeout)})]);case"Worker":case"Node.js":{switch(globalThis.fetch||(globalThis.fetch=require("node-fetch")),t["auto-cookie"]){case void 0:case"true":case!0:case"1":case 1:default:globalThis.fetch?.cookieJar||(globalThis.fetch=require("fetch-cookie").default(globalThis.fetch));case"false":case!1:case"0":case 0:case"-1":case-1:}t.redirect=t.redirection?"follow":"manual";const{url:e,...a}=t;return Promise.race([globalThis.fetch(e,a).then(async e=>{const t=await e.arrayBuffer();let a;try{a=e.headers.raw()}catch{a=Array.from(e.headers.entries()).reduce((e,[t,a])=>(e[t]=e[t]?[...e[t],a]:[a],e),{})}return{ok:e.ok??/^2\d\d$/.test(e.status),status:e.status,statusCode:e.status,statusText:e.statusText,body:new TextDecoder("utf-8").decode(t),bodyBytes:t,headers:Object.fromEntries(Object.entries(a).map(([e,t])=>[e,"set-cookie"!==e.toLowerCase()?t.toString():t]))}}).catch(e=>Promise.reject(e.message)),new Promise((e,a)=>{setTimeout(()=>{a(new Error(`${Function.name}: 请求超时, 请检查网络后重试`))},t.timeout)})])}default:throw new Error(`${Function.name}: 当前平台不支持`)}}({url:t,headers:h(s),...r});if(!c.ok)throw new Error(`HTTP ${c.status} ${t}`);return JSON.parse(c.body)}async function f(e){const t=Date.now(),a=await b(`${u}/portal/api/user-sign/v2/status?t=${t}`,e);if(0!==a.code)return a.msg||"查询失败";const s=a.data||{},o=s.consecutiveDays??0;if(1===s.currentSignStatus)return`已签 | 连签 ${o}天`;const r=await b(`${u}/portal/api/user-sign/v2/sign`,e,{method:"POST",body:JSON.stringify({deviceId:e.deviceId})});if(0!==r.code)return r.msg||"签到失败";const c=(r.data?.rewardList||[]).map(e=>e.rewardValue?`+${e.rewardValue}N币`:"").filter(Boolean).join(" "),i=await b(`${u}/portal/api/user-sign/v2/status?t=${Date.now()}`,e);return`连签 ${i.data?.consecutiveDays??o+1}天${c?` | ${c}`:""} | 成功`}}();