【让技术再次伟大-1】📮 iCloud 隐藏邮件(Hide My Email)全功能控制面板 · Console 一键脚本
iCloud隐藏邮件一键管理脚本分享,支持批量生成、限速探测及面板操作。
关键功能与工具特性
楼主 #1 分享了名为“iCloud 隐藏邮件(Hide My Email)全功能控制面板”的 Console 脚本,旨在解决官网手动管理繁琐的问题。核心优势包括: - 批量生成:支持设置数量、前缀、起始编号和间隔,自动跳过已存在标签,避免重复劳动 #1。 - 限速探测:内置冷却探测功能,自动检测苹果接口限速状态并估算解禁时间,解决“不知道要等多久”的痛点 #1。 - 批量管理:支持按关键词批量停用、复活或删除(删除需二次确认防误删),以及搜索和统计功能 #1。 - 数据安全:仅调用苹果官方接口操作用户自有账号数据,不连接第三方服务器,不读取密码或 Cookie #1。 - 导出备份:支持一键导出 CSV 或 JSON 格式清单,方便存档 #1。
使用指南与注意事项
- 操作步骤:需在已登录 iCloud.com 的电脑浏览器中按 F12 打开 Console,粘贴脚本后回车,右下角将弹出控制面板 #1。
- 风控警告:苹果对短时间大量生成有严格限速(错误码 -41015),建议开启“撞限速自动重试”或加大间隔,避免一次性刷几十个导致账号受限 #1。
- 环境限制:脚本仅在
www.icloud.com环境下运行有效,其他域名会报错 #2。
社区讨论与反馈
注册各种试用 / 羊毛站时,很多站会查邮箱信誉度,大致是 Gmail > iCloud > 自有域名邮箱 。 当你的域名邮箱不可用、或者已经被某个站关联 / 拉黑了, iCloud 隐藏邮箱可以当一个不错的备选 ——实测在部分站点上通过率比域名邮箱稳一些。 开胃菜系列 A ,后续会陆续分享 Temu、Amazon 等其他自动化脚本,感兴趣的关注一下 脚本太长超了论坛正文字数上限, 完整脚本放在下面 2 楼 ,复制 2 楼整段即可。 #p-8347234-h-1 这是个啥 一段直接粘进浏览器 Console 就能用的脚本,专门管你 iCloud+ 的隐藏邮件地址(Hide My Email) 。粘进去之后,网页右下角浮出一个控制面板, 生成 / 管理 / 导出全点按钮搞定 ,不用记命令。 它 只调用苹果自己的官方接口 操作你 自己账号 里的隐藏邮箱, 不连任何第三方服务器,不读你的密码和 Cookie 。 2 楼贴的是「压缩版」(去掉了空格 / 注释让它能塞进论坛),但 变量名 / 接口地址全保留 ,没做混淆,想逐行核对的可以照样读。 #p-8347234-h-2 优势:为啥比官网手点强 痛点(官网手点) 这个面板怎么解决 一个一个建,建几十个手都点麻 批量生成 :填数量 + 前缀,一次造一串(如 Test6 ~ Test20 ) 建快了被苹果限速,还不告诉你要等多久 冷却探测 :自动每隔几分钟试一次, 实测出还要等多久解禁 建多了出现重名、重复劳动 自动跳过同名 :已存在的标签自动略过,不白造 几十个别名管不过来、找不到 搜索 + 列表 + 统计 :关键词秒搜,一眼看哪些在用 / 停用 想批量停用 / 删除一批测试号,只能一个个删 批量停用 / 批量删除 (按关键词,删除强制二次确认,防误删) 想备份所有别名清单 ⭳ 一键导出 CSV / JSON ,存档随便用 安全设计 :删除操作不可逆,所以面板和接口 都强制二次确认 ;所有动作都记在浏览器本地历史里,可随时回查。 #p-8347234-h-4-3 使用方法(4 步) 登录官网 :用电脑浏览器打开并登录 https://www.icloud.com (要有 iCloud+ 订阅,隐藏邮件功能才可用)。 打开 Console :按 F12 (Mac 上 Cmd + Option + I ),切到 Console(控制台) 标签页。 粘贴回车 :把 2 楼脚本整段 粘进去,回车。右下角浮出面板即成功。 浏览器可能弹红字警告"别乱粘代码"—— 这是所有 Console 脚本都会触发的通用安全提醒 ,自己通读确认后再粘,别无脑复制任何来路不明的脚本。 点按钮用 :面板有三个标签页 标签页 能干啥 生成 填数量 / 前缀 / 起始编号 / 间隔 → 点「 开始生成」;「 冷却探测」测限速;「⧉ 复制成果」复制本批结果 管理 刷新列表、搜索、改名、停用 / 复活、删除、批量操作、改转发邮箱 工具 导出 CSV / JSON、查看本地历史、设置探测间隔 进阶 :面板加载后挂一个 window.HME ,喜欢命令行的可在 Console 敲 HME.menu() 看全部命令(如 HME.batch(5,"GPT",{start:19,autoRetry:true}) )。 #p-8347234-h-4 使用提醒(务必看) 别贪快 :苹果对短时间内大量生成有 限速风控 (撞了弹错误码 -41015 )。撞到就勾「撞限速自动重试」或加大间隔, 慢点造更稳 ,别一次几十上百地刷。 风险自负 :批量造本质是自动化薅 iCloud+,**号是你自己的,悠着点用。 认准官网 :只在 已登录的 www.icloud.com 用;脚本会自检,不在官网会直接报错不执行。
【2 楼 · 完整脚本】复制下面整段,粘进已登录的 www.icloud.com 的 Console 回车即可。用法看 1 楼。 !function(){"use strict";var HME=function(){var sleep=function(ms){return new Promise(function(r){setTimeout(r,ms)})},rand=function(a,b){return Math.floor(a+Math.random()*(b-a))},nowTs=function(){return Date.now()},fmtTime=function(ts){return ts?new Date(ts).toLocaleString():"-"},LSKEY="__hme_history__",state={base:null,dsid:null,build:"2618Build17",clientId:null,q:null,_stopProbe:!1,_stopBatch:!1,_lastList:null,_forward:[],_lastBatch:null,_lastBatchClosure:null,_lastCooldownMin:null};function ensureConfig(force){return async function(){if(state.base&&state.dsid&&!force)return state;var base,dsid,cid="undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID()||"cli-"+Math.random().toString(36).slice(2),rid="undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID()||"req",vq="clientBuildNumber="+state.build+"&clientMasteringNumber="+state.build+"&clientId="+cid+"&requestId="+rid;try{var vr=await fetch("https://setup.icloud.com/setup/ws/1/validate?"+vq,{method:"POST",credentials:"include",body:""}),vj=await vr.json(),ws=vj&&vj.webservices||{};base=(ws.premiummailsettings&&ws.premiummailsettings.url||ws.mailws&&ws.mailws.url||"").replace(/:443$/,""),dsid=vj&&vj.dsInfo&&vj.dsInfo.dsid}catch(e){throw new Error("validate 调用失败(确认在已登录的 www.icloud.com):"+e.message)}if(!base||!dsid)throw new Error("validate 没返回 base/dsid(可能未登录或不在 www.icloud.com)");return state.base=base,state.dsid=String(dsid),state.clientId=cid,state.q="clientBuildNumber="+state.build+"&clientMasteringNumber="+state.build+"&clientId="+state.clientId+"&dsid="+state.dsid,state}()}function call(method,path,bodyObj){return async function(){await ensureConfig();var opt={method:method,credentials:"include",headers:{"Content-Type":"text/plain",Accept:"*/*"}};"POST"===method&&(opt.body=bodyObj?JSON.stringify(bodyObj):"");var r=await fetch(state.base+path+"?"+state.q,opt),j={};try{j=await r.json()}catch(_){j={success:!1,error:{errorMessage:"non-json response"}}}return j._httpStatus=r.status,j}()}function histLoad(){try{return JSON.parse(localStorage.getItem(LSKEY)||"[]")}catch(_){return[]}}function histAdd(rec){try{var h=histLoad();h.push(Object.assign({},rec,{t:Date.now()})),localStorage.setItem(LSKEY,JSON.stringify(h))}catch(_){}}function fetchList(){return async function(){var j=await call("GET","/v2/hme/list");if(!j.success)throw new Error("list 失败:"+JSON.stringify(j.error||j));var arr=(j.result.hmeEmails||[]).slice().sort(function(a,b){return(a.createTimestamp||0)-(b.createTimestamp||0)});return state._lastList=arr,state._forward=j.result.forwardToEmails||[],arr}()}function search(keyword,opts){return opts=opts||{},async function(){var arr=state._lastList||await fetchList(),k=(keyword||"").toLowerCase(),hits=arr.filter(function(m){return(m.label||"").toLowerCase().indexOf(k)>=0||(m.hme||"").toLowerCase().indexOf(k)>=0});return opts.activeOnly&&(hits=hits.filter(function(m){return m.isActive})),"function"==typeof console.table&&console.table(hits.map(function(m){return{label:m.label,hme:m.hme,active:m.isActive}})),hits}()}function resolve(key){return async function(){if(!key)throw new Error("需要 anonymousId/邮箱/标签");var arr=state._lastList||await fetchList(),hit=arr.find(function(m){return m.anonymousId===key})||arr.find(function(m){return m.hme===key})||arr.find(function(m){return m.label===key});if(!hit)throw new Error("找不到匹配:"+key);return hit}()}function createOne(label,note,opts){return note=note||"",opts=opts||{},async function(){var genWait=null!=opts.genWait?opts.genWait:1500,g=await call("POST","/v1/hme/generate",{langCode:"en-us"});if(!g.success)return{ok:!1,stage:"generate",err:g.error||g,hme:"-",label:label};var c=g.result.hme;genWait>0&&await sleep(genWait);var r=await call("POST","/v1/hme/reserve",{hme:c,label:label,note:note});if(!r.success)return{ok:!1,stage:"reserve",err:r.error||r,hme:c,label:label};var out={ok:!0,hme:r.result.hme.hme,anonymousId:r.result.hme.anonymousId,label:label};return histAdd({action:"create",hme:out.hme,label:label}),out}()}function deactivate(key){return async function(){var t=await resolve(key),j=await call("POST","/v1/hme/deactivate",{anonymousId:t.anonymousId});if(!j.success)throw new Error("deactivate 失败:"+JSON.stringify(j.error||j));return console.log("😴 已停用 "+t.hme),histAdd({action:"deactivate",hme:t.hme,label:t.label}),await fetchList(),!0}()}function del(key,opts){return opts=opts||{},async function(){var t=await resolve(key);if(!opts.force)throw new Error("⚠️ 删除不可逆!确认删 "+t.hme+" 请加 {force:true}");var j=await call("POST","/v1/hme/delete",{anonymousId:t.anonymousId});if(!j.success)throw new Error("delete 失败:"+JSON.stringify(j.error||j));return console.log("🗑️ 已删除 "+t.hme),histAdd({action:"delete",hme:t.hme,label:t.label}),await fetchList(),!0}()}return{state:state,config:ensureConfig,call:call,list:function(){return async function(){var arr=await fetchList();return console.log("📊 共 "+arr.length+" 个,转发到",state._forward),"function"==typeof console.table&&console.table(arr.map(function(m,i){return{"#":i+1,label:m.label,hme:m.hme,active:m.isActive,origin:m.origin,created:fmtTime(m.createTimestamp)}})),console.log("📋 可复制清单:\n"+arr.map(function(m,i){return String(i+1).padStart(2)+". "+(m.label||"").padEnd(14)+" "+m.hme+(m.isActive?"":" (停用)")}).join("\n")),arr}()},fetchList:fetchList,quota:function(){return async function(){var j=await call("GET","/v2/domain/list");if(!j.success)throw new Error("domain/list 失败");var r=j.result,used=(state._lastList||await fetchList()).length;return"function"==typeof console.table&&console.table({"当前别名数":used,"maxEmailsPerUser_域名相关":r.maxEmailsPerUser,maxDomainsAllowed:r.maxDomainsAllowed,"iCloudPlus过期":r.iCloudPlusSubscriptionExpired}),console.log("ℹ️ maxEmailsPerUser 管的是“自定义域名邮箱”,不是隐藏邮件地址总数。"),r}()},get:function(id){return async function(){var j=await call("POST","/v2/hme/get",{anonymousId:id});if(!j.success)throw new Error("get 失败");return console.log("🔍",j.result.hme),j.result.hme}()},search:search,resolve:resolve,stats:function(){return async function(){var arr=state._lastList||await fetchList(),active=arr.filter(function(m){return m.isActive}).length,byOrigin={};arr.forEach(function(m){byOrigin[m.origin]=(byOrigin[m.origin]||0)+1});var out={total:arr.length,active:active,inactive:arr.length-active,byOrigin:byOrigin};return"function"==typeof console.table&&(console.table({"总数":out.total,"在用":out.active,"停用":out.inactive}),console.log("按来源:",byOrigin)),out}()},createOne:createOne,batch:function(count,prefix,opts){return prefix=prefix||"Mail",async function(){await ensureConfig();var o=Object.assign({start:1,note:"",minGap:4e3,maxGap:7e3,genWait:1500,autoRetry:!1,retryWaitMin:12e4,retryWaitMax:18e4,maxRetries:3,skipExisting:!0},opts||{}),labels=Array.isArray(o.labels)&&o.labels.length?o.labels.slice():Array.from({length:count},function(_,i){return prefix+(o.start+i)}),plannedCount=labels.length,skippedExisting=0;if(o.skipExisting){var existing=new Set((state._lastList||await fetchList()).map(function(m){return m.label}));(skippedExisting=labels.length-(labels=labels.filter(function(l){return!existing.has(l)})).length)>0&&console.warn("⏭️ 跳过 "+skippedExisting+" 个已存在的标签,剩 "+labels.length+" 个要造。")}state._stopBatch=!1;var results=[],stopReason=labels.length?"completed":skippedExisting?"all_skipped":"no_labels";console.log("🚀 批量生成 "+labels.length+" 个 | 间隔 "+o.minGap/1e3+"-"+o.maxGap/1e3+"s | autoRetry="+o.autoRetry),console.log(" 想中途停:HME.stop()");for(var i=0;i<labels.length;i++){if(state._stopBatch){stopReason="user_stop",console.warn("🛑 已停止批量。");break}for(var label=labels[i],res=await createOne(label,o.note,{genWait:o.genWait}),retries=0;!res.ok&&o.autoRetry&&"-41015"===String(res.err&&res.err.errorCode)&&retries<o.maxRetries&&!state._stopBatch;){var wait=rand(o.retryWaitMin,o.retryWaitMax);retries++,console.warn(" ["+(i+1)+"/"+labels.length+"] 🚫 限速,第 "+retries+" 次退避 "+(wait/1e3).toFixed(0)+"s 后重试…"),await sleep(wait),res=await createOne(label,o.note,{genWait:o.genWait})}if(res.ok)console.log(" ["+(i+1)+"/"+labels.length+"] ✅ "+res.hme+" → "+label),results.push({label:label,hme:res.hme,ok:!0});else{var code=res.err&&res.err.errorCode,msg=res.err&&res.err.errorMessage||JSON.stringify(res.err);if(console.error(" ["+(i+1)+"/"+labels.length+"] ❌ "+res.stage+" ("+code+"): "+msg),results.push({label:label,hme:res.hme||"-",ok:!1,code:code,err:msg}),"-41015"===String(code)&&!o.autoRetry){stopReason="rate_limit",console.warn(" ⛔ 撞限速且未开 autoRetry,停止。稍后重跑或用 {autoRetry:true}。");break}if("-41015"!==String(code)){stopReason="error",console.warn(" ⛔ 非限速错误,停止。");break}}if(i<labels.length-1&&!state._stopBatch){var gap=rand(o.minGap,o.maxGap);console.log(" ⏳ 等待 "+(gap/1e3).toFixed(1)+"s …"),await sleep(gap)}}var ok=results.filter(function(x){return x.ok}).length,failed=results.filter(function(x){return!x.ok}).length;state._stopBatch&&"completed"===stopReason&&(stopReason="user_stop");var possiblyIncomplete=ok+skippedExisting<plannedCount;possiblyIncomplete&&"completed"===stopReason&&(stopReason=failed?"completed_with_failures":"not_all_attempted");var closure={schema:"icloud-hme.batch.closure.v1",status:0===ok?"empty":possiblyIncomplete?"incomplete":"complete",captured_at:(new Date).toISOString(),planned_count:plannedCount,created_count:ok,skipped_existing:skippedExisting,failed_count:failed,stop_reason:stopReason,possibly_incomplete:possiblyIncomplete};return console.log("🏁 批量结束:成功 "+ok+" / "+results.length),console.log("🧾 对账:计划"+plannedCount+"/成功"+ok+"/跳过"+skippedExisting+"/失败"+failed),possiblyIncomplete&&console.warn("⚠️ 漏造校验:计划"+plannedCount+" 实际成功"+ok+" 可能没造全(停止原因:"+stopReason+")"),"function"==typeof console.table&&console.table(results),state._lastBatch=results,state._lastBatchClosure=closure,results}()},rename:function(key,label,note){return async function(){var t=await resolve(key),j=await call("POST","/v1/hme/updateMetaData",{anonymousId:t.anonymousId,label:label,note:null!=note?note:t.note||""});if(!j.success)throw new Error("rename 失败:"+JSON.stringify(j.error||j));return console.log("✏️ "+t.hme+' → 标签 "'+label+'"'),histAdd({action:"rename",hme:t.hme,label:label}),await fetchList(),!0}()},deactivate:deactivate,reactivate:function(key){return async function(){var t=await resolve(key),j=await call("POST","/v1/hme/reactivate",{anonymousId:t.anonymousId});if(!j.success)throw new Error("reactivate 失败:"+JSON.stringify(j.error||j));return console.log("♻️ 已复活 "+t.hme),histAdd({action:"reactivate",hme:t.hme,label:t.label}),await fetchList(),!0}()},delete:del,setForward:function(email){return async function(){var j=await call("POST","/v1/hme/updateForwardTo",{forwardToEmail:email});if(!j.success)throw new Error("updateForwardTo 失败:"+JSON.stringify(j.error||j));return console.log("📮 转发地址已改为 "+email),histAdd({action:"setForward",hme:email,label:"-"}),!0}()},bulkDeactivate:function(keyword,opts){return opts=opts||{},async function(){var hits=await search(keyword,{activeOnly:!0});if(!opts.force)throw console.warn("将停用 "+hits.length+' 个(匹配"'+keyword+'")。确认请加 {force:true}'),new Error("需要 {force:true}");for(var n=0,i=0;i<hits.length&&!state._stopBatch;i++)await deactivate(hits[i].anonymousId),n++,await sleep(rand(Math.round(.7*(opts.gap||1500)),Math.round(1.3*(opts.gap||1500))));return console.log("✅ 批量停用 "+n+" 个"),n}()},bulkDelete:function(keyword,opts){return opts=opts||{},async function(){var hits=await search(keyword);if(!opts.force)throw console.warn("将删除 "+hits.length+' 个(匹配"'+keyword+'")。⚠️删除不可逆!确认请加 {force:true}'),new Error("需要 {force:true}");for(var n=0,i=0;i<hits.length&&!state._stopBatch;i++)await del(hits[i].anonymousId,{force:!0}),n++,await sleep(rand(Math.round(.7*(opts.gap||1500)),Math.round(1.3*(opts.gap||1500))));return console.log("✅ 批量删除 "+n+" 个"),n}()},probe:function(opts){return async function(){await ensureConfig();var o=Object.assign({intervalMin:2,maxTries:90,label:"Cooldown"},opts||{}),interval=6e4*o.intervalMin,t0=nowTs(),mins=function(){return((nowTs()-t0)/6e4).toFixed(1)};state._stopProbe=!1,console.log("🔭 冷却探测:每 "+o.intervalMin+" 分钟一次,最多 "+o.maxTries+" 次(≈"+(o.maxTries*o.intervalMin/60).toFixed(1)+' 小时)。解禁后保存为 "'+o.label+'"。想停:HME.stop()');for(var i=1;i<=o.maxTries;i++){if(state._stopProbe)return console.warn("🛑 已停止探测。"),null;try{var res=await createOne(o.label);if(res.ok)return console.log("✅ "+mins()+"分 第"+i+"次:解禁了!已保存 "+res.hme+" → "+o.label),console.log("🎯 实测冷却时长 ≈ "+mins()+" 分钟"),state._lastCooldownMin=Number(mins()),{cooldownMin:Number(mins()),hme:res.hme};var code=res.err&&res.err.errorCode,retry=res.err&&res.err.retryAfter;console.log("🚫 "+mins()+"分 第"+i+"次:仍限速 ("+code+(null!=retry?", retryAfter:"+retry:"")+")")}catch(e){console.warn("⚠️ "+mins()+"分 第"+i+"次:网络异常,跳过:",e.message)}i<o.maxTries&&!state._stopProbe&&await sleep(interval)}return console.warn("⌛ 探了 "+o.maxTries+" 次仍没解禁。可重跑接力。"),null}()},exportCSV:function(){return async function(){var arr=state._lastList||await fetchList(),csv=["index,label,hme,active,origin,createdMs,createdLocal"].concat(arr.map(function(m,i){return[i+1,JSON.stringify(m.label||""),m.hme,m.isActive,m.origin,m.createTimestamp||"",JSON.stringify(fmtTime(m.createTimestamp))].join(",")})).join("\n");console.log("📄 CSV:\n"+csv);try{var a=document.createElement("a");a.href=URL.createObjectURL(new Blob([csv],{type:"text/csv"})),a.download="icloud_hme_"+arr.length+".csv",a.click(),console.log("⬇️ 已尝试触发下载。")}catch(_){}return csv}()},exportJSON:function(){return async function(){var arr=state._lastList||await fetchList(),json=JSON.stringify(arr,null,2);console.log("📦 JSON 已生成("+arr.length+" 条)");try{var a=document.createElement("a");a.href=URL.createObjectURL(new Blob([json],{type:"application/json"})),a.download="icloud_hme_"+arr.length+".json",a.click()}catch(_){}return json}()},history:function(){var h=histLoad();return"function"==typeof console.table&&console.table(h.map(function(x){return{action:x.action,label:x.label,hme:x.hme,time:fmtTime(x.t)}})),h},historyClear:function(){try{localStorage.removeItem(LSKEY)}catch(_){}return console.log("🧹 已清空本地历史"),!0},stop:function(){state._stopProbe=!0,state._stopBatch=!0,console.warn("🛑 已请求停止 probe/batch。")},menu:function(){console.log(["════════ iCloud HME Toolkit v5.0 速查 ════════",' 只读 : HME.list() · quota() · get(id) · search("关键词") · stats()',' 造 : HME.createOne("标签") · batch(5,"GPT",{start:19,autoRetry:true})'," (batch 默认 skipExisting:true 自动跳过同名标签)",' 管理 : HME.rename("Test1","新名") · deactivate("Test1") · reactivate("Test1")',' HME.delete("Test1",{force:true}) ⚠️不可逆 · setForward("[email protected]")',' 批量 : HME.bulkDeactivate("Test",{force:true}) · bulkDelete("Test",{force:true})'," 限速 : HME.probe() · probe({intervalMin:5})"," 导出 : HME.exportCSV() · exportJSON()"," 历史 : HME.history() · historyClear() 控制: HME.stop() · config(true) · menu()"," (管理/批量首参传 anonymousId / 邮箱 / 标签 均可;面板右下角也有按钮)","══════════════════════════════════════════════"].join("\n"))},version:"5.0"}}();if("undefined"!=typeof window&&(window.HME=HME),"undefined"!=typeof module&&module.exports&&(module.exports=HME),"undefined"!=typeof document&&"undefined"!=typeof window&&window.document){if(window.__HME_PANEL__)return window.__HME_PANEL__.show(),void console.log("面板已存在,已重新显示。");var sleep=function(ms){return new Promise(function(r){setTimeout(r,ms)})},rand=function(a,b){return Math.floor(a+Math.random()*(b-a))},esc=function(s){return String(null==s?"":s).replace(/[&<>"']/g,function(c){return{"&":"&","<":"<",">":">",'"':""","'":"'"}[c]})},pstate={running:!1,created:[],lastList:[],view:"gen"},style=document.createElement("style");style.textContent=["#hmePanel{position:fixed;right:20px;bottom:20px;width:420px;z-index:2147483647;",'font-family:-apple-system,BlinkMacSystemFont,"SF Pro Text","Segoe UI",sans-serif;',"background:rgba(255,255,255,.86);backdrop-filter:saturate(180%) blur(20px);","-webkit-backdrop-filter:saturate(180%) blur(20px);border:1px solid rgba(0,0,0,.08);","border-radius:16px;box-shadow:0 12px 40px rgba(0,0,0,.18);color:#1d1d1f;overflow:hidden;}","#hmePanel.hme-min{width:230px;}","#hmePanel.hme-min .hme-body{display:none;}","#hmePanel *{box-sizing:border-box;}",".hme-head{display:flex;align-items:center;gap:8px;padding:12px 14px;cursor:move;","background:linear-gradient(135deg,#0a84ff,#0066cc);color:#fff;user-select:none;}",".hme-head .dot{width:9px;height:9px;border-radius:50%;background:#34c759;flex-shrink:0;}",".hme-head .dot.busy{background:#ffd60a;animation:hmePulse 1s infinite;}",".hme-head .dot.err{background:#ff453a;}","@keyframes hmePulse{0%{box-shadow:0 0 0 0 rgba(255,214,10,.7)}70%{box-shadow:0 0 0 7px rgba(255,214,10,0)}100%{box-shadow:0 0 0 0 rgba(255,214,10,0)}}",".hme-title{font-weight:600;font-size:14px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}",".hme-icon-btn{background:rgba(255,255,255,.18);border:none;color:#fff;width:24px;height:24px;","border-radius:7px;cursor:pointer;font-size:13px;line-height:1;display:flex;align-items:center;justify-content:center;transition:background .15s;flex-shrink:0;}",".hme-icon-btn:hover{background:rgba(255,255,255,.35);}",".hme-body{padding:14px;display:flex;flex-direction:column;gap:12px;max-height:78vh;overflow-y:auto;}",".hme-tabs{display:flex;gap:6px;}",".hme-tab{flex:1;border:none;border-radius:9px;padding:8px 4px;font-size:12px;font-weight:600;cursor:pointer;background:rgba(0,0,0,.05);color:#1d1d1f;transition:background .15s;}",".hme-tab.active{background:#0a84ff;color:#fff;}",".hme-pane{display:none;flex-direction:column;gap:12px;}",".hme-pane.active{display:flex;}",".hme-stat{display:flex;gap:8px;}",".hme-stat .card{flex:1;background:rgba(0,0,0,.04);border-radius:10px;padding:8px 6px;text-align:center;}",".hme-stat .card b{display:block;font-size:20px;line-height:1.1;font-variant-numeric:tabular-nums;}",".hme-stat .card span{font-size:11px;color:#6e6e73;}",".hme-row{display:flex;gap:8px;align-items:center;}",".hme-row>label{font-size:12px;color:#6e6e73;width:64px;flex-shrink:0;}",".hme-row input,.hme-row select{flex:1;border:1px solid rgba(0,0,0,.12);border-radius:8px;padding:7px 9px;font-size:13px;background:#fff;color:#1d1d1f;min-width:0;}",".hme-row input:focus{outline:none;border-color:#0a84ff;box-shadow:0 0 0 3px rgba(10,132,255,.15);}",".hme-row .two{display:flex;gap:6px;flex:1;}",".hme-row .two input{width:50%;}",".hme-btns{display:flex;gap:8px;flex-wrap:wrap;}",".hme-btn{flex:1;border:none;border-radius:10px;padding:10px;font-size:13px;font-weight:600;cursor:pointer;transition:filter .15s,opacity .15s;min-width:90px;}",".hme-btn:disabled{opacity:.45;cursor:not-allowed;}",".hme-btn.primary{background:#0a84ff;color:#fff;}",".hme-btn.primary:hover:not(:disabled){filter:brightness(1.08);}",".hme-btn.danger{background:#ff453a;color:#fff;}",".hme-btn.warn{background:#ff9f0a;color:#fff;}",".hme-btn.ghost{background:rgba(0,0,0,.05);color:#1d1d1f;font-weight:500;font-size:12px;}",".hme-btn.ghost:hover:not(:disabled){background:rgba(0,0,0,.09);}",".hme-progress{height:6px;border-radius:3px;background:rgba(0,0,0,.08);overflow:hidden;}",".hme-progress>i{display:block;height:100%;width:0;background:linear-gradient(90deg,#0a84ff,#34c759);transition:width .3s ease;}",".hme-tablewrap{max-height:230px;overflow:auto;border:1px solid rgba(0,0,0,.08);border-radius:10px;}",".hme-table{width:100%;border-collapse:collapse;font-size:11.5px;}",".hme-table th,.hme-table td{padding:5px 7px;text-align:left;border-bottom:1px solid rgba(0,0,0,.06);white-space:nowrap;}",".hme-table th{position:sticky;top:0;background:rgba(245,245,247,.96);font-weight:600;z-index:1;}",".hme-table tr:hover td{background:rgba(10,132,255,.06);}",".hme-table .muted{opacity:.5;}",".hme-act{cursor:pointer;border:none;background:transparent;font-size:12.5px;padding:1px 3px;border-radius:5px;}",".hme-act:hover{background:rgba(0,0,0,.08);}",".hme-log{background:#1c1c1e;border-radius:10px;padding:8px 10px;font-size:11.5px;",'font-family:"SF Mono",ui-monospace,Menlo,monospace;color:#e5e5ea;height:150px;overflow-y:auto;line-height:1.5;}',".hme-log .ok{color:#30d158;}.hme-log .warn{color:#ffd60a;}",".hme-log .err{color:#ff453a;}.hme-log .dim{color:#8e8e93;}.hme-log .new{color:#64d2ff;}",".hme-foot{display:flex;justify-content:space-between;font-size:11px;color:#8e8e93;}",".hme-foot a{color:#0a84ff;cursor:pointer;text-decoration:none;}","@media (prefers-color-scheme: dark){","#hmePanel{background:rgba(40,40,42,.82);border-color:rgba(255,255,255,.1);color:#f5f5f7;}",".hme-stat .card{background:rgba(255,255,255,.07);}",".hme-stat .card span{color:#aeaeb2;}",".hme-tab{background:rgba(255,255,255,.1);color:#f5f5f7;}",".hme-row>label{color:#aeaeb2;}",".hme-row input,.hme-row select{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.14);color:#f5f5f7;}",".hme-btn.ghost{background:rgba(255,255,255,.1);color:#f5f5f7;}",".hme-btn.ghost:hover:not(:disabled){background:rgba(255,255,255,.16);}",".hme-progress{background:rgba(255,255,255,.12);}",".hme-tablewrap{border-color:rgba(255,255,255,.12);}",".hme-table th{background:rgba(50,50,54,.96);}",".hme-table th,.hme-table td{border-bottom-color:rgba(255,255,255,.08);}",".hme-table tr:hover td{background:rgba(10,132,255,.18);}",".hme-act:hover{background:rgba(255,255,255,.16);}}"].join(""),document.head.appendChild(style);var panel=document.createElement("div");panel.id="hmePanel",panel.innerHTML=['<div class="hme-head" id="hmeHead">','<span class="dot" id="hmeDot"></span>','<span class="hme-title">隐藏邮件 · 全功能面板</span>','<button class="hme-icon-btn" id="hmeMinBtn" title="最小化">—</button>','<button class="hme-icon-btn" id="hmeCloseBtn" title="关闭">✕</button>',"</div>",'<div class="hme-body">','<div class="hme-stat">','<div class="card"><b id="hmeTotal">–</b><span>账号现有</span></div>','<div class="card"><b id="hmeSucc">0</b><span>本次成功</span></div>','<div class="card"><b id="hmeFail">0</b><span>失败/限速</span></div>',"</div>",'<div class="hme-tabs">','<button class="hme-tab active" data-pane="gen">🆕 生成</button>','<button class="hme-tab" data-pane="manage">🗂️ 管理</button>','<button class="hme-tab" data-pane="tools">🔧 工具</button>',"</div>",'<div class="hme-pane active" data-pane="gen">','<div class="hme-row"><label>数量</label><input id="hmeCount" type="number" min="1" max="50" value="5"></div>','<div class="hme-row"><label>标签前缀</label><input id="hmePrefix" type="text" value="Test" placeholder="如 GPT / Test"></div>','<div class="hme-row"><label>起始编号</label><input id="hmeStart" type="number" min="0" value="6"></div>','<div class="hme-row"><label>间隔(秒)</label><div class="two">','<input id="hmeMinGap" type="number" min="0" value="8" title="最小间隔">','<input id="hmeMaxGap" type="number" min="0" value="15" title="最大间隔">',"</div></div>",'<div class="hme-row"><label>选项</label><div class="two" style="align-items:center;gap:10px;">','<label style="width:auto;font-size:12px;display:flex;align-items:center;gap:4px;"><input id="hmeSkip" type="checkbox" checked style="flex:0;width:auto;">跳过同名</label>','<label style="width:auto;font-size:12px;display:flex;align-items:center;gap:4px;"><input id="hmeAutoRetry" type="checkbox" style="flex:0;width:auto;">撞限速自动重试</label>',"</div></div>",'<div class="hme-progress"><i id="hmeBar"></i></div>','<div class="hme-btns">','<button class="hme-btn primary" id="hmeStartBtn">▶ 开始生成</button>','<button class="hme-btn danger" id="hmeStopBtn" disabled>■ 停止</button>',"</div>",'<div class="hme-btns">','<button class="hme-btn ghost" id="hmeProbeBtn">🔭 冷却探测</button>','<button class="hme-btn ghost" id="hmeCopyBtn">⧉ 复制成果</button>',"</div>","</div>",'<div class="hme-pane" data-pane="manage">','<div class="hme-row"><input id="hmeSearch" type="text" placeholder="🔍 搜索标签 / 邮箱…" style="width:100%;"></div>','<div class="hme-btns">','<button class="hme-btn ghost" id="hmeListBtn">↻ 刷新列表</button>','<button class="hme-btn ghost" id="hmeStatsBtn">📊 统计</button>','<button class="hme-btn ghost" id="hmeQuotaBtn">📐 配额</button>',"</div>",'<div class="hme-tablewrap"><table class="hme-table"><thead><tr>',"<th>#</th><th>标签</th><th>邮箱</th><th>状态</th><th>操作</th>",'</tr></thead><tbody id="hmeTbody"><tr><td colspan="5" style="text-align:center;padding:14px;" class="muted">点「刷新列表」加载</td></tr></tbody></table></div>','<div class="hme-btns">','<button class="hme-btn warn" id="hmeBulkDeact">😴 批量停用(搜索结果)</button>','<button class="hme-btn danger" id="hmeBulkDel">🗑️ 批量删除(搜索结果)</button>',"</div>",'<div class="hme-row"><label>改转发</label><input id="hmeFwd" type="email" placeholder="转发到的真实邮箱"></div>','<div class="hme-btns"><button class="hme-btn ghost" id="hmeFwdBtn">📮 设置转发地址</button></div>',"</div>",'<div class="hme-pane" data-pane="tools">','<div class="hme-btns">','<button class="hme-btn ghost" id="hmeCsvBtn">⭳ 导出CSV</button>','<button class="hme-btn ghost" id="hmeJsonBtn">⭳ 导出JSON</button>',"</div>",'<div class="hme-btns">','<button class="hme-btn ghost" id="hmeHistBtn">🕘 历史(Console)</button>','<button class="hme-btn ghost" id="hmeHistClrBtn">🧹 清空历史</button>',"</div>",'<div class="hme-row"><label>探测分钟</label><input id="hmeProbeMin" type="number" min="1" value="2" title="每隔几分钟探一次"></div>','<div style="font-size:11px;color:#8e8e93;line-height:1.5;">提示:管理动作(删除/停用/复活/改名)均记入本地历史,可在 Console 用 HME.history() 查看。删除不可逆,面板与 API 均要二次确认。</div>',"</div>",'<div class="hme-log" id="hmeLog"></div>','<div class="hme-foot"><span id="hmeCfg">配置:未连接</span><a id="hmeClear">清空日志</a></div>',"</div>"].join(""),document.body.appendChild(panel);var sx,sy,ox,oy,head,dragging,$=function(sel){return panel.querySelector(sel)},elDot=$("#hmeDot"),elTotal=$("#hmeTotal"),elSucc=$("#hmeSucc"),elFail=$("#hmeFail"),elCount=$("#hmeCount"),elPrefix=$("#hmePrefix"),elStart=$("#hmeStart"),elMinGap=$("#hmeMinGap"),elMaxGap=$("#hmeMaxGap"),elSkip=$("#hmeSkip"),elAutoRetry=$("#hmeAutoRetry"),elBar=$("#hmeBar"),elLog=$("#hmeLog"),elCfg=$("#hmeCfg"),elSearch=$("#hmeSearch"),elTbody=$("#hmeTbody"),elFwd=$("#hmeFwd"),elProbeMin=$("#hmeProbeMin"),btnStart=$("#hmeStartBtn"),btnStop=$("#hmeStopBtn"),btnProbe=$("#hmeProbeBtn"),btnCopy=$("#hmeCopyBtn"),btnList=$("#hmeListBtn"),btnStats=$("#hmeStatsBtn"),btnQuota=$("#hmeQuotaBtn"),btnBulkDeact=$("#hmeBulkDeact"),btnBulkDel=$("#hmeBulkDel"),btnFwd=$("#hmeFwdBtn"),btnCsv=$("#hmeCsvBtn"),btnJson=$("#hmeJsonBtn"),btnHist=$("#hmeHistBtn"),btnHistClr=$("#hmeHistClrBtn"),btnMin=$("#hmeMinBtn"),btnClose=$("#hmeCloseBtn");Array.prototype.forEach.call(panel.querySelectorAll(".hme-tab"),function(t){t.onclick=function(){switchPane(t.getAttribute("data-pane"))}}),elTbody.addEventListener("click",function(e){var btn=e.target.closest&&e.target.closest(".hme-act");if(btn){var tr=btn.closest("tr"),id=tr&&tr.getAttribute("data-id");if(id){var act=btn.getAttribute("data-act"),item=pstate.lastList.find(function(m){return m.anonymousId===id})||{hme:id,label:id};!async function(){try{if(setDot("busy"),"deactivate"===act)await HME.deactivate(id),log("😴 已停用 "+item.hme,"ok");else if("reactivate"===act)await HME.reactivate(id),log("♻️ 已复活 "+item.hme,"ok");else if("rename"===act){var nv=window.prompt("给 "+item.hme+" 改新标签:",item.label||"");if(null==nv||""===nv)return void setDot("");await HME.rename(id,nv),log("✏️ "+item.hme+' → "'+nv+'"',"ok")}else if("delete"===act){if(!window.confirm("⚠️ 删除不可逆!\n确认删除 "+item.label+" "+item.hme+" ?"))return void setDot("");await HME.delete(id,{force:!0}),log("🗑️ 已删除 "+item.hme,"warn")}var arr=HME.state._lastList||await HME.fetchList();pstate.lastList=arr,elTotal.textContent=arr.length,renderTable(arr,elSearch.value),setDot("")}catch(err){setDot("err"),log("操作失败:"+err.message,"err")}}()}}}),elSearch.addEventListener("input",function(){renderTable(pstate.lastList,elSearch.value)}),btnStart.onclick=startBatch,btnStop.onclick=function(){HME.stop(),log("正在停止…","warn")},btnCopy.onclick=function(){if(pstate.created.length){var txt=pstate.created.map(function(m,i){return i+1+". "+m.label+"\t"+m.hme}).join("\n");navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(txt).then(function(){log("已复制 "+pstate.created.length+" 个到剪贴板","ok")}).catch(function(){console.log(txt),log("剪贴板不可用,已打印到 Console","warn")}):(console.log(txt),log("剪贴板不可用,已打印到 Console","warn"))}else log("本次还没有成功创建的别名","warn")},btnList.onclick=refreshList,btnStats.onclick=function(){!async function(){try{var s=await HME.stats();log("📊 共 "+s.total+",在用 "+s.active+",停用 "+s.inactive,"ok")}catch(e){log("统计失败:"+e.message,"err")}}()},btnQuota.onclick=function(){!async function(){try{var r=await HME.quota();log("📐 maxEmailsPerUser(域名相关)="+r.maxEmailsPerUser+",maxDomainsAllowed="+r.maxDomainsAllowed,"ok")}catch(e){log("配额查询失败:"+e.message,"err")}}()},btnBulkDeact.onclick=function(){var kw=(elSearch.value||"").trim();kw?async function(){try{var hits=await HME.search(kw,{activeOnly:!0});if(!hits.length)return void log("没有匹配「"+kw+"」的在用别名","warn");if(!window.confirm("将停用 "+hits.length+" 个匹配「"+kw+"」的别名,确认?"))return;setDot("busy"),log("✅ 批量停用 "+await HME.bulkDeactivate(kw,{force:!0})+" 个","ok"),await refreshList(),setDot("")}catch(e){setDot("err"),log("批量停用失败:"+e.message,"err")}}():log("请先在搜索框输入关键词,再批量停用","warn")},btnBulkDel.onclick=function(){var kw=(elSearch.value||"").trim();kw?async function(){try{var hits=await HME.search(kw);if(!hits.length)return void log("没有匹配「"+kw+"」的别名","warn");if(!window.confirm("⚠️ 删除不可逆!\n将删除 "+hits.length+" 个匹配「"+kw+"」的别名,确认?"))return;setDot("busy"),log("🗑️ 批量删除 "+await HME.bulkDelete(kw,{force:!0})+" 个","warn"),await refreshList(),setDot("")}catch(e){setDot("err"),log("批量删除失败:"+e.message,"err")}}():log("请先在搜索框输入关键词,再批量删除","warn")},btnFwd.onclick=function(){var email=(elFwd.value||"").trim();email?window.confirm("确认把所有隐藏邮箱的转发地址改为:\n"+email+" ?")&&async function(){try{setDot("busy"),await HME.setForward(email),log("📮 转发地址已改为 "+email,"ok"),setDot("")}catch(e){setDot("err"),log("改转发失败:"+e.message,"err")}}():log("请填写要转发到的真实邮箱","warn")},btnProbe.onclick=function(){var im=Math.max(1,parseInt(elProbeMin.value,10)||2);log("🔭 冷却探测启动:每 "+im+" 分钟一次,解禁后保存为 Cooldown。停:点■停止","new"),setDot("busy"),HME.probe({intervalMin:im,label:"Cooldown"}).then(function(r){r?(log("✅ 解禁了!实测冷却 ≈ "+r.cooldownMin+" 分钟,已保存 "+r.hme,"ok"),refreshList()):log("探测结束(未解禁或已停止)","warn"),setDot("")}).catch(function(e){setDot("err"),log("探测失败:"+e.message,"err")})},btnCsv.onclick=function(){!async function(){try{await refreshListIfEmpty(),await HME.exportCSV(),log("已触发 CSV 导出","ok")}catch(e){log("导出CSV失败:"+e.message,"err")}}()},btnJson.onclick=function(){!async function(){try{await refreshListIfEmpty(),await HME.exportJSON(),log("已触发 JSON 导出","ok")}catch(e){log("导出JSON失败:"+e.message,"err")}}()},btnHist.onclick=function(){log("🕘 本地历史 "+HME.history().length+" 条(详见 Console 表格)","ok")},btnHistClr.onclick=function(){window.confirm("确认清空本地操作历史?")&&(HME.historyClear(),log("🧹 已清空本地历史","warn"))},$("#hmeClear").onclick=function(){elLog.innerHTML=""},btnClose.onclick=function(){panel.remove(),style.remove(),delete window.__HME_PANEL__},btnMin.onclick=function(){panel.classList.toggle("hme-min")},head=$("#hmeHead"),dragging=!1,head.addEventListener("mousedown",function(e){if(!e.target.classList.contains("hme-icon-btn")){dragging=!0,sx=e.clientX,sy=e.clientY;var r=panel.getBoundingClientRect();ox=r.left,oy=r.top,panel.style.right="auto",panel.style.bottom="auto",panel.style.left=ox+"px",panel.style.top=oy+"px",e.preventDefault()}}),window.addEventListener("mousemove",function(e){if(dragging){var nl=ox+e.clientX-sx,nt=oy+e.clientY-sy;panel.style.left=Math.max(4,Math.min(window.innerWidth-60,nl))+"px",panel.style.top=Math.max(4,Math.min(window.innerHeight-30,nt))+"px"}}),window.addEventListener("mouseup",function(){dragging=!1}),window.__HME_PANEL__={show:function(){panel.style.display="",panel.classList.remove("hme-min")},hide:function(){panel.style.display="none"},start:startBatch,refresh:refreshList,switchPane:switchPane,state:pstate,engine:HME},log("面板已加载(v5.0 全功能),正在连接配置…","dim"),refreshList().then(function(list){list?log("就绪 ✓ 生成/管理/工具 三个标签页都可用;Console 用 HME.menu() 看全部命令","ok"):log("未连上配置:请确认当前是已登录的 www.icloud.com","warn")})}function log(msg,cls){var line=document.createElement("div");line.innerHTML='<span class="dim">'+(new Date).toLocaleTimeString()+'</span> <span class="'+(cls||"")+'">'+esc(msg)+"</span>",elLog.appendChild(line),elLog.scrollTop=elLog.scrollHeight}function setDot(kind){elDot.className="dot"+(kind?" "+kind:"")}function setBar(p){elBar.style.width=Math.max(0,Math.min(100,p))+"%"}function syncCfgFoot(){HME.state.base?elCfg.textContent="配置:已连接 "+HME.state.base.replace("https://",""):elCfg.textContent="配置:未连接"}function switchPane(name){pstate.view=name,Array.prototype.forEach.call(panel.querySelectorAll(".hme-tab"),function(t){t.classList.toggle("active",t.getAttribute("data-pane")===name)}),Array.prototype.forEach.call(panel.querySelectorAll(".hme-pane"),function(p){p.classList.toggle("active",p.getAttribute("data-pane")===name)})}function renderTable(listArr,filter){var k=(filter||"").toLowerCase(),rows=listArr.filter(function(m){return!k||((m.label||"").toLowerCase().indexOf(k)>=0||(m.hme||"").toLowerCase().indexOf(k)>=0)});rows.length?elTbody.innerHTML=rows.map(function(m,i){var act=m.isActive?'<button class="hme-act" data-act="deactivate" title="停用">😴</button>':'<button class="hme-act" data-act="reactivate" title="复活">♻️</button>';return'<tr data-id="'+esc(m.anonymousId)+'"><td class="muted">'+(i+1)+"</td><td>"+esc(m.label)+"</td><td>"+esc(m.hme)+"</td><td>"+(m.isActive?"✅":"😴")+"</td><td>"+act+'<button class="hme-act" data-act="rename" title="改名">✏️</button><button class="hme-act" data-act="delete" title="删除(不可逆)">🗑️</button></td></tr>'}).join(""):elTbody.innerHTML='<tr><td colspan="5" style="text-align:center;padding:14px;" class="muted">无匹配</td></tr>'}function refreshList(){return async function(){try{await HME.config(),syncCfgFoot();var arr=await HME.fetchList();return pstate.lastList=arr,elTotal.textContent=arr.length,renderTable(arr,elSearch.value),log("列表已刷新:账号现有 "+arr.length+" 个隐藏邮箱","ok"),window.__HME_ALL__=arr,arr}catch(e){return setDot("err"),log("刷新异常:"+e.message,"err"),null}}()}function handleErr(err,label,step){var code=err&&err.errorCode,msg=err&&err.errorMessage||"",retry=err&&err.retryAfter;"-41015"===code||-41015===code?(log(" ⛔ ["+label+"] "+step+" 被限速 (-41015"+(null!=retry?", retryAfter:"+retry:"")+")","err"),msg&&log(" 原文:"+msg,"dim"),log(" 已自动停止,稍后再试(建议加大间隔或勾选自动重试)。","warn")):log(" ❌ ["+label+"] "+step+" 失败:"+(code||"")+" "+msg,"err")}function startBatch(){return async function(){if(!pstate.running){var count=Math.max(1,parseInt(elCount.value,10)||1),prefix=(elPrefix.value||"Mail").trim(),start=parseInt(elStart.value,10)||0,minGap=Math.max(0,1e3*(parseFloat(elMinGap.value)||0)),maxGap=Math.max(minGap,1e3*(parseFloat(elMaxGap.value)||0)),skip=!!elSkip.checked,autoRetry=!!elAutoRetry.checked;pstate.running=!0,HME.state._stopBatch=!1,btnStart.disabled=!0,btnStop.disabled=!1,setDot("busy"),setBar(0);var succ=0,fail=0;log("▶ 开始:"+count+" 个,标签 "+prefix+start+" … "+prefix+(start+count-1),"new");try{await HME.config(),syncCfgFoot()}catch(e){return log("配置获取失败:"+e.message,"err"),setDot("err"),pstate.running=!1,btnStart.disabled=!1,void(btnStop.disabled=!0)}var labels=Array.from({length:count},function(_,i){return prefix+(start+i)});if(skip)try{var existing=new Set((HME.state._lastList||await HME.fetchList()).map(function(m){return m.label})),before=labels.length;(labels=labels.filter(function(l){return!existing.has(l)})).length<before&&log(" ⏭️ 跳过 "+(before-labels.length)+" 个已存在标签,剩 "+labels.length+" 个","dim")}catch(_){}for(var i=0;i<labels.length;i++){if(HME.state._stopBatch){log("🛑 已手动停止","warn");break}var label=labels[i];try{var g=await HME.call("POST","/v1/hme/generate",{langCode:"en-us"});if(!g.success){fail++,elFail.textContent=fail,handleErr(g.error,label,"generate");break}var hme=g.result.hme;log(" ["+(i+1)+"/"+labels.length+"] 🆕 "+hme,"new"),await sleep(rand(800,1600));var res=await HME.call("POST","/v1/hme/reserve",{hme:hme,label:label,note:""});if(!res.success){if(autoRetry&&"-41015"===String(res.error&&res.error.errorCode)){var rw=rand(12e4,18e4);log(" 🚫 限速,"+(rw/1e3).toFixed(0)+"s 后重试 "+label,"warn"),await sleep(rw),res=await HME.call("POST","/v1/hme/reserve",{hme:hme,label:label,note:""})}if(!res.success){fail++,elFail.textContent=fail,handleErr(res.error,label,"reserve");break}}succ++,pstate.created.push({label:label,hme:res.result.hme.hme}),elSucc.textContent=pstate.created.length,log(" ["+(i+1)+"/"+labels.length+"] ✅ 已保存 "+res.result.hme.hme+" → "+label,"ok")}catch(e){fail++,elFail.textContent=fail,log(" ["+(i+1)+"/"+labels.length+"] ⚠️ 网络异常:"+e.message,"warn");break}if(setBar((i+1)/Math.max(1,labels.length)*100),i<labels.length-1&&!HME.state._stopBatch){var gap=rand(minGap,maxGap);log(" ⏳ 等待 "+(gap/1e3).toFixed(1)+" 秒…","dim"),await sleep(gap)}}setBar(100),log("🏁 结束:本批成功 "+succ+",失败/限速 "+fail,succ>0?"ok":"warn"),setDot(fail>0&&0===succ?"err":""),pstate.running=!1,btnStart.disabled=!1,btnStop.disabled=!0,refreshList()}}()}function refreshListIfEmpty(){return async function(){HME.state._lastList||await refreshList()}()}}(); 如果担心不安全可以让ChatGPT/Codex再做一做Code Review。
好帖,点赞就完事了!
谢分享,能做成油猴插件的话就更方便了?
楼主,你应该会想要知道 bookmarklet
就自动生成而言 duckduckgo的随机邮箱会更好用一点
Chrome 对 icloud的支持太差,Safari对油猴支持太差
我keychain里八百多个密码不想被封号