优学院自动静音播放、自动做练习题、自动翻页、修改播放速率(改)

自动静音播放每页视频、自动作答、修改播放速率!

  1. // ==UserScript==
  2. // @name 优学院自动静音播放、自动做练习题、自动翻页、修改播放速率(改)
  3. // @namespace [url=mailto:moriartylimitter@outlook.com]moriartylimitter@outlook.com[/url]
  4. // @version 1.6.9
  5. // @description 自动静音播放每页视频、自动作答、修改播放速率!
  6. // @author EliotZhang、Brush-JIM
  7. // @match *://*.ulearning.cn/learnCourse/*
  8. // @require https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js
  9. // @require https://cdn.bootcdn.net/ajax/libs/jqueryui/1.12.1/jquery-ui.js
  10. // @run-at document-start
  11. // @grant unsafeWindow
  12. // ==/UserScript==
  13.  
  14. (function () {
  15. 'use strict';
  16. /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  17. * 优学院自动静音播放、自动做练习题、自动翻页、修改播放速率脚本v1.6.3由BrushJIM @ 2020/09/13 最后更新
  18. * 特别感谢Brush-JIM (Mail:Brush-JIM@protonmail.com) 提供的脚本改进支持!
  19. * 使用修改播放速率功能请谨慎!!!产生的不良后果恕某概不承担!!!
  20. * 请保持网课播放页面在浏览器中活动,避免长时间后台挂机(平台有挂机检测功能),以减少不必要的损失
  21. * 自动作答功能由于精力有限目前只支持单/多项选择、判断题、部分填空问答题,如果出现问题请尝试禁用这个功能!
  22. * 如果脚本无效请优先尝试刷新页面,若是无效请查看脚本最后的解决方案,如果还是不行请反馈给本人,本人将会尽快修复
  23. * 如果是因为网络问题,本人也无能为力
  24. * 如果在使用中还有什么问题请通过邮箱联系EliotZhang:moriartylimitter@outlook.com
  25. * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  26. */
  27.  
  28. var N = 1.50;
  29. var EnableAutoPlay = true;
  30. var EnableAutoMute = true;
  31. var EnableAutoChangeRate = true;
  32. var EnableAutoFillAnswer = true;
  33. var EnableAutoShowAnswer = true;
  34. var EnableAutoAnswerChoices = true;
  35. var EnableAutoAnswerJudges = true;
  36. var EnableAutoAnswerFills = true;
  37.  
  38. function Video(slept = false) {
  39. if (!EnableAutoPlay) {
  40. return;
  41. }
  42. if (autoAnswering) {
  43. setTimeout(function () {
  44. Video(true);
  45. }, '1000');
  46. return;
  47. }
  48. if (!slept) {
  49. setTimeout(function () {
  50. Video(true);
  51. }, '3000');
  52. return;
  53. }
  54. var videos = $('mediaelementwrapper video:first-child');
  55. var videos_status = $('.video-bottom span:first-child');
  56. if (videos.length === 0) {
  57. GotoNextPage();
  58. return;
  59. }
  60. var v_s = [];
  61. if (videos.length === videos_status.length) {
  62. $(videos).each(function (index, value) {
  63. let state = $(videos_status[index]).attr('data-bind');
  64. if (state === 'text: $root.i18nMessageText().finished') {
  65. v_s.push({
  66. 'ele': value,
  67. 'status': true,
  68. 'seek': 0
  69. });
  70. } else if (state === 'text: $root.i18nMessageText().viewed' || state === 'text: $root.i18nMessageText().unviewed') {
  71. v_s.push({
  72. 'ele': value,
  73. 'status': false,
  74. 'seek': 0
  75. });
  76. } else {
  77. v_s.push({
  78. 'ele': value,
  79. 'status': null,
  80. 'seek': 0
  81. });
  82. }
  83. })
  84. } else {
  85. GotoNextPage();
  86. return;
  87. }
  88. $(v_s).each(function (index, value) {
  89. value['ele'].addEventListener("ended", function () {
  90. v_s[index]['status'] = true;
  91. }, true);
  92. })
  93. VideoCtrl(v_s);
  94. }
  95.  
  96. function VideoCtrl(v_s){
  97. if (v_s.length !== $('mediaelementwrapper video:first-child').length){
  98. Video();
  99. return;
  100. }
  101. for(let z = 0; z < v_s.length; z++){
  102. if(v_s[z].ele !== $('mediaelementwrapper video:first-child')[z]){
  103. Video();
  104. return;
  105. }
  106. let edit_video = undefined;
  107. if(v_s[z].status === false){
  108. edit_video = (z !== 0 && v_s[z - 1].status === false)? v_s[z - 1]: v_s[z];
  109. if(edit_video.ele.paused === true || v_s[z].seek === edit_video.ele.currentTime){
  110. edit_video.ele.currentTime = edit_video.ele.currentTime - 3;
  111. edit_video.ele.play();
  112. }
  113. edit_video.seek = edit_video.ele.currentTime;
  114. if(EnableAutoMute && edit_video.ele.muted === false){
  115. edit_video.ele.muted = true;
  116. }
  117. if(EnableAutoChangeRate && edit_video.ele.playbackRate != N){
  118. edit_video.ele.playbackRate = N;
  119. }
  120. setTimeout(VideoCtrl, 500, v_s);
  121. return;
  122. }
  123. }
  124. GotoNextPage();
  125. }
  126.  
  127. function GotoNextPage() {
  128. if (autoAnswering || !EnableAutoPlay || checkingModal)
  129. return;
  130. var nextPageBtn = $('.mobile-next-page-btn');
  131. if (nextPageBtn.length === 0)
  132. return;
  133. nextPageBtn.each((k, n) => {
  134. n.click();
  135. });
  136. setTimeout(Video, "1000");
  137. }
  138.  
  139. function CheckModal(slept = false) {
  140. if (autoAnswering)
  141. return;
  142. if (!slept) {
  143. setTimeout(function () {
  144. CheckModal(true);
  145. }, '2000');
  146. return;
  147. }
  148. if (EnableAutoPlay) {
  149. CheckModal();
  150. }
  151. checkingModal = true;
  152. var qw = $('.question-wrapper');
  153. if (qw.length > 0 && EnableAutoFillAnswer) {
  154. ShowAndFillAnswer();
  155. checkingModal = false;
  156. return;
  157. }
  158. var statModal = $('#statModal');
  159. if (statModal.length > 0) {
  160. var ch = statModal[0];
  161. ch.getElementsByTagName('button');
  162. if (ch.length >= 2)
  163. ch[1].click();
  164. }
  165. var err = $('.mobile-video-error');
  166. if (err && err.css('display') != 'none')
  167. $('.try-again').click();
  168. var alertModal = document.getElementById("alertModal");
  169. if (alertModal === undefined) {
  170. checkingModal = false;
  171. return;
  172. }
  173. if (alertModal.className.match(/\sin/)) {
  174. var op = $('.modal-operation').children();
  175. if (op.length >= 2)
  176. op[EnableAutoFillAnswer ? 0 : 1].click();
  177. else {
  178. var continueBtn = $('.btn-submit');
  179. if (continueBtn.length > 0) {
  180. continueBtn.each((k, v) => {
  181. if ($(v).text() != '提交')
  182. $(v).click();
  183. });
  184. }
  185. }
  186. if (EnableAutoFillAnswer)
  187. ShowAndFillAnswer();
  188. }
  189. checkingModal = false;
  190. }
  191.  
  192. function RemoveDuplicatedItem(arr) {
  193. for (var i = 0; i < arr.length - 1; i++) {
  194. for (var j = i + 1; j < arr.length; j++) {
  195. if (arr[i] == arr[j]) {
  196. arr.splice(j, 1);
  197. j--;
  198. }
  199. }
  200. }
  201. return arr;
  202. }
  203.  
  204. function Escape2Html(str) {
  205. var arrEntities = {
  206. 'lt': '<',
  207. 'gt': '>',
  208. 'nbsp': ' ',
  209. 'amp': '&',
  210. 'quot': '"'
  211. };
  212. return str.replace(/&(lt|gt|nbsp|amp|quot);/ig, function (all, t) {
  213. return arrEntities[t];
  214. });
  215. }
  216.  
  217. function DelHtmlTag(str) {
  218. return str.replace(/(<[^>]+>|\\n|\\r)/g, " ");
  219. }
  220.  
  221. function FillAnswers() {
  222. if (!autoAnswering || !EnableAutoAnswerFills)
  223. return;
  224. var ansarr = [];
  225. var idList = [];
  226. var re = [];
  227. var txtAreas = $('textarea, .blank-input');
  228. $(txtAreas).each((k, v) => {
  229. var reg = /question\d+/;
  230. var fa = $(v).parent();
  231. while (!reg.test($(fa).attr('id'))) {
  232. fa = $(fa).parent();
  233. }
  234. var id = $(fa).attr('id').replace('question', '');
  235. idList.push(id);
  236. });
  237. idList = RemoveDuplicatedItem(idList);
  238. $(idList).each((k, id) => {
  239. $.ajax({
  240. url: 'https://api.ulearning.cn/questionAnswer/' + id,
  241. type: "GET",
  242. contentType: "application/json",
  243. dataType: 'json',
  244. async: false,
  245. data: {
  246. parentId: pageid,
  247. },
  248. success: function (result, status, xhr) {
  249. re.push(result.correctAnswerList);
  250. }
  251. });
  252. });
  253.  
  254. $(re).each((k1, v1) => {
  255. if (v1.length == 1) {
  256. ansarr.push(DelHtmlTag(Escape2Html(v1[0])));
  257. } else {
  258. $(v1).each(function (k2, v2) {
  259. ansarr.push(DelHtmlTag(Escape2Html(v2)));
  260. });
  261. }
  262. });
  263. $(txtAreas).each((k, v) => {
  264. $(v).val(ansarr.shift());
  265. });
  266. }
  267.  
  268. function ShowAndFillAnswer() {
  269. if (autoAnswering | !EnableAutoFillAnswer)
  270. return;
  271. autoAnswering = true;
  272. var sqList = [];
  273. var qw = $('.question-wrapper');
  274. var pages = $('.page-item');
  275. var an = [];
  276. qw.each(function (k, v) {
  277. var id = $(v).attr('id');
  278. sqList.push(id.replace('question', ''));
  279. });
  280. var flag = false;
  281. pages.each(function (k, v) {
  282. if (flag) return;
  283. var sp = $(v).find('.page-name');
  284. if (sp.length > 0 && sp[0].className.search('active') >= 0) {
  285. var pd = $(v).attr('id');
  286. pd = pd.slice(pd.search(/\d/g));
  287. pageid = pd;
  288. flag = true;
  289. }
  290. });
  291. if (!flag) {
  292. autoAnswering = false;
  293. GotoNextPage();
  294. return;
  295. }
  296. if (sqList.length <= 0) {
  297. autoAnswering = false;
  298. return;
  299. }
  300. $(sqList).each(function (k, id) {
  301. var flag = false;
  302. while (!flag)
  303. $.ajax({
  304. url: 'https://api.ulearning.cn/questionAnswer/' + id,
  305. type: "GET",
  306. contentType: "application/json",
  307. dataType: 'json',
  308. async: false,
  309. data: {
  310. parentId: pageid,
  311. },
  312. success: function (result, status, xhr) {
  313. an.push(result.correctAnswerList);
  314. flag = true;
  315. }
  316. });
  317. });
  318. //
  319. if (EnableAutoShowAnswer) {
  320. var t = qw.find('.question-title-html');
  321. t.each(function (k, v) {
  322. var ans = an.shift();
  323. $(v).after('<span style="color:red;">答案:' + ans + '</span>');
  324. an.push(ans);
  325. });
  326. }
  327. //
  328. var checkBox = qw.find('.checkbox');
  329. var choiceBox = qw.find('.choice-btn');
  330. var checkList = [];
  331. var choiceList = [];
  332. let lasOffsetP = '';
  333. checkBox.each((k, cb) => {
  334. if (lasOffsetP == $(cb).offsetParent().attr('id')) {
  335. checkList[checkList.length - 1].push(cb);
  336. } else {
  337. var l = [];
  338. l.push(cb);
  339. checkList.push(l);
  340. lasOffsetP = $(cb).offsetParent().attr('id');
  341. }
  342. });
  343. lasOffsetP = '';
  344. choiceBox.each((k, cb) => {
  345. if (lasOffsetP == $(cb).offsetParent().attr('id')) {
  346. choiceList[choiceList.length - 1].push(cb);
  347. } else {
  348. var l = [];
  349. l.push(cb);
  350. choiceList.push(l);
  351. lasOffsetP = $(cb).offsetParent().attr('id');
  352. }
  353. });
  354. an.forEach(a => {
  355. if (a == null || a == undefined || a.length <= 0) {
  356. return;
  357. }
  358. if (a[0].match(/[A-Z]/) && a[0].length == 1 && EnableAutoAnswerChoices) {
  359. var cb = checkList.shift();
  360. a.forEach(aa => {
  361. var cccb = $(cb[aa.charCodeAt() - 65]);
  362. if (cccb[0] === undefined || (cccb[0] != undefined && cccb[0].className.search('selected') < 0))
  363. cccb.click();
  364. });
  365. } else if (a[0].match(/(([tT][rR][uU][eE])|([fF][aA][lL][sS][eE]))/) && EnableAutoAnswerJudges) {
  366. var ccb = choiceList.shift();
  367. a.forEach(aa => {
  368. if (aa.match(/([tT][rR][uU][eE])/))
  369. ccb[0].click();
  370. else
  371. ccb[1].click();
  372. });
  373. }
  374. return;
  375.  
  376. });
  377. if (EnableAutoAnswerFills) {
  378. FillAnswers();
  379. $.globalEval("$('textarea, .blank-input').trigger('change')");
  380. }
  381. if (EnableAutoPlay) {
  382. $('textarea, .blank-input').trigger('change');
  383. $('.btn-submit').click();
  384. var A_tmp = $('video');
  385. var A = [];
  386. for (let d = 0; d < A_tmp.length; d++) {
  387. if (A_tmp[d].src != "") {
  388. A.push(A_tmp[d]);
  389. }
  390. }
  391. if (A.length === 0) {
  392. autoAnswering = false;
  393. GotoNextPage();
  394. return;
  395. }
  396. }
  397. autoAnswering = false;
  398. }
  399.  
  400. function LoadStyle(url) {
  401. // var link = document.createElement('link');
  402. var link = document.createElement("style");
  403. // link.type = 'text/css';
  404. // link.rel = 'stylesheet';
  405. // link.href = url;
  406. link.innerText = ".OptionPanel{position:absolute;width:370px;opacity:60%;top:10px;right:10px;z-index:9999}.OptionPanel:hover{opacity:90%}.DragBall{position:absolute;width:60px;height:60px;top:10px;right:10px;opacity:60%;border-radius:50%;text-align:center;font-size:40px;color:white;background:aqua no-repeat fixed center}.DragBall:hover{opacity:90%}.MainPanel{background-color:aquamarine;border-radius:5px;padding-left:5px;padding-right:5px}.OptionMainTitle{text-align:center}.OptionMainSep{text-align:center;line-height:5px}#MainBtn,#SaveOpBtn{width:360px;height:30px;background-color:rgba(0,0,0,0.3);color:hotpink;font-size:20px}.OptionUL li{position:relative;list-style:none}.OptionInput{position:absolute;right:25px}";
  407. var head = document.getElementsByTagName('head')[0];
  408. head.appendChild(link);
  409. }
  410.  
  411. function DrawOptionPanel() {
  412. LoadStyle('https://cncache.ml/ulearning.css');
  413. var root = document.getElementsByTagName('body')[0];
  414. var panel = document.createElement('div');
  415. root.appendChild(panel);
  416. panel.setAttribute('class', 'OptionPanel');
  417. panel.innerHTML = "<div class='OptionPanel'><div class='DragBall'>UL</div><div class='MainPanel'><h2 class='OptionMainTitle'>优学院辅助脚本</br>by EliotZhang、BrushJIM</h2><button id='MainBtn'>隐藏设置</button><h4>视频播放</h4><p style='color:hotpink'>由于优学院视频<strong>问题</strong>,可能会出现<strong>无法正常播放</strong>,此时脚本会<strong>后退3秒重新播放</strong>,可能要<strong>重复多次!</strong></p><ul class='OptionUL'><li>自动翻页、播放视频?<input class='OptionInput'id='AutoPlay'type='checkbox'checked='checked'></li><li>自动静音?<input class='OptionInput'id='AutoMute'type='checkbox'checked='checked'></li><li>自动调整速率(依赖自动播放视频功能)?<input class='OptionInput'id='AutoPlayRate'type='checkbox'checked='checked'></li><li>自动的速率速度<input class='OptionInput'id='AutoPlayRateChange'type='number'value='1.50'step='0.25'min='0.25'max='15.00'></li></ul><h4>自动作答</h4><ul class='OptionUL'><li>自动作答(总开关)?<input class='OptionInput'id='AutoAnswer'type='checkbox'checked='checked'></li><li>自动显示答案?<input class='OptionInput'id='AutoShowAnswer'type='checkbox'checked='checked'></li><li>自动作答选择题?<input class='OptionInput'id='AutoAnswerChoices'type='checkbox'checked='checked'></li><li>自动作答判断题?<input class='OptionInput'id='AutoAnswerJudges'type='checkbox'checked='checked'></li><li>自动作答填空、简答题?<input class='OptionInput'id='AutoAnswerFills'type='checkbox'checked='checked'></li></ul><button id='SaveOpBtn'>保存设置并刷新脚本</button><p style='color:hotpink;'>若<strong>关闭自动翻页功能</strong>导致<strong>自动作答系列功能失效</strong>请点击<strong>保存设置并刷新脚本按钮!</strong></p><p style='color:hotpink;'>若关闭自动翻页功能答完题后请<strong>手动提交!!</strong></p></div></div>";
  418. }
  419.  
  420. function Init() {
  421. mainBtn = document.getElementById('MainBtn');
  422. dragBall = $('.DragBall');
  423. saveOpBtn = document.getElementById('SaveOpBtn');
  424. OptionPanel = $('.OptionPanel');
  425. MainPanel = $('.MainPanel');
  426. autoPlayOp = document.getElementById('AutoPlay');
  427. autoMuteOp = document.getElementById('AutoMute');
  428. autoPlayRateOp = document.getElementById('AutoPlayRate');
  429. autoPlayRateChangeOp = document.getElementById('AutoPlayRateChange');
  430. autoAnswerOp = document.getElementById('AutoAnswer');
  431. autoShowAnswerOp = document.getElementById('AutoShowAnswer');
  432. autoAnswerChoicesOp = document.getElementById('AutoAnswerChoices');
  433. autoAnswerJudgesOp = document.getElementById('AutoAnswerJudges');
  434. autoAnswerFillsOp = document.getElementById('AutoAnswerFills');
  435. dragBall.draggable({
  436. containment: ".page-scroller ps ps--theme_default",
  437. start: function (event, ui) {
  438. $(this).addClass('noclick');
  439. }
  440. });
  441. dragBall.hide();
  442. mainBtn.addEventListener('click', function () {
  443. MainPanel.hide();
  444. dragBall.show();
  445. }, true);
  446. dragBall.click(function (e) {
  447. if ($(this).hasClass('noclick')) {
  448. $(this).removeClass('noclick');
  449. } else if (e.target == e.currentTarget) {
  450. MainPanel.show();
  451. $(this).hide();
  452. }
  453. });
  454. autoPlayRateChangeOp.addEventListener('change', function () {
  455. let val = autoPlayRateChangeOp.value;
  456. if (val > 15.0)
  457. autoPlayRateChangeOp.value = 15;
  458. else if (val < 0.25)
  459. autoPlayRateChangeOp.value = 0.25;
  460. }, true);
  461. autoPlayOp.addEventListener('change', function () {
  462. if (autoPlayOp.checked === false)
  463. autoMuteOp.checked = autoPlayRateOp.checked = false;
  464. else
  465. autoMuteOp.checked = autoPlayRateOp.checked = true;
  466. });
  467. autoAnswerOp.addEventListener('change', function () {
  468. if (autoAnswerOp.checked === false)
  469. autoAnswerChoicesOp.checked = autoAnswerJudgesOp.checked = autoAnswerFillsOp.checked = autoShowAnswerOp.checked = false;
  470. else
  471. autoAnswerChoicesOp.checked = autoAnswerJudgesOp.checked = autoAnswerFillsOp.checked = autoShowAnswerOp.checked = true;
  472. });
  473. saveOpBtn.addEventListener('click', function () {
  474. EnableAutoMute = autoMuteOp.checked;
  475. EnableAutoChangeRate = autoPlayRateOp.checked;
  476. EnableAutoPlay = autoPlayOp.checked;
  477. EnableAutoShowAnswer = autoShowAnswerOp.checked;
  478. EnableAutoAnswerChoices = autoAnswerChoicesOp.checked;
  479. EnableAutoAnswerJudges = autoAnswerJudgesOp.checked;
  480. EnableAutoAnswerFills = autoAnswerFillsOp.checked;
  481. if (!EnableAutoShowAnswer && !EnableAutoAnswerChoices && !EnableAutoAnswerJudges && !EnableAutoAnswerFills)
  482. autoAnswerOp.checked = false;
  483. EnableAutoFillAnswer = autoAnswerOp.checked;
  484. N = autoPlayRateChangeOp.value;
  485. // Save
  486. window.localStorage.EZUL = 'EliotZhang、BrushJIM';
  487. window.localStorage.EAM = EnableAutoMute ? 't' : 'f';
  488. window.localStorage.EACR = EnableAutoChangeRate ? 't' : 'f';
  489. window.localStorage.EAP = EnableAutoPlay ? 't' : 'f';
  490. window.localStorage.EASA = EnableAutoShowAnswer ? 't' : 'f';
  491. window.localStorage.EAAC = EnableAutoAnswerChoices ? 't' : 'f';
  492. window.localStorage.EAAJ = EnableAutoAnswerJudges ? 't' : 'f';
  493. window.localStorage.EAAF = EnableAutoAnswerFills ? 't' : 'f';
  494. window.localStorage.EAFA = EnableAutoFillAnswer ? 't' : 'f';
  495. window.localStorage.APRC = autoPlayRateChangeOp.value.toString();
  496. Video({}, true);
  497. CheckModal(true);
  498. }, true);
  499. // Load
  500. if (window.localStorage.getItem('EZUL') === 'EliotZhang、BrushJIM') {
  501. autoMuteOp.checked = EnableAutoMute = window.localStorage.EAM == 't';
  502. autoPlayRateOp.checked = EnableAutoChangeRate = window.localStorage.EACR == 't';
  503. autoPlayOp.checked = EnableAutoPlay = window.localStorage.EAP == 't';
  504. autoShowAnswerOp.checked = EnableAutoShowAnswer = window.localStorage.EASA == 't';
  505. autoAnswerChoicesOp.checked = EnableAutoAnswerChoices = window.localStorage.EAAC == 't';
  506. autoAnswerJudgesOp.checked = EnableAutoAnswerJudges = window.localStorage.EAAJ == 't';
  507. autoAnswerFillsOp.checked = EnableAutoAnswerFills = window.localStorage.EAAF == 't';
  508. autoAnswerOp.checked = EnableAutoFillAnswer = window.localStorage.EAFA == 't';
  509. autoPlayRateChangeOp.value = N = parseFloat(window.localStorage.APRC);
  510. }
  511. }
  512.  
  513. function Main() {
  514. DrawOptionPanel();
  515. Init();
  516. Video();
  517. CheckModal();
  518. }
  519.  
  520. var autoAnswering = false;
  521. var checkingModal = false;
  522. var mainBtn;
  523. var dragBall;
  524. var saveOpBtn;
  525. var OptionPanel;
  526. var MainPanel;
  527. var autoPlayOp;
  528. var autoMuteOp;
  529. var autoPlayRateOp;
  530. var autoPlayRateChangeOp;
  531. var autoAnswerOp;
  532. var autoShowAnswerOp;
  533. var autoAnswerChoicesOp;
  534. var autoAnswerJudgesOp;
  535. var autoAnswerFillsOp;
  536. var pageid = '';
  537.  
  538. unsafeWindow.navigator.__defineGetter__("userAgent", function () {
  539. return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36";
  540. });
  541.  
  542. setInterval(function () { unsafeWindow.document.dispatchEvent(new Event('mousemove')) }, 1000);
  543.  
  544. setTimeout(Main, '3000');
  545.  
  546. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址