通用视频搜索

视频匹配搜索:爱优腾、B站、芒果TV、搜狐、乐视、1905、PPTV、西瓜

  1. // ==UserScript==
  2. // @name 通用视频搜索
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.5.1
  5. // @description 视频匹配搜索:爱优腾、B站、芒果TV、搜狐、乐视、1905、PPTV、西瓜
  6. // @author tutu辣么可爱
  7. // @include *://*.iqiyi.com/*
  8. // @include *://*.iq.com/*
  9. // @include *://*.youku.com/*
  10. // @include *://*v.qq.com/*
  11. // @include *://*.bilibili.com/*
  12. // @include *://*.acfun.cn/*
  13. // @include *://*.mgtv.com/*
  14. // @include *://*tv.sohu.com/*
  15. // @include *://*.le.com/*
  16. // @include *://*.1905.com/*
  17. // @include *://*.pptv.com/*
  18. // @include *://*.ixigua.com/*
  19. // @license MIT
  20. // ==/UserScript==
  21.  
  22. (function() {
  23. /*
  24. 1.manipulate用于点击/长按事件的设置
  25. 2.set用于创建设置页、获取/修改/保存/应用设置数据。data保存设置数据,并通过localstorage的vipParseSettingsData长期保存,保存形式为JSON字符串。backupData保存初始设置数据用于恢复默认。set->createBody->setMenu保存设置页选项数据
  26. 3.check用于检查浏览器UA,或通过list检查是否是可生效的网站。list保存脚本可生效的网站ID、名称、域名
  27. 4.vip用于创建新播放器,指向解析线路。map保存不同网站不同ua情况下的播放器ID或类名
  28. 5.btn用于创建主题按钮。interface保存解析接口,backupInterfa保存初始解析接口数据用于恢复默认
  29. */
  30. var manipulate = {
  31. data: {
  32. "flag": false,
  33. "wait": false,
  34. "timeStart": 0,
  35. "timeEnd": 0
  36. },
  37. get: function(key) {
  38. if (key === "time") {
  39. return new Date().getTime();
  40. } else {
  41. return this.data[key];
  42. }
  43. },
  44. set: function(key, value) {
  45. this.data[key] = value;
  46. },
  47. start: function(clickEvent, longPressEvent) {
  48. if (!this.get("flag") && !this.get("wait")) {
  49. this.set("flag", true);
  50. this.set("wait", true);
  51. this.set("timeStart", this.get("time"));
  52. setTimeout(function() {
  53. manipulate.end(clickEvent, longPressEvent);
  54. manipulate.set("wait", false);
  55. }, 310);
  56. }
  57. },
  58. end: function(clickEvent, longPressEvent) {
  59. if (this.get("flag")) {
  60. this.set("flag", false);
  61. this.set("timeEnd", this.get("time"));
  62. var timeSpan = this.get("timeEnd") - this.get("timeStart");
  63. if (timeSpan < 300) {
  64. clickEvent();
  65. } else {
  66. longPressEvent();
  67. }
  68. }
  69. },
  70. on: function(target, clickEvent, longPressEvent) {
  71. target.addEventListener("mousedown", function() {
  72. manipulate.start(clickEvent, longPressEvent);
  73. });
  74. target.addEventListener("touchstart", function() {
  75. manipulate.start(clickEvent, longPressEvent);
  76. });
  77. target.addEventListener("mouseup", function() {
  78. manipulate.end(clickEvent, longPressEvent);
  79. });
  80. target.addEventListener("touchend", function() {
  81. manipulate.end(clickEvent, longPressEvent);
  82. });
  83. }
  84. };
  85. var set = {
  86. data: {
  87. "box-top": "100px",
  88. "box-right": "2px",
  89. "main-height": "30px",
  90. "main-width": "50px",
  91. "main-border-radius": "20px",
  92. "menu-height": "310px",
  93. "menu-width": "120px",
  94. "menu-border-radius": "20px",
  95. "item-font-size": "18px",
  96. "item-color": "white",
  97. "background": "rgb(217, 6, 9)",
  98. "user-interface": []
  99. },
  100. backupData: {},
  101. init: function() {
  102. this.backupData = this.data;
  103. var localData = JSON.parse(localStorage.getItem("vipParseSettingsData"));
  104. if (localData) {
  105. var newData = {
  106. ...this.data,
  107. ...localData
  108. };
  109. this.data = newData;
  110. }
  111. btn.backup();
  112. btn.init();
  113. this.store();
  114. },
  115. get: function(key) {
  116. return this.data[key];
  117. },
  118. edit: function(key, value) {
  119. if (key.search("user-interface") !== -1) {
  120. key = parseInt(key.replace(/[^0-9]/ig, ""));
  121. this.data["user-interface"][key] = value;
  122. }
  123. this.data[key] = value;
  124. },
  125. store: function() {
  126. localStorage.setItem("vipParseSettingsData", JSON.stringify(this.data));
  127. },
  128. save: function() {
  129. var setPage = document.getElementById("vipParseBtnSetting");
  130. var inputBox = setPage.getElementsByTagName("input");
  131. for (let i = 0; i < inputBox.length; i++) {
  132. this.edit(inputBox[i].name, inputBox[i].value);
  133. }
  134. btn.init();
  135. },
  136. apply: function() {
  137. var flag = false;
  138. if (document.getElementById("vipParseBtnMenu").style.display !== "none") {
  139. flag = true;
  140. }
  141. document.getElementById("vipParseBtnBox").remove();
  142. btn.create();
  143. if (flag) {
  144. btn.clickMain();
  145. }
  146. document.getElementById("vipParseBtnSetting").style.background = this.get("background");
  147. },
  148. revert: function() {
  149. var setPage = document.getElementById("vipParseBtnSetting-StyleSet");
  150. if (setPage.style.display === "none") {
  151. setPage = document.getElementById("vipParseBtnSetting-ParseSet");
  152. }
  153. var inputBox = setPage.getElementsByTagName("input");
  154. var interfaceBackup = btn.get("backup");
  155. for (let i in inputBox) {
  156. let key = inputBox[i].name;
  157. if (key.search("user-interface") !== -1) {
  158. key = parseInt(key.replace(/[^0-9]/ig, ""));
  159. inputBox[i].value = interfaceBackup[key];
  160. } else {
  161. inputBox[i].value = this.backupData[key];
  162. }
  163. }
  164. },
  165. switch: function() {
  166. var setTitle = document.getElementById("vipParseBtnSetting-head").children[0];
  167. var styleSet = document.getElementById("vipParseBtnSetting-StyleSet");
  168. var parseSet = document.getElementById("vipParseBtnSetting-ParseSet");
  169. if (styleSet.style.display === "none") {
  170. styleSet.style.display = "";
  171. parseSet.style.display = "none";
  172. setTitle.innerText = "脚本样式设置";
  173. } else {
  174. styleSet.style.display = "none";
  175. parseSet.style.display = "";
  176. setTitle.innerText = "脚本解析设置";
  177. }
  178. },
  179. create: function() {
  180. var setting = document.createElement("div");
  181. var wid = 400;
  182. var hei = 260;
  183. var screenW = document.documentElement.clientWidth;
  184. var screenH = document.documentElement.clientHeight;
  185. if ((wid + 10) > screenW) {
  186. wid = screenW - 10;
  187. }
  188. var settingH = (screenH - hei) / 2;
  189. var settingW = (screenW - wid) / 2;
  190. setting.style =
  191. "display:none;width:" + wid + "px;height:" + hei +
  192. "px;overflow:hidden;position:fixed;top:" + settingH + "px;right:" + settingW +
  193. "px;border-radius:15px;padding:20px;background:" + this.get("background") +
  194. ";color:white;font-size:12px;overflow-y:auto;z-index: 99999;";
  195. setting.id = "vipParseBtnSetting";
  196. setting.appendChild(this.createHead());
  197. setting.appendChild(this.createBody());
  198. setting.appendChild(this.createFoot());
  199. document.body.insertBefore(setting, document.body.firstChild);
  200. },
  201. createHead: function() {
  202. var head = document.createElement("div");
  203. var title = document.createElement("span");
  204. var subtitle = document.createElement("span");
  205. head.id = "vipParseBtnSetting-head";
  206. head.style = "width:100%;height:30px;text-align:center;margin-bottom:20px;";
  207. title.style = "font-size:20px;";
  208. title.innerText = "脚本样式设置";
  209. subtitle.style = "font-size:12px;";
  210. subtitle.innerText = "(仅对" + (check.ua() === "pc" ? "桌面端" : "移动端") + check.site("name") + "生效)";
  211. head.appendChild(title);
  212. head.appendChild(subtitle);
  213. return head;
  214. },
  215. createBody: function() {
  216. var body = document.createElement("div");
  217. body.style = "width:115%;height:calc(100% - 80px);overflow: hidden scroll;";
  218. body.id = "vipParseBtnSetting-body";
  219. body.appendChild(this.createStyle());
  220. body.appendChild(this.createParse());
  221. return body;
  222. },
  223. createFoot: function() {
  224. var foot = document.createElement("div");
  225. foot.style = "width:100%;height:30px;position:absolute;bottom:10px;";
  226. foot.id = "vipParseBtnSetting-foot";
  227. foot.appendChild(this.createBtn("revert"));
  228. foot.appendChild(this.createBtn("save"));
  229. foot.appendChild(this.createBtn("close"));
  230. foot.appendChild(this.createBtn("switch"));
  231. return foot;
  232. },
  233. createOpt: function(data, titleWidth, inputWidth) {
  234. var optBox = document.createElement("div");
  235. var titleBox = document.createElement("span");
  236. var textBox = document.createElement("input");
  237. var textBoxMaxWidth = document.documentElement.clientWidth - 20 - titleWidth;
  238. optBox.style = "height:30px;float:left;"
  239. titleBox.innerText = data.name;
  240. titleBox.style = "width:" + titleWidth + "px;float:left;margin-bottom:8px;";
  241. textBox.name = data.key;
  242. textBox.style = "width:" + inputWidth +
  243. "px;max-width:" + textBoxMaxWidth +
  244. "px;float:left;color:black;margin-bottom:8px;margin-right:10px;";
  245. if (data.value) {
  246. textBox.value = data.value;
  247. } else {
  248. textBox.value = set.get(data.key);
  249. }
  250. optBox.appendChild(titleBox);
  251. optBox.appendChild(textBox);
  252. return optBox;
  253. },
  254. createStyle: function() {
  255. var page = document.createElement("div");
  256. page.style = "width:100%;height:100%;";
  257. page.id = "vipParseBtnSetting-StyleSet";
  258. var setMenu = [{
  259. "name": "按钮距离顶部",
  260. "key": "box-top"
  261. }, {
  262. "name": "按钮距离右侧",
  263. "key": "box-right"
  264. }, {
  265. "name": "按钮高度",
  266. "key": "main-height"
  267. }, {
  268. "name": "按钮宽度",
  269. "key": "main-width"
  270. }, {
  271. "name": "按钮圆角",
  272. "key": "main-border-radius"
  273. }, {
  274. "name": "菜单圆角",
  275. "key": "menu-border-radius"
  276. }, {
  277. "name": "菜单高度",
  278. "key": "menu-height"
  279. }, {
  280. "name": "菜单宽度",
  281. "key": "menu-width"
  282. }, {
  283. "name": "菜单字体大小",
  284. "key": "item-font-size"
  285. }, {
  286. "name": "菜单字体颜色",
  287. "key": "item-color"
  288. }, {
  289. "name": "主题背景色调",
  290. "key": "background"
  291. }];
  292. for (let i in setMenu) {
  293. page.appendChild(this.createOpt(setMenu[i], 90, 90));
  294. }
  295. return page;
  296. },
  297. createParse: function() {
  298. var page = document.createElement("div");
  299. page.style = "display:none;width:100%;height:100%;";
  300. page.id = "vipParseBtnSetting-ParseSet";
  301. for (let i = 0; i < btn.get("length"); i++) {
  302. var setdata = {
  303. "name": "播放线路" + ((i + 1) < 10 ? "0" : "") + (i + 1),
  304. "key": "user-interface-" + i,
  305. "value": btn.get(i)
  306. };
  307. page.appendChild(this.createOpt(setdata, 90, 180));
  308. }
  309. return page;
  310. },
  311. createBtn: function(name) {
  312. var btnBox = document.createElement("span");
  313. var btnObj = document.createElement("div");
  314. var text, func, id;
  315. btnObj.style =
  316. "margin-right:12px;padding:0 10px;cursor:pointer;border:white thin solid;border-radius:10px;float:left";
  317. switch (name) {
  318. case "revert":
  319. text = "重置";
  320. id = "vipParseBtnSetting-" + name + "Btn";
  321. func = function() {
  322. set.revert()
  323. }
  324. break;
  325. case "save":
  326. text = "保存并应用";
  327. id = "vipParseBtnSetting-" + name + "Btn";
  328. func = function() {
  329. if (confirm("是否确认保存并应用新设置?")) {
  330. set.save();
  331. set.store();
  332. set.apply();
  333. }
  334. }
  335. break;
  336. case "close":
  337. text = "关闭设置";
  338. id = "vipParseBtnSetting-" + name + "Btn";
  339. func = function() {
  340. var setting = document.getElementById("vipParseBtnSetting");
  341. setting.style.display = "none";
  342. }
  343. break;
  344. case "switch":
  345. text = "切换设置项";
  346. id = "vipParseBtnSetting-" + name + "Btn";
  347. func = function() {
  348. set.switch();
  349. }
  350. break;
  351. default:
  352. break;
  353. }
  354. btnObj.innerText = text;
  355. btnObj.id = id;
  356. btnObj.onclick = func;
  357. btnBox.appendChild(btnObj);
  358. return btnBox;
  359. }
  360. };
  361. var check = {
  362. list: {
  363. 0: {
  364. "id": "iqiyi",
  365. "name": "爱奇艺",
  366. "host": "iqiyi.com|iq.com"
  367. },
  368. 1: {
  369. "id": "youku",
  370. "name": "优酷",
  371. "host": "youku.com"
  372. },
  373. 2: {
  374. "id": "tencentvideo",
  375. "name": "腾讯视频",
  376. "host": "v.qq.com"
  377. },
  378. 3: {
  379. "id": "bilibili",
  380. "name": "B站",
  381. "host": "bilibili.com"
  382. },
  383. 4: {
  384. "id": "acfun",
  385. "name": "A站",
  386. "host": "acfun.cn"
  387. },
  388. 5: {
  389. "id": "mgtv",
  390. "name": "芒果TV",
  391. "host": "mgtv.com"
  392. },
  393. 6: {
  394. "id": "sohu",
  395. "name": "搜狐视频",
  396. "host": "tv.sohu.com"
  397. },
  398. 7: {
  399. "id": "le",
  400. "name": "乐视视频",
  401. "host": "le.com"
  402. },
  403. 8: {
  404. "id": "1905",
  405. "name": "1905电影网",
  406. "host": "1905.com"
  407. },
  408. 9: {
  409. "id": "pptv",
  410. "name": "PP视频",
  411. "host": "pptv.com"
  412. },
  413. 10: {
  414. "id": "xigua",
  415. "name": "西瓜视频",
  416. "host": "ixigua.com"
  417. }
  418. },
  419. ua: function() {
  420. var uaStr = "pc";
  421. if (/Android|webOS|HarmonyOS|iPhone|iPod|BlackBerry|mobile/i.test(navigator.userAgent)) {
  422. uaStr = "mobile";
  423. }
  424. return uaStr;
  425. },
  426. site: function(type) {
  427. var site = "unknow";
  428. var host = location.hostname;
  429. for (let i in this.list) {
  430. if (host.match(new RegExp(this.list[i].host))) {
  431. site = this.list[i][type];
  432. }
  433. }
  434. return site;
  435. },
  436. url: function(urlStr) {
  437. var res = false;
  438. urlStr = urlStr.replace(/\s+/g, "");
  439. if (/^((http|https):\/\/)?(([A-Za-z0-9]+-[A-Za-z0-9]+|[A-Za-z0-9]+)\.)+([A-Za-z]+)[/\?\:]?.*$/i
  440. .test(urlStr)) {
  441. res = urlStr;
  442. }
  443. return res;
  444. }
  445. }
  446. var vip = {
  447. map: {
  448. "iqiyi": {
  449. "pc": "flashbox",
  450. "mobile": "m-box"
  451. },
  452. "youku": {
  453. "pc": "ykPlayer",
  454. "mobile": "h5-detail-player"
  455. },
  456. "tencentvideo": {
  457. "pc": "mod_player",
  458. "mobile": "mod_player"
  459. },
  460. "bilibili": {
  461. "pc": "bilibili-player-video-wrap|player-limit-mask",
  462. "mobile": "bilibiliPlayer|player-wrapper"
  463. },
  464. "acfun": {
  465. "pc": "ACPlayer",
  466. "mobile": "#ACPlayer"
  467. },
  468. "mgtv": {
  469. "pc": "mgtv-player-wrap",
  470. "mobile": "video-area"
  471. },
  472. "sohu": {
  473. "pc": "x-player",
  474. "mobile": "player-view"
  475. },
  476. "le": {
  477. "pc": "fla_box",
  478. "mobile": "playB"
  479. },
  480. "1905": {
  481. "pc": "player",
  482. "mobile": "player"
  483. },
  484. "pptv": {
  485. "pc": "pplive-player",
  486. "mobile": "pp-details-video"
  487. },
  488. "xigua": {
  489. "pc": "teleplayPage__playerSection__left",
  490. "mobile": "xigua-detailvideo-video-inner"
  491. }
  492. },
  493. get: function(site, ua) {
  494. var res = false;
  495. if (site && ua) {
  496. var key = this.map[site][ua];
  497. if (key) {
  498. key = key.split("|");
  499. for (let i = 0; i < key.length; i++) {
  500. res = this.search(key[i]);
  501. if (res) {
  502. break;
  503. }
  504. }
  505. }
  506. }
  507. return res;
  508. },
  509. search: function(key) {
  510. var player = document.getElementById(key);
  511. if (player) {
  512. return player;
  513. }
  514. player = document.getElementsByClassName(key)[0];
  515. if (player) {
  516. return player;
  517. }
  518. player = false;
  519. return player;
  520. },
  521. on: function() {
  522. var site = check.site("id");
  523. if (site !== "unknow") {
  524. set.init();
  525. set.create();
  526. btn.create();
  527. }
  528. }
  529. }
  530. var btn = {
  531. interface: ["https://z1.m1907.cn/?eps=0&jx=", "https://vip.parwix.com:4433/player/?url=",
  532. "https://vip.bljiex.com/?v=", "https://lecurl.cn/?url=", "https://jx.m3u8.tv/jiexi/?url=",
  533. "https://api.leduotv.com/wp-api/ifr.php?isDp=1&vid=", "https://okjx.cc/?url=",
  534. "https://m2090.com/?url=", "http://51wujin.net/?url=", "https://vip.2ktvb.com/player/?url=",
  535. "https://660e.com/?url=", "https://api.sigujx.com/?url=", "https://jiexi.janan.net/jiexi/?url=",
  536. "https://jx.618g.com/?url=", "https://jx.ergan.top/?url=", "https://api.147g.cc/m3u8.php?url=",
  537. "http://17kyun.com/api.php?url=", "", "", ""
  538. ],
  539. backupInterface: [],
  540. get: function(key) {
  541. var res;
  542. if (/^\d+$/.test(key)) {
  543. res = this.interface[key];
  544. } else if (key === "length") {
  545. res = this.interface.length;
  546. } else if (key === "backup") {
  547. res = this.backupInterface;
  548. } else {
  549. res = this.interface;
  550. }
  551. return res;
  552. },
  553. edit: function(key, value) {
  554. if (/^\d+$/.test(key)) {
  555. this.interface[key] = value;
  556. }
  557. },
  558. backup: function() {
  559. for (let i in this.interface) {
  560. this.backupInterface[i] = this.interface[i];
  561. }
  562. },
  563. init: function() {
  564. var interfaceData = set.get("user-interface");
  565. for (let i in interfaceData) {
  566. if (this.get(i) === interfaceData[i]) {
  567. delete interfaceData[i];
  568. } else if (interfaceData[i]) {
  569. this.edit(i, interfaceData[i]);
  570. }
  571. }
  572. set.edit("user-interface", interfaceData);
  573. },
  574. create: function() {
  575. var box = document.createElement("div");
  576. box.style = "cursor: pointer; position: fixed; top: " + set.get("box-top") + ";right: " + set
  577. .get("box-right") + ";z-index: 99999;";
  578. box.id = "vipParseBtnBox";
  579. var main = this.createMain();
  580. var menu = this.createMenu();
  581. box.appendChild(main);
  582. box.appendChild(menu);
  583. document.body.insertBefore(box, document.body.firstChild);
  584. },
  585. createMain: function() {
  586. var main = document.createElement("div");
  587. var pH = set.get("main-height");
  588. pH = (pH.slice(0, pH.search("px")) - 30) / 2;
  589. var pW = set.get("main-width");
  590. pW = (pW.slice(0, pW.search("px")) - 50) / 2;
  591. main.style =
  592. "height:" + set.get("main-height") + ";width:" + set.get("main-width") + ";background:" +
  593. set.get("background") + ";border-radius:" + set.get("main-border-radius") +
  594. ";box-sizing:border-box;padding:" + pH + "px " + pW + "px;";
  595. main.id = "vipParseBtnMain";
  596. main.innerHTML =
  597. "<svg height='30' width='50'><polygon points='20,6 35,15 20,24' style='fill:white;'/></svg>";
  598. manipulate.on(main, btn.clickMain, btn.longPressMain);
  599. return main;
  600. },
  601. createMenu: function() {
  602. var menu = document.createElement("div");
  603. var posTop = set.get("main-height");
  604. posTop = posTop.slice(0, posTop.search("px"));
  605. posTop = parseFloat(posTop) + 5;
  606. menu.style =
  607. "display:none;width:" + set.get("menu-width") + ";height:" + set.get("menu-height") +
  608. ";overflow:hidden;position:absolute;top:" + posTop + "px;right:0px;border-radius:" + set
  609. .get(
  610. "menu-border-radius") + ";transition: all 0.2s";
  611. menu.id = "vipParseBtnMenu";
  612. var innerMenu = document.createElement("div");
  613. innerMenu.style = "width:115%;height:100%;overflow-y:scroll;overflow-x:hidden;";
  614. for (let i = 0; i < this.get("length"); i++) {
  615. innerMenu.appendChild(this.createItem(i, this.get(i)));
  616. }
  617. menu.appendChild(innerMenu);
  618. return menu;
  619. },
  620. createItem: function(i, url) {
  621. var item = document.createElement("span");
  622. item.style =
  623. "color:" + set.get("item-color") + ";font-size:" + set.get("item-font-size") +
  624. ";display:block;padding:10px 6px 6px 10px;width:calc(100% + 30px);background:" + set.get(
  625. "background") + ";border-bottom:white solid;"
  626. item.setAttribute("url", url);
  627. item.innerText = "播放线路 " + ((i + 1) < 10 ? "0" : "") + (i + 1);
  628. item.onclick = function() {
  629. url = check.url(url);
  630. if (url) {
  631. btn.clickItem(url);
  632. console.log("当前解析接口:" + url);
  633. } else {
  634. var msg = "当前解析接口为空,或接口URL错误";
  635. console.log(msg);
  636. alert(msg);
  637. }
  638. }
  639. item.onmouseover = function() {
  640. this.style.background = set.get("item-color");
  641. this.style.color = set.get("background");
  642. }
  643. item.onmouseleave = function() {
  644. this.style.background = set.get("background");
  645. this.style.color = set.get("item-color");
  646. }
  647. return item;
  648. },
  649. clickMain: function() {
  650. var menu = document.getElementById("vipParseBtnMenu");
  651. if (menu.style.display !== "none") {
  652. menu.style.display = "none";
  653. } else {
  654. menu.style.display = "block";
  655. }
  656. },
  657. longPressMain: function() {
  658. var setting = document.getElementById("vipParseBtnSetting");
  659. if (setting.style.display !== "none") {
  660. setting.style.display = "none";
  661. } else {
  662. setting.style.display = "block";
  663. }
  664. },
  665. clickItem: function(url) {
  666. var newPlayer = document.createElement("iframe");
  667. newPlayer.frameBorder = "no";
  668. newPlayer.width = "100%";
  669. newPlayer.height = "100%";
  670. newPlayer.allowFullscreen = "true";
  671. newPlayer.allowTransparency = "true";
  672. newPlayer.scrolling = "no";
  673. newPlayer.id = "newPlayerParseIframe";
  674. newPlayer.src = url + location.href;
  675. var player = vip.get(check.site("id"), check.ua());
  676. if (player) {
  677. var originHeight = player.clientHeight;
  678. player.innerHTML = "";
  679. player.style.height = originHeight + "px";
  680. player.appendChild(newPlayer);
  681. }
  682. }
  683. }
  684. vip.on();
  685. })();

QingJ © 2025

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