diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/america.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/america.png new file mode 100644 index 000000000..080611627 Binary files /dev/null and b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/america.png differ diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/asia.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/asia.png new file mode 100644 index 000000000..472c7123b Binary files /dev/null and b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/asia.png differ diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/confirm.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/confirm.png new file mode 100644 index 000000000..4871ce6fe Binary files /dev/null and b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/confirm.png differ diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/confirm_button.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/confirm_button.png new file mode 100644 index 000000000..680dca235 Binary files /dev/null and b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/confirm_button.png differ diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/europe.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/europe.png new file mode 100644 index 000000000..704141562 Binary files /dev/null and b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/europe.png differ diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/input_email_username.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/input_email_username.png new file mode 100644 index 000000000..84a389b10 Binary files /dev/null and b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/input_email_username.png differ diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_other_account.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_other_account.png deleted file mode 100644 index 48a78f1ca..000000000 Binary files a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_other_account.png and /dev/null differ diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_other_account_1.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_other_account_1.png deleted file mode 100644 index 299b31389..000000000 Binary files a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_other_account_1.png and /dev/null differ diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_out_account.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_out_account.png index 7efbff243..99cc210ea 100644 Binary files a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_out_account.png and b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_out_account.png differ diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/logout.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/logout.png deleted file mode 100644 index 99cc210ea..000000000 Binary files a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/logout.png and /dev/null differ diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/pm_menu.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/pm_menu.png deleted file mode 100644 index f1c7a3855..000000000 Binary files a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/pm_menu.png and /dev/null differ diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/switch_server.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/switch_server.png new file mode 100644 index 000000000..3915a2a6b Binary files /dev/null and b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/switch_server.png differ diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/twhkmo.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/twhkmo.png new file mode 100644 index 000000000..8993e5559 Binary files /dev/null and b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/twhkmo.png differ diff --git a/repo/js/SwitchAccountMultipleMode/README.md b/repo/js/SwitchAccountMultipleMode/README.md index f6791341a..9f3e77556 100644 --- a/repo/js/SwitchAccountMultipleMode/README.md +++ b/repo/js/SwitchAccountMultipleMode/README.md @@ -1,17 +1,17 @@ -# 下拉列表模式 +## 1.下拉列表模式 -## 使用前准备 +### 1.1.使用前准备 确保你想要切换的账号是已登录状态,且账号选择列表中存在。 -## 使用方式 +### 1.2.使用方式 1. 把此脚本添加到配置组 2. 右键点击选择"修改JS脚本自定义配置" 3. 填入你想登录的账户名称,该名称必须和账号列表中显示的一致 - 请确认你此次登录使用的是手机号还是邮箱 -# B服切换另一个账号 +## 2.B服切换另一个账号 确保你想要切换的账号(目前只支持两个账号互相切换)是已登录状态。 @@ -19,9 +19,15 @@ [在此感谢空的大力支持,点击可查看原po](https://pd.qq.com/g/620449244035027412/post/B_022e6a69a93f0a001441152193488791090X60?showGuild=1&errCode=0&asideType=Full) -# 账号+密码 / 账号+密码+OCR模式 +## 3.国际服 -**重要免责声明:** +目前已实现国际服账号+密码登陆,并能切换服务器(亚、欧、美、台港澳),部分未尽问题尚未处理,大家多测测,更诚邀大佬们来改良 + +## 4.账号+密码 + +开JS自定义填就是了,选对模式,其他不该选不该填的就别选别填 + +# **重要免责声明:** 1. **数据安全:** 1. 本脚本使用的用户名、密码等敏感信息仅存储在本地设备,开发者无法获取。 diff --git a/repo/js/SwitchAccountMultipleMode/main.js b/repo/js/SwitchAccountMultipleMode/main.js index 9df4407d0..4e7e72e44 100644 --- a/repo/js/SwitchAccountMultipleMode/main.js +++ b/repo/js/SwitchAccountMultipleMode/main.js @@ -1,7 +1,6 @@ // ====================================================== -// 切换账号(OCR)版本 +// 切换账号OCR模式 const author = "彩虹QQ人"; -const script_name = "切换账号(OCR)版本"; // 图像识别资源 const pm_out = { template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/pm_out.png")), @@ -19,10 +18,6 @@ const out_account = { template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/out_account.png")), name: "out_account.png" }; -const login_other_account = { - template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/login_other_account_1.png")), - name: "login_other_account.png" -}; const input_phone_or_email = { template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/input_phone_or_email.png")), name: "input_phone_or_email.png" @@ -35,15 +30,49 @@ const agree = { template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/agree.png")), name: "agree.png" }; +const confirm_switch_account = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/confirm.png")), + name: "confirm.png" +}; +const input_email_username = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/input_email_username.png")), + name: "input_email_username.png" +}; +const switch_server = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/switch_server.png")), + name: "switch_server.png" +}; +const asia_server = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/asia.png")), + name: "asia.png" +}; +const europe_server = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/europe.png")), + name: "europe.png" +}; +const america_server = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/america.png")), + name: "america.png" +}; +const twhkmo_server = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/twhkmo.png")), + name: "twhkmo.png" +}; +const confirm_button = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/confirm_button.png")), + name: "confirm_button.png" +}; + // 人机验证识别图片 const login_verification = { template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/verification.png")), name: "verification.png" }; + // 判断temporaryAccount是否为空,如果为空则赋值‘否’ const Account = settings.temporaryAccount || "否"; - eval(file.readTextSync('utils/uid.js')) + // 点击区域中心 async function clickCenter(x, y, width, height) { let centerX = Math.round(x + width / 2); @@ -52,8 +81,10 @@ async function clickCenter(x, y, width, height) { await sleep(500); // 确保点击后有足够的时间等待 return { success: true, x: centerX, y: centerY }; } + // 匹配图像并点击 async function matchImgAndClick(obj, desc, timeout = 8000) { + const script_mode = "matchImgAndClick"; const start = Date.now(); let retryCount = 0; // 识别次数计数 let status = false; // 用于记录是否匹配成功 @@ -74,13 +105,14 @@ async function matchImgAndClick(obj, desc, timeout = 8000) { log.info(`【IMG】第${retryCount++}次识别并点击 ${desc} 失败 | 耗时: ${Date.now() - start}ms`); } } catch (error) { - log.error(`【IMG】${script_name}等待超时,请人工介入。===待切换账号:${settings.username}===超时原因:未找到目标 [${desc}] | 文件:${obj.name}`); + log.error(`【IMG】${script_mode}等待超时,请人工介入。===待切换账号:${settings.username}===超时原因:未找到目标 [${desc}] | 文件:${obj.name}`); //如果有配置通知…… - notification.error(`【IMG】${script_name}等待超时,请人工介入。===待切换账号:${settings.username}===超时原因:未找到目标 [${desc}] | 文件:${obj.name}`); + notification.error(`【IMG】${script_mode}等待超时,请人工介入。===待切换账号:${settings.username}===超时原因:未找到目标 [${desc}] | 文件:${obj.name}`); throw new Error(`【IMG】识别图像时发生异常: ${error.message}`); } return { success: false }; } + // 文字识别并点击 async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { let start = Date.now(); @@ -112,14 +144,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { } return { success: false }; } -// 切换账号(OCR)版本 -// ====================================================== - -// ====================================================== -//切换账号DropDown - - -//切换账号DropDown +// 切换账号OCR模式 // ====================================================== (async function () { @@ -230,7 +255,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { const targetUser = settings.username; - const assetLogoutIcon = u.loadTemplate("Assets/RecognitionObject/logout.png", 1750, 900, 170, 180); + const assetLogoutIcon = u.loadTemplate("Assets/RecognitionObject/login_out_account.png", 1750, 900, 170, 180); const assetPaimonMenuIcon = u.loadTemplate("Assets/RecognitionObject/paimon_menu.png", 0, 0, 150, 150); // Check current state @@ -434,7 +459,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { } if (settings.Modes == "下拉列表") { await DropDownMode(); - } else if (settings.Modes == "账号+密码") { + } else if (settings.Modes == "账号+密码+键鼠") { await KeyboardMouseMode(); } else if (settings.Modes == "账号+密码+OCR") { await OcrMode(); @@ -442,6 +467,8 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { await BilibiliKeyboardMouseMode(); } else if (settings.Modes == "B服切换另一个账号匹配+键鼠") { await BilibiliMatchAndKeyboardMouseMode(); + } else if (settings.Modes == "国际服账号+密码+OCR") { + await GlobalOcrMode(); } else { log.info("尖尖哇嘎乃") } @@ -463,7 +490,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { } - // 纯键鼠模式 对应:账号+密码(根据分辨率确定鼠标位置) + // 纯键鼠模式 对应:账号+密码+键鼠(根据分辨率确定鼠标位置) async function KeyboardMouseMode() { setGameMetrics(1920, 1080, 2.0); //到达主页面 @@ -544,9 +571,9 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { // OCR模式 对应:账号+密码+OCR async function OcrMode() { + const script_mode = "OCR模式"; setGameMetrics(1920, 1080, 1); // 如果切换账号是第一个脚本,则有可能出现月卡选项 - //防止genshin.blessingOfTheWelkinMoon();方法失效,先使用物理点击。 try { keyDown("VK_MENU"); await sleep(500); @@ -557,10 +584,6 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { } finally { keyUp("VK_MENU"); } - //await genshin.blessingOfTheWelkinMoon(); - //await sleep(1000); - //await genshin.blessingOfTheWelkinMoon(); - //await sleep(1000); await genshin.returnMainUi(); await keyPress("VK_ESCAPE"); @@ -593,8 +616,8 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { await sleep(1000); if (verify.isExist()) { //这里可配置通知方法 - notification.error(`${script_name}触发人机验证,请手动登录。===待切换账号:${settings.username}`); - log.error(`${script_name}触发人机验证,请手动登录。===待切换账号:${settings.username}`); + notification.error(`${script_mode}触发人机验证,请手动登录。===待切换账号:${settings.username}`); + log.error(`${script_mode}触发人机验证,请手动登录。===待切换账号:${settings.username}`); } } /** @@ -606,11 +629,6 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { await sleep(15000); //可能登录账号的时候出现月卡提醒,则先点击一次月卡。 - //await genshin.blessingOfTheWelkinMoon(); - //await sleep(1000); - //await genshin.blessingOfTheWelkinMoon(); - //await sleep(1000); - //防止genshin.blessingOfTheWelkinMoon();方法失效,先使用物理点击。 await sleep(2000); keyDown("VK_MENU"); await sleep(500); @@ -624,10 +642,10 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { // 如果配置了通知 notification.send("账号【" + settings.username + "】切换成功"); } catch (error) { - log.error(`${script_name}脚本执行过程中发生错误:${error.message}`); + log.error(`${script_mode}脚本执行过程中发生错误:${error.message}`); //如果发生错误,则发送通知 - notification.error(`${script_name}脚本执行过程中发生错误:${error.message}`); - throw new Error(`${script_name}脚本执行过程中发生错误:${error.message}`); + notification.error(`${script_mode}脚本执行过程中发生错误:${error.message}`); + throw new Error(`${script_mode}脚本执行过程中发生错误:${error.message}`); } finally { keyUp("VK_MENU"); } @@ -692,9 +710,9 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { // B服切换匹配+键鼠模式 对应:B服切换另一个账号匹配+键鼠 async function BilibiliMatchAndKeyboardMouseMode() { + const script_mode = "B服切换匹配+键鼠模式"; setGameMetrics(1920, 1080, 1); // 如果切换账号是第一个脚本,则有可能出现月卡选项 - //防止genshin.blessingOfTheWelkinMoon();方法失效,先使用物理点击。 try { keyDown("VK_MENU"); await sleep(500); @@ -705,10 +723,6 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { } finally { keyUp("VK_MENU"); } - //await genshin.blessingOfTheWelkinMoon(); - //await sleep(1000); - //await genshin.blessingOfTheWelkinMoon(); - //await sleep(1000); await genshin.returnMainUi(); await keyPress("VK_ESCAPE"); @@ -752,8 +766,8 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { await sleep(1000); if (verify.isExist()) { //这里可配置通知方法 - notification.error(`${script_name}触发人机验证,请手动登录。===待切换账号:${settings.username}`); - log.error(`${script_name}触发人机验证,请手动登录。===待切换账号:${settings.username}`); + notification.error(`${script_mode}触发人机验证,请手动登录。===待切换账号:${settings.username}`); + log.error(`${script_mode}触发人机验证,请手动登录。===待切换账号:${settings.username}`); } } /** @@ -765,11 +779,6 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { await sleep(12000); //可能登录账号的时候出现月卡提醒,则先点击一次月卡。 - //await genshin.blessingOfTheWelkinMoon(); - //await sleep(1000); - //await genshin.blessingOfTheWelkinMoon(); - //await sleep(1000); - //防止genshin.blessingOfTheWelkinMoon();方法失效,先使用物理点击。 await sleep(2000); keyDown("VK_MENU"); await sleep(500); @@ -783,10 +792,93 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { // 如果配置了通知 notification.send("账号【" + settings.username + "】切换成功"); } catch (error) { - log.error(`${script_name}脚本执行过程中发生错误:${error.message}`); + log.error(`${script_mode}脚本执行过程中发生错误:${error.message}`); //如果发生错误,则发送通知 - notification.error(`${script_name}脚本执行过程中发生错误:${error.message}`); - throw new Error(`${script_name}脚本执行过程中发生错误:${error.message}`); + notification.error(`${script_mode}脚本执行过程中发生错误:${error.message}`); + throw new Error(`${script_mode}脚本执行过程中发生错误:${error.message}`); + } finally { + keyUp("VK_MENU"); + } + } + + // 国际服OCR模式 对应:国际服账号+密码+OCR + async function GlobalOcrMode() { + const script_mode = "国际服OCR模式"; + const page = new BvPage(); + setGameMetrics(1920, 1080, 1); + await genshin.blessingOfTheWelkinMoon(); + await genshin.returnMainUi(); + + await keyPress("VK_ESCAPE"); + await sleep(500); + try { + await matchImgAndClick(pm_out, "左下角退出门"); + await matchImgAndClick(out_to_login, "退出至登陆页面"); + await page.WaitForOcrMatch("开始游戏"); + await matchImgAndClick(login_out_account, "登录页的右下角退出按钮"); + await page.WaitForOcrMatch("切换账号"); + await matchImgAndClick(confirm_switch_account, "确认切换账号"); + await recognizeTextAndClick("登录其他账号", RecognitionObject.Ocr(300, 200, 1200, 800), 8000); + await sleep(1000); + await matchImgAndClick(input_email_username, "输入邮箱/用户名"); + await inputText(settings.username); + await sleep(1000); + await matchImgAndClick(input_password, "输入密码"); + await inputText(settings.password); + await sleep(1000); + // 按下回车登录账号,弹出用户协议对话框 + await keyPress("VK_RETURN"); + // await matchImgAndClick(agree, "同意用户协议"); + // 当天上下线次数过于频繁弹验证码 + for (let i = 1; i <= 5; i++) { + const ro = captureGameRegion(); + let verify = ro.Find(login_verification.template); + ro.dispose(); + await sleep(1000); + if (verify.isExist()) { + notification.error(`${script_mode}触发人机验证,请手动登录。===待切换账号:${settings.username}`); + log.error(`${script_mode}触发人机验证,请手动登录。===待切换账号:${settings.username}`); + } + } + // 换服务器操作 + if (settings.Servers) { + await page.WaitForOcrMatch("开始游戏"); + log.info("正在更换服务器") + await matchImgAndClick(switch_server, "更换服务器"); + let serversMatched = true; + if (settings.Servers == "Asia") { + await matchImgAndClick(asia_server, "亚服"); + } else if (settings.Servers == "Europe") { + await matchImgAndClick(europe_server, "欧服"); + } else if (settings.Servers == "America") { + await matchImgAndClick(america_server, "美服"); + } else if (settings.Servers == "TW,HK,MO") { + await matchImgAndClick(twhkmo_server, "台港澳"); + } else { + log.info("尖尖哇嘎乃") + serversMatched = false; + } + if (serversMatched) { + await matchImgAndClick(confirm_button, "确认换服"); + } + } + await keyPress("VK_ESCAPE"); + await page.WaitForOcrMatch("开始游戏"); + await click(960, 640); + await page.Wait(5000); + log.info('等待提瓦特大门加载'); + await page.WaitForOcrMatch("点击进入"); + await click(960, 640); + // 可能登录账号的时候出现月卡提醒,则先点击一次月卡。 + await genshin.blessingOfTheWelkinMoon(); + await genshin.returnMainUi(); + // 如果配置了通知 + notification.send("账号【" + settings.username + "】切换成功"); + } catch (error) { + log.error(`${script_mode}脚本执行过程中发生错误:${error.message}`); + //如果发生错误,则发送通知 + notification.error(`${script_mode}脚本执行过程中发生错误:${error.message}`); + throw new Error(`${script_mode}脚本执行过程中发生错误:${error.message}`); } finally { keyUp("VK_MENU"); } diff --git a/repo/js/SwitchAccountMultipleMode/manifest.json b/repo/js/SwitchAccountMultipleMode/manifest.json index 6d7e1fdcb..52f510934 100644 --- a/repo/js/SwitchAccountMultipleMode/manifest.json +++ b/repo/js/SwitchAccountMultipleMode/manifest.json @@ -1,9 +1,9 @@ { "manifest_version": 1, "name": "切换账号多模式", - "version": "1.7", + "version": "1.8", "bgi_version": "0.57.0", - "description": "多种模式的切换账号,有下拉列表、填写账号密码OCR操作或键鼠操作,目前支持B服但不完整\n免责申明:所有的账号密码均保存在本地,请使用者妥善保管账号密码,请勿外泄账号密码。若因使用此脚本导致的账号泄露、封禁问题与脚本作者无关。", + "description": "多种模式的切换账号,有下拉列表、填写账号密码OCR操作或键鼠操作,目前支持B服/国际服但不完整\n免责申明:所有的账号密码均保存在本地,请使用者妥善保管账号密码,请勿外泄账号密码。若因使用此脚本导致的账号泄露、封禁问题与脚本作者无关。", "tags": [ "切换账号", "鼠标点击", diff --git a/repo/js/SwitchAccountMultipleMode/settings.json b/repo/js/SwitchAccountMultipleMode/settings.json index 70ba22a33..9b3b51592 100644 --- a/repo/js/SwitchAccountMultipleMode/settings.json +++ b/repo/js/SwitchAccountMultipleMode/settings.json @@ -5,10 +5,11 @@ "label": "切换模式", "options": [ "下拉列表", - "账号+密码", + "账号+密码+键鼠", "账号+密码+OCR", "B服切换另一个账号纯键鼠", - "B服切换另一个账号匹配+键鼠" + "B服切换另一个账号匹配+键鼠", + "国际服账号+密码+OCR" ], "default": "下拉列表" }, @@ -22,6 +23,18 @@ "type": "input-text", "label": "密码(只保存在本地,请妥善保管)\n切换模式为下拉列表时无需填写" }, + { + "name": "Servers", + "type": "select", + "label": "国际服服务器", + "options": [ + "Asia", + "Europe", + "America", + "TW,HK,MO", + "不切换服务器" + ] + }, { "name": "uid", "type": "input-text", @@ -37,4 +50,4 @@ "否" ] } -] +] \ No newline at end of file