{"minVerName":"2.23.0","minVerCode":2023000,"count":2,"savedVerName":"26.0.0","savedVerCode":26000000,"lastSaveScreenDpi":1,"lastSaveScreenWidth":400,"lastSaveScreenHeight":600}
{"type":"运行JS代码","jsCode":"// ====================== 度大师配置 ======================\r\nDU = {\r\n    \"url\": 'http://k.duds.cn/api.php',\r\n    \"appId\": '10372', // 你的应用ID\r\n    // 获取设备标识作为markcode\r\n    getMarkcode: () => {\r\n        try {\r\n            return zdjl.getDeviceInfo().deviceId;\r\n        } catch (e) {\r\n            return \"unknown_device\";\r\n        }\r\n    }\r\n};\r\n\r\n// ====================== 工具函数 ======================\r\n// 时间格式化\r\nfunction formatTime(timestamp) {\r\n    if (!timestamp) return \"永久有效\";\r\n    let date = new Date(timestamp * 1000);\r\n    let y = date.getFullYear();\r\n    let m = String(date.getMonth() + 1).padStart(2, '0');\r\n    let d = String(date.getDate()).padStart(2, '0');\r\n    let h = String(date.getHours()).padStart(2, '0');\r\n    let i = String(date.getMinutes()).padStart(2, '0');\r\n    let s = String(date.getSeconds()).padStart(2, '0');\r\n    return `${y}-${m}-${d} ${h}:${i}:${s}`;\r\n}\r\n\r\n// 度大师卡密验证核心函数\r\nfunction dudashiVerify(kami) {\r\n    let markcode = DU.getMarkcode();\r\n    let timestamp = Math.floor(Date.now() / 1000);\r\n    let url = `${DU.url}?api=kmlogon&app=${encodeURIComponent(DU.appId)}&kami=${encodeURIComponent(kami)}&markcode=${encodeURIComponent(markcode)}&t=${timestamp}`;\r\n    \r\n    let res = zdjl.requestUrl({\r\n        url: url,\r\n        method: 'POST',\r\n        headers: [{'Content-Type': 'application/x-www-form-urlencoded'}],\r\n        requestBody: \"\",\r\n        requestType: 'TEXT',\r\n        responseType: 'TEXT'\r\n    });\r\n    \r\n    if (res.code !== 200 || !res.body) {\r\n        return { code: -1, msg: \"网络请求失败，状态码：\" + (res.code || \"未知\") };\r\n    }\r\n    \r\n    try {\r\n        return JSON.parse(res.body);\r\n    } catch (e) {\r\n        return { code: -1, msg: \"返回数据格式错误\" };\r\n    }\r\n}\r\n\r\n// 打开链接\r\nopenLink = (url) => {\r\n    zdjl.runAction({ type: \"打开链接\", delay: \"0\", link: 'zdjl://api/openWeb?url=' + url });\r\n};\r\n\r\n// 模拟按键\r\npressKey = (keyCode) => {\r\n    zdjl.runAction({ \"type\": \"按键\", \"delay\": \"0\", \"keyCode\": keyCode });\r\n};\r\n\r\n// ====================== HTML 验证界面 ======================\r\nconst HTML_UI = `\r\n<!DOCTYPE html>\r\n<html lang=\"zh\">\r\n<head>\r\n  <meta charset=\"UTF-8\">\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n  <title>度大师卡密验证</title>\r\n  <style>\r\n      * { margin: 0; padding: 0; box-sizing: border-box; }\r\n      body {\r\n          font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\r\n          background: linear-gradient(135deg, #1A1C22 0%, #1A1C22 100%);\r\n          display: flex; flex-direction: column; align-items: center;\r\n          padding-top: 20px; color: white; min-height: auto; overflow: hidden;\r\n      }\r\n      h2 { color: #FFFFFF; font-size: 32px; margin-bottom: 5px; }\r\n      .description { margin-bottom: 10px; color: #9CA3AF; font-size: 12px; }\r\n      .input-group {\r\n          display: flex; flex-direction: column; align-items: center;\r\n          width: 90%; max-width: 350px; margin: 10px 0;\r\n      }\r\n      .input-group input[type=\"text\"] {\r\n          width: 100%; padding: 12px 1px;\r\n          border: 2px solid #9CA3AF; border-radius: 10px;\r\n          color: white; font-size: 0.85em; background-color: #282B32;\r\n      }\r\n      .input-group input[type=\"text\"]:focus { outline: none; border-color: #fd7e14; }\r\n      .input-group input[type=\"button\"] {\r\n          width: 100%; padding: 12px; margin-top: 20px;\r\n          background-color: #282B32; border: 2px solid #9CA3AF; border-radius: 10px;\r\n          color: white; cursor: pointer; font-size: 12px; font-weight: 600;\r\n          transition: all 0.3s ease;\r\n      }\r\n      .input-group input[type=\"button\"]:hover { background-color: #fd7e14; border-color: #fd7e14; }\r\n      .paste-icon {\r\n          position: absolute; right: 10px; top: 50%;\r\n          transform: translateY(-50%); cursor: pointer; width: 24px; height: 24px;\r\n      }\r\n  </style>\r\n  <script>\r\n      window.onload = () => {\r\n          const saved = localStorage.getItem(\"dudashi_kami\");\r\n          if (saved) document.getElementById(\"kamiInput\").value = saved;\r\n          document.getElementById(\"kamiInput\").addEventListener('input', e => {\r\n              localStorage.setItem(\"dudashi_kami\", e.target.value);\r\n          });\r\n      }\r\n      async function copyToClipboard(text) {\r\n          try { await navigator.clipboard.writeText(text); }\r\n          catch (e) {\r\n              let ta = document.createElement(\"textarea\");\r\n              ta.value = text; document.body.appendChild(ta);\r\n              ta.select(); document.execCommand('copy');\r\n              document.body.removeChild(ta);\r\n          }\r\n      }\r\n      function submitVerify() {\r\n          const kami = document.getElementById(\"kamiInput\").value.trim();\r\n          if (!kami) { alert(\"请输入卡密\"); return; }\r\n          const config = { verify: kami, time: Date.now(), paste: false, DU: true };\r\n          copyToClipboard(JSON.stringify(config));\r\n      }\r\n  </script>\r\n</head>\r\n<body>\r\n  <h2>度大师授权验证</h2>\r\n  <p class=\"description\">请输入授权卡密完成设备绑定</p>\r\n  <div class=\"input-group\">\r\n      <div style=\"position: relative; width: 100%;\">\r\n          <input type=\"text\" id=\"kamiInput\" placeholder=\"请输入卡密\" maxlength=\"32\"\r\n                 oninput=\"this.value = this.value.replace(/[^a-zA-Z0-9]/g, '')\">\r\n      </div>\r\n      <input type=\"button\" value=\"立即验证\" onclick=\"submitVerify()\">\r\n  </div>\r\n</body>\r\n</html>\r\n`;\r\n\r\n// ====================== 剪切板交互逻辑 ======================\r\ngetClipboardContent = () => {\r\n    while (true) {\r\n        const clipboardData = zdjl.getClipboard();\r\n        try {\r\n            const json = JSON.parse(clipboardData);\r\n            if (json.DU === true && !json.paste) {\r\n                zdjl.setClipboard(clipboardCache);\r\n                return json;\r\n            } else {\r\n                clipboardCache = clipboardData;\r\n            }\r\n        } catch (e) {\r\n            clipboardCache = clipboardData;\r\n        }\r\n        sleep(10);\r\n    }\r\n};\r\n\r\n// ====================== 启动验证界面 ======================\r\nlet html_file = '/sdcard/dudashi/verify.html';\r\ntry {\r\n    zdjl.writeFile(html_file, HTML_UI);\r\n} catch (e) {\r\n    zdjl.toast('请允许存储权限');\r\n    exit();\r\n}\r\nopenLink(html_file);\r\n\r\n// 清空验证标识剪切板\r\nif (/(?=.*time)(?=.*DU)/.test(zdjl.getClipboard())) {\r\n    zdjl.setClipboard(\"\");\r\n}\r\n\r\nlet clipboardCache = zdjl.getClipboard();\r\n\r\n// ====================== 核心验证循环 ======================\r\nwhile (true) {\r\n    try {\r\n        const data = getClipboardContent();\r\n        const result = dudashiVerify(data.verify);\r\n        \r\n        if (result.code === 200) {\r\n            let expireTime = formatTime(result.msg?.vip || 0);\r\n            zdjl.toast('验证成功！到期时间：' + expireTime);\r\n            pressKey(4); // 返回键关闭页面\r\n            break;\r\n        } else {\r\n            let errMsg = typeof result.msg === 'string' ? result.msg : (result.msg?.message || \"验证失败\");\r\n            zdjl.toast(errMsg, 1500);\r\n        }\r\n    } catch (e) {\r\n        zdjl.toast('连接失败，正在重试：' + e, 1000);\r\n        sleep(500);\r\n    }\r\n}\r\n\r\n// 返回原应用\r\nfor (let i = 0; i < 2; i++) {\r\n    pressKey(187);\r\n    sleep(100);\r\n}\r\n\r\n// ====================== 下方写你的主脚本代码 ======================\r\n// 验证通过后自动执行你的脚本逻辑\r\n// ============================================================="}
{"type":"点击","posData":{"type":"location","x":"190%","y":"380%"}}