commit 52e423de618f42efdab9290d4e5a73d96455f1da Author: rainerosion Date: Sat Jan 15 14:11:26 2022 +0800 使用光遇徽章autojs脚本 diff --git a/README.md b/README.md new file mode 100644 index 0000000..fa1f1c2 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# [auto.js]光遇徽章使用脚本 + +## 初衷 + +写本脚本的初衷是为了方便使用徽章,不用携带徽章也能随时使用徽章带来的魔法。 +实际上光遇NTAG徽章设计,感应区为徽章背面的小圆点部分,而这部分感应区太小且徽章的针扣也在这一面,且手机nfc感应区位置问题导致徽章无法放平使用,也无法从背面扫描徽章,经常导致扫描无反应或者需要将徽章在手机nfc感应区移动很久才有反应。 + +## 当前功能 + +- 首先你需要有光遇实体徽章 + +- 目前只支持网易官方服 + +- 录入多个徽章信息 + +- 选择对应徽章使用 + +## 注意事项 + +- 使用本脚本后如果使用实体徽章后需要重新录入徽章信息,原有的徽章信息会失效。 + +- 使用本脚本后也可能造成你的徽章失效,需要在NFC下多刷几次,手机有反应即可,无需打开app + +# 相关问题 + +> 为什么实体徽章会有几次无法使用? + +光遇的NTAG徽章中使用了NFC COUNTER(nfc计数器),每次徽章在nfc下使用徽章使用次次数加会加1(无论你是否打开光遇)。当你打开光遇app时,徽章使用次数会上传到光遇服务器,下一次使用时候会校验使用次数,小于上一次的使用次数时候会抛出异常(徽章验证错误:CANNOT_UPDATE_NFC_COUNTER)。 +举个例子:如果你现在的徽章在光遇使用了10次,此时你将徽章信息录入本脚本,本脚本记录的使用次数也是10次。当你再次使用实体徽章时候此时徽章使用次数为11次。脚本中的使用次数依旧为10,打开光遇后就会报错徽章验证错误。当然如果你使用本脚本时次数为20次(使用次数可以手动修改NTAG中url的最后6位16进制数),而你实体徽章次数为15次,相差了5次,此时你需要使用实体徽章在nfc下刷5次后方可使用。 + +> 执行脚本打开光遇报错 徽章验证错误:CANNOT_UPDATE_NFC_COUNTER + +重新录入最新的徽章信息 + +> 使用脚本后使用实体徽章报错 徽章验证错误:CANNOT_UPDATE_NFC_COUNTER +多在NFC下刷几次徽章(无需打开光遇app,手机有反应即可)更新徽章使用次数。 diff --git a/sky.js b/sky.js new file mode 100644 index 0000000..5811db4 --- /dev/null +++ b/sky.js @@ -0,0 +1,102 @@ +"auto" +// console.show(); +var storage = storages.create("com.netease.sky:badge"); +// storage.clear(); +var global_option = { "[O]录入徽章": "add", "[O]清空徽章": "clear", "[O]删除徽章": "delete" } +if (!storage.contains("menu")) { + storage.put("menu", global_option); +} +startSky(); + +/** + * 打开app + */ +function startApp(url) { + var packageName = 'com.netease.sky'; + var className = 'com.tgc.sky.netease.GameActivity_Netease'; + app.startActivity({ + action: "android.nfc.action.NDEF_DISCOVERED", + category: "android.intent.category.DEFAULT", + data: url, + type: "https", + packageName: packageName, + className: className + }); +} + +function startSky() { + var menu_map = storage.get("menu"); + var options = Object.keys(menu_map).map(function (data) { + return data; + }) + var i = dialogs.select("请选择一个选项", options); + if (i >= 0) { + console.log(options[i]); + var value = menu_map[options[i]]; + if (value.length > 0) { + switch (value) { + case "add": + toast("添加徽章"); + var name = rawInput("输入徽章名称").trim(); + var url = rawInput('输入徽章链接').trim(); + var isBadge = /^https:\/\/sky.thatg.co\/\?s=[\S]+$/.test(url); + if (name.length > 0 && isBadge) { + // 录入信息 + name = "[徽章]" + name; + menu_map[name] = url; + storage.put("menu", menu_map); + toast("徽章录入成功"); + // 再次打开菜单 + startSky(); + } else { + toast("徽章链接格式不正确!"); + // 再次打开菜单 + startSky(); + } + break; + case "clear": + var choice = dialogs.confirm("确定要清空所有徽章信息?"); + if (choice) { + storage.put("menu", global_option); + } + startSky(); + break; + case "delete": + var len = Object.keys(menu_map).length + if (len > 3) { + delete_options = []; + Object.keys(menu_map).map(function (key, index) { + console.log("key => " + key, "index => " + index); + if (!isOptions(key, menu_map)) { + delete_options.push(key); + } + }); + var delete_index = dialogs.select("请选择需要删除的徽章", delete_options); + console.log(delete_options[delete_index]); + // 删除指定 + delete menu_map[delete_options[delete_index]]; + storage.put("menu", menu_map); + startSky(); + } else { + toast("你没有录入任何徽章信息"); + // 再次打开菜单 + startSky(); + } + break; + default: + // 启动app + console.log(value); + startApp(value); + } + } + } else { + toast("您取消了选择"); + } +} + +function isOptions(key, menu) { + if (menu[key] == "add" || menu[key] == "delete" || menu[key] == "clear") { + return true; + } + return false; +} \ No newline at end of file