// ==UserScript== // @name 超星学习通小助手 // @namespace xyz_xyz-%e8%b6%85%e6%98%9f%e5%ad%a6%e4%b9%a0%e9%80%9a%e5%b0%8f%e5%8a%a9%e6%89%8b // @version 1.0.2 // @description 主要用于学习通章节视频刷课以及章节测验,为学生减负,测验仅支持单选,多选,判断。脚本完全免费,可能有BUG,勿喷。有问题请到公众号网络喵反馈。 // @author xyz_xyz // @grant GM_setValue // @grant GM_getValue // @grant GM_xmlhttpRequest // @connect 8.138.189.217 // @require https://html2canvas.hertzen.com/dist/html2canvas.min.js // @match https://mooc1.chaoxing.com/mycourse/studentstudy* // @original-license 非作者同意禁止引用和二次开发 // @icon data:image/png;base64,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0p8zAAA/cWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMTQgNzkuMTUxNDgxLCAyMDEzLzAzLzEzLTEyOjA5OjE1ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAxNy0xMS0wOVQxNjo1MToxNSswODowMDwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTctMTEtMDlUMTY6NTc6MDQrMDg6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE3LTExLTA5VDE2OjU3OjA0KzA4OjAwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9wbmc8L2RjOmZvcm1hdD4KICAgICAgICAgPHhtcE1NOkluc3RhbmNlSUQ+eG1wLmlpZDo5ZWEzZjVhOS05YzFjLWM2NGEtYWVlYy0yNDQ0NmU3NTBkZTI8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6NGNlMmRjYTctY2YwMC01OTQ2LThiMDMtNzE1YTA2MGYxM2Y4PC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6NGNlMmRjYTctY2YwMC01OTQ2LThiMDMtNzE1YTA2MGYxM2Y4PC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjRjZTJkY2E3LWNmMDAtNTk0Ni04YjAzLTcxNWEwNjBmMTNmODwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNy0xMS0wOVQxNjo1MToxNSswODowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6NmYyNTNhNzEtNDYwMy04ZjQ1LWEyYTAtMTU1M2Y4MWMwMGI5PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE3LTExLTA5VDE2OjU3OjA0KzA4OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y29udmVydGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpwYXJhbWV0ZXJzPmZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5kZXJpdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpwYXJhbWV0ZXJzPmNvbnZlcnRlZCBmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nPC9zdEV2dDpwYXJhbWV0ZXJzPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo5ZWEzZjVhOS05YzFjLWM2NGEtYWVlYy0yNDQ0NmU3NTBkZTI8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTctMTEtMDlUMTY6NTc6MDQrMDg6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHhtcE1NOkRlcml2ZWRGcm9tIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgPHN0UmVmOmluc3RhbmNlSUQ+eG1wLmlpZDo2ZjI1M2E3MS00NjAzLThmNDUtYTJhMC0xNTUzZjgxYzAwYjk8L3N0UmVmOmluc3RhbmNlSUQ+CiAgICAgICAgICAgIDxzdFJlZjpkb2N1bWVudElEPnhtcC5kaWQ6NGNlMmRjYTctY2YwMC01OTQ2LThiMDMtNzE1YTA2MGYxM2Y4PC9zdFJlZjpkb2N1bWVudElEPgogICAgICAgICAgICA8c3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6NGNlMmRjYTctY2YwMC01OTQ2LThiMDMtNzE1YTA2MGYxM2Y4PC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjEzNTwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4xMzU8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg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 // ==/UserScript== (function () { 'use strict'; const BACKEND_URL = 'http://8.138.189.217:31415'; let cardsIframe = document.querySelector('iframe#iframe'); let cardsIframeDocument; async function init() { try { await waitForElement('iframe#iframe', 5000); cardsIframe = document.querySelector('iframe#iframe'); cardsIframeDocument = cardsIframe.contentDocument || cardsIframe.contentWindow.document; if (!cardsIframeDocument) { log("无法获取iframe文档,1秒后重试..."); setTimeout(init, 1000); return; } await xxtCards(); } catch (error) { log(`初始化失败: ${error.message}`); setTimeout(init, 3000); } } async function xxtCards() { try { cardsIframe = document.querySelector('iframe#iframe'); if (!cardsIframe) { log("未找到主iframe,退出流程"); return; } cardsIframeDocument = cardsIframe.contentDocument || cardsIframe.contentWindow.document; if (!cardsIframeDocument) { log("无法获取主iframe文档,退出流程"); return; } await initUI(); await new Promise(resolve => { const checkIframes = () => { const iframes = cardsIframeDocument.querySelectorAll('iframe'); if (iframes.length > 0) { resolve(); } else { setTimeout(checkIframes, 500); } }; checkIframes(); }); const cardIframes = cardsIframeDocument.querySelectorAll('iframe'); if (!cardIframes || cardIframes.length < 1) { log("未找到任务点iframe,准备换页"); await handlePageNavigation(); return; } for (const iframe of cardIframes) { try { const cardIframedoc = await getIframeDocument(iframe); if (!cardIframedoc) continue; if (iframe.src.includes('work')) { log("发现作业iframe,开始处理"); await xxtWork(cardIframedoc); } else if (iframe.src.includes('video')) { log("发现视频iframe,开始处理"); await xxtVideo(cardIframedoc); } else { log("暂不支持该类型的任务点"); } } catch (error) { log(`处理iframe时出错: ${error.message},继续处理下一个`); } } await handlePageNavigation(); } catch (error) { log(`主流程出错: ${error.message}`); } } async function handlePageNavigation() { try { log("准备进行页面导航"); const nextChapter = document.querySelector(`a.nextChapter`); if (nextChapter) { log("等待5秒后执行换页操作"); await delay(1000); nextChapter.click(); log("换页操作已执行"); } else { log("未找到导航元素,无法换页"); } } catch (error) { log(`换页处理出错: ${error.message}`); } await delay(3000); init(); } async function initUI() { try { log('初始化脚本,寻找ans-cc区块...'); const targetDiv = await waitForElement('div.ans-cc', 10000, cardsIframeDocument); if (targetDiv) { log('找到ans-cc区块,创建配置UI...'); createAndInsertUI(targetDiv); loadSavedSettings(); return true; } else { log('超时未找到ans-cc区块'); return false; } } catch (error) { log(`UI初始化出错: ${error.message}`); return false; } } function createAndInsertUI(container) { const configPanel = document.createElement('div'); configPanel.style.cssText = ` padding: 15px; background: #f5f5f5; border-radius: 8px; margin-bottom: 15px; border: 1px solid #e0e0e0; `; configPanel.innerHTML = `
公众号网络喵

说明

关注公众号网络喵,获取ai免费题库token。

配置设置

操作日志

`; container.insertBefore(configPanel, container.firstChild); bindEvents(); log('配置UI创建完成'); } function bindEvents() { cardsIframeDocument.getElementById('saveBtn').addEventListener('click', saveSettings); cardsIframeDocument.getElementById('verifyBtn').addEventListener('click', verifyCurrentToken); } function loadSavedSettings() { log('加载保存的设置...'); const savedToken = GM_getValue('work_token', ''); const savedSpeed = GM_getValue('video_speed', '1'); cardsIframeDocument.getElementById('tokenInput').value = savedToken; cardsIframeDocument.getElementById('speedSelect').value = savedSpeed; log('设置加载完成'); } function saveSettings() { const token = cardsIframeDocument.getElementById('tokenInput').value; const speed = cardsIframeDocument.getElementById('speedSelect').value; GM_setValue('work_token', token); GM_setValue('video_speed', speed); showMessage('设置已保存', 'green'); log('设置已保存到本地存储'); } async function verifyCurrentToken() { try { const token = cardsIframeDocument.getElementById('tokenInput').value; if (!token) { showMessage('请输入Token', 'red'); log('验证失败:未输入Token'); return; } showMessage('验证中...', 'blue'); log('开始验证Token...'); const valid = await verifyToken(token); if (valid) { showMessage('Token验证成功', 'green'); saveSettings(); log('Token验证成功'); } else { showMessage('Token验证失败', 'red'); log('Token验证失败'); } } catch (error) { log(`Token验证出错: ${error.message}`); showMessage('验证过程出错', 'red'); } } function showMessage(text, color) { const messageEl = cardsIframeDocument.getElementById('message'); if (messageEl) { messageEl.textContent = text; messageEl.style.color = color; setTimeout(() => { messageEl.textContent = ''; }, 3000); } } function log(message) { if (!cardsIframeDocument) return; const logArea = cardsIframeDocument.getElementById('logArea'); if (!logArea) return; const now = new Date(); const timeString = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}:${now.getSeconds().toString().padStart(2, '0')}`; const logEntry = document.createElement('div'); logEntry.style.cssText = 'margin: 3px 0; border-bottom: 1px solid #f0f0f0; padding-bottom: 2px;'; logEntry.innerHTML = `[${timeString}] ${message}`; logArea.appendChild(logEntry); logArea.scrollTop = logArea.scrollHeight; } function verifyToken(token) { return new Promise((resolve) => { GM_xmlhttpRequest({ method: "POST", url: `${BACKEND_URL}/api/verify-token`, data: JSON.stringify({ token }), headers: { "Content-Type": "application/json" }, onload: (res) => { try { const data = JSON.parse(res.responseText); log(`Token验证响应: ${data.msg}`); resolve(data.code === 200); } catch (e) { log(`Token验证解析错误: ${e.message}`); resolve(false); } }, onerror: (err) => { log(`Token验证请求错误: ${err.message || '未知错误'}`); resolve(false); } }); }); } function xxtVideo(vedioDoc) { return new Promise((resolve) => { (async () => { try { log("开始处理视频..."); const video = await waitForElement('video', 10000, vedioDoc); if (!video) { log("未找到视频元素,结束视频处理"); resolve(); return; } if (video.ended) { log("视频已播放完成"); resolve(); return; } log(`找到视频元素,开始自动播放处理...`); let playbackRate = parseFloat(GM_getValue('video_speed', '1.0')); video.playbackRate = playbackRate; video.autoplay = true; video.muted = true; async function forcePlay() { if (video.paused && !video.ended) { try { await video.play(); log(`视频已恢复播放,播放速度: ${playbackRate}x`); } catch (error) { log(`视频播放失败: ${error.message},1秒后重试`); if (!video.ended) { await delay(1000); await forcePlay(); } } } } await forcePlay(); video.addEventListener('timeupdate', () => { const newSpeed = parseFloat(GM_getValue('video_speed', '1.0')); if (newSpeed !== playbackRate) { playbackRate = newSpeed; video.playbackRate = playbackRate; log(`视频速度已调整为: ${playbackRate}x`); } const currentTime = video.currentTime; const duration = video.duration; const progressValue = (currentTime / duration) * 100; console.log(`${playbackRate}X,${progressValue.toFixed(1)}%`); }); video.addEventListener('pause', async () => { if (!video.ended) { log(`检测到视频被暂停,正在恢复播放...`); await forcePlay(); } }); await new Promise(resolveVideo => { const checkEnded = () => { if (video.ended) { log(`视频播放完成`); resolveVideo(); } else { setTimeout(checkEnded, 1000); } }; checkEnded(); }); resolve(); } catch (error) { log(`视频处理出错: ${error.message}`); resolve(); } })(); }); } async function xxtWork(Doc) { try { log("开始处理作业..."); const workIframe = await waitForElement('iframe#frame_content', 10000, Doc); if (!workIframe) { log("未找到作业内容iframe"); return; } const workIframedoc = await getIframeDocument(workIframe); if (!workIframedoc) { log("无法获取作业iframe文档"); return; } const secretStyleInHead = workIframedoc.head.querySelector('#cxSecretStyle'); if (secretStyleInHead) { const cssContent = secretStyleInHead.textContent; let style = document.head.querySelector('#cxSecretStyle'); if (!style) { style = document.createElement('style'); style.id = 'cxSecretStyle'; document.head.appendChild(style); } style.textContent = cssContent; log("已处理字体样式"); } await initWork(workIframedoc); } catch (error) { log(`作业处理出错: ${error.message}`); } } async function initWork(workDoc) { function captureQuestion(questionEl) { return new Promise((resolve) => { const clone = questionEl.cloneNode(true); clone.style.position = "fixed"; clone.style.top = "0"; clone.style.left = "-9999px"; workDoc.body.appendChild(clone); html2canvas(clone, { useCORS: true, allowTaint: false }).then(canvas => { const base64 = canvas.toDataURL("image/png").replace("data:image/png;base64,", ""); workDoc.body.removeChild(clone); resolve(base64); }).catch(error => { log(`截图失败: ${error.message}`); workDoc.body.removeChild(clone); resolve(null); }); }); } function getAnswer(token, questionInfo) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "POST", url: `${BACKEND_URL}/api/get-answer`, data: JSON.stringify({ token, question_type: questionInfo.type, question_image: questionInfo.image }), headers: { "Content-Type": "application/json" }, onload: (res) => { try { const data = JSON.parse(res.responseText); if (data.code === 200) { resolve(data.answer); } else { reject(new Error(data.msg)); } } catch (error) { reject(new Error(`解析答案失败: ${error.message}`)); } }, onerror: () => reject(new Error("后端请求失败")) }); }); } function selectAnswer(questionEl, questionType, answer) { const questionId = questionEl.getAttribute("data"); if (!questionId) { throw new Error("未找到题目ID"); } switch (questionType) { case "单选题": { const answerInput = questionEl.querySelector(`input#answer${questionId}`); if (answerInput) { answerInput.value = answer; log(`已选择单选题答案: ${answer}`); } else { throw new Error(`未找到单选题输入框: answer${questionId}`); } break; } case "多选题": { const answerInput = questionEl.querySelector(`input#answer${questionId}`); if (answerInput) { answerInput.value = answer.join(""); log(`已选择多选题答案: ${answer.join("")}`); } else { throw new Error(`未找到多选题输入框: answer${questionId}`); } break; } case "判断题": { const answerInput = questionEl.querySelector(`input#answer${questionId}`); if (answerInput) { answerInput.value = answer; log(`已选择判断题答案: ${answer}`); } else { throw new Error(`未找到判断题输入框: answer${questionId}`); } break; } default: throw new Error(`不支持的题目类型: ${questionType}`); } } async function processAllQuestions(token) { const DividerBox = workDoc.querySelector("div.DividerBox"); if (DividerBox) { log("题目已完成,无需重复处理"); return; } const questions = await waitForElement('div.singleQuesId', 10000, workDoc, true); if (!questions || questions.length === 0) { log("未找到题目"); return; } log(`发现 ${questions.length} 道题目,开始逐一处理`); for (let i = 0; i < questions.length; i++) { const questionEl = questions[i]; const questionIndex = i + 1; try { log(`------ 开始处理第 ${questionIndex}/${questions.length} 题 ------`); showMessage(`处理第 ${questionIndex}/${questions.length} 题`, `blue`); const questionId = questionEl.getAttribute("data"); if (!questionId) { log(`第 ${questionIndex} 题未找到ID,跳过`); continue; } const answerTypeInput = questionEl.querySelector(`span.newZy_TItle`); if (!answerTypeInput) { log(`第 ${questionIndex} 题未找到题型,跳过`); continue; } let typeText = answerTypeInput.textContent.substring(1, answerTypeInput.textContent.length - 1); if (!['单选题', '多选题', '判断题'].includes(typeText)) { log(`第 ${questionIndex} 题为 ${typeText},暂不支持,跳过`); continue; } const answerInput = questionEl.querySelector(`input#answer${questionId}`); if (answerInput && answerInput.getAttribute("value")) { log(`第 ${questionIndex} 题已作答,跳过`); continue; } log(`正在截图第 ${questionIndex} 题`); const base64Image = await captureQuestion(questionEl); if (!base64Image) { log(`第 ${questionIndex} 题截图失败,跳过`); continue; } const questionInfo = { type: typeText, image: base64Image }; log(`题目类型: ${questionInfo.type}`); log(`正在请求第 ${questionIndex} 题答案`); const answer = await getAnswer(token, questionInfo); if (!answer) { log(`未获取到第 ${questionIndex} 题答案,跳过`); continue; } log(`获取到答案: ${JSON.stringify(answer)}`); selectAnswer(questionEl, questionInfo.type, answer); log(`第 ${questionIndex} 题答题完成`); await delay(1000); } catch (err) { log(`第 ${questionIndex} 题处理失败: ${err.message},继续处理下一题`); } } await saveAndSubmitAnswers(workDoc); } async function saveAndSubmitAnswers(workDoc) { try { log("准备保存答案"); const tempsave = await waitForElement(`span#tempsave`, 5000, workDoc); if (tempsave) { tempsave.click(); log("已点击保存按钮"); let btnSubmit = await waitForElement(`.btnSubmit`, 5000, workDoc); let popok = await waitForElement(`#popok`, 5000); if (popok && btnSubmit) { log("已点击确认按钮"); btnSubmit.click(); await delay(2000); popok.click(); } else { log("未找到确认按钮"); } await delay(1000); } else { log("未找到保存按钮"); } } catch (error) { log(`保存答案出错: ${error.message}`); } } const token = GM_getValue('work_token', ''); if (!token) { log("未设置Token,无法处理作业"); showMessage("请先设置并验证Token", "red"); return; } await delay(2000); await processAllQuestions(token); } function waitForElement(selector, timeout = 5000, doc = document, returnAll = false) { return new Promise((resolve) => { const start = Date.now(); const checkInterval = 200; const checkElement = () => { const elements = returnAll ? doc.querySelectorAll(selector) : doc.querySelector(selector); if ((!returnAll && elements) || (returnAll && elements.length > 0)) { resolve(elements); return; } if (Date.now() - start > timeout) { resolve(returnAll ? [] : null); return; } setTimeout(checkElement, checkInterval); }; checkElement(); }); } function getIframeDocument(iframe) { return new Promise((resolve) => { const checkDocument = () => { const doc = iframe.contentDocument || iframe.contentWindow.document; if (doc && doc.readyState === 'complete') { resolve(doc); } else { setTimeout(checkDocument, 200); } }; iframe.onload = checkDocument; checkDocument(); }); } function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } setTimeout(init, 5000); })();