【复活版】百度网盘不限速下载-TT快下

复活版TT快下,加速?

  1. // ==UserScript==
  2. // @name 【复活版】百度网盘不限速下载-TT快下
  3. // @namespace https://wiki.tttt.ee
  4. // @description 复活版TT快下,加速?
  5. // @version 1.2.2
  6. // @license MIT
  7. // @author MoTeam-Top、TT-down
  8. // @icon https://wiki.tttt.ee/logo.png
  9. // @resource https://cdn.staticfile.org/limonte-sweetalert2/11.7.1/sweetalert2.min.css
  10. // @require https://cdn.jsdelivr.net/npm/sweetalert2@11.12.2/dist/sweetalert2.all.min.js
  11. // @require https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js
  12. // @grant GM_xmlhttpRequest
  13. // @grant GM_addStyle
  14. // @grant GM_setClipboard
  15. // @match *://pan.baidu.com/*
  16. // @match *://yun.baidu.com/*
  17. // @match *://pan.baidu.com/disk/home*
  18. // @match *://yun.baidu.com/disk/home*
  19. // @match *://pan.baidu.com/disk/main*
  20. // @match *://yun.baidu.com/disk/main*
  21. // @match *://pan.baidu.com/s/*
  22. // @match *://yun.baidu.com/s/*
  23. // @match *://pan.baidu.com/share/*
  24. // @match *://yun.baidu.com/share/*
  25. // @connect moiu.cn
  26. // @connect jsdelivr.net
  27. // @connect baidu.com
  28. // @connect tttt.ee
  29. // @antifeature membership
  30. // @antifeature referral-link
  31. // ==/UserScript==
  32.  
  33. (async () => {
  34. // 在页面加载时立即调用GetNotify函数
  35. GetNotify();
  36.  
  37. if (window.location.pathname === "/disk/home") {
  38. window.location.replace("/disk/main");
  39. }
  40.  
  41. AddElement();
  42. let filelistValue = ''; // 新增变量,用于保存从 save 接口返回的 to 值
  43.  
  44. // 添加一些自定义 CSS 来调整按钮样式
  45. const style = document.createElement('style');
  46. style.innerHTML = `
  47. .swal2-cancel-button {
  48. margin-left: 10px;
  49. }
  50. `;
  51. document.head.appendChild(style);
  52.  
  53. function GetNotify() {
  54. GM_xmlhttpRequest({
  55. method: "GET",
  56. url: "https://api.moiu.cn/JavaScript/PaiPai/info_v2",
  57. onload: function(response) {
  58. try {
  59. const jsondata = JSON.parse(response.responseText);
  60. const { code, message, ua, gg, open, url, url_data } = jsondata;
  61.  
  62. // 确保公告是打开状态
  63. if (open === 1 && code === 200) {
  64. const showCancelButton = url_data === 'y';
  65.  
  66. Swal.fire({
  67. icon: "info",
  68. title: gg, // 使用公告标题
  69. text: message, // 使用公告信息
  70. confirmButtonText: "关闭",
  71. showCancelButton: showCancelButton, // 根据 url_data 控制取消按钮的显示
  72. cancelButtonText: "我要租号",
  73. cancelButtonColor: '#007bff', // 自定义取消按钮颜色
  74. customClass: {
  75. cancelButton: 'swal2-cancel-button' // 自定义按钮类名
  76. },
  77. preConfirm: () => {
  78. // 这个函数在点击“关闭”时触发
  79. console.log('关闭按钮被点击');
  80. }
  81. }).then((result) => {
  82. if (result.dismiss === Swal.DismissReason.cancel) {
  83. // 点击“我要租号”按钮的行为
  84. window.open(url, "_blank");
  85. }
  86. });
  87. }
  88. } catch (e) {
  89. console.error("Error fetching announcement:", e);
  90. }
  91. },
  92. });
  93. }
  94.  
  95. // 存储用户信息
  96. let userInfo = {};
  97.  
  98. // 获取用户信息
  99. function fetchUserInfo() {
  100. return new Promise((resolve, reject) => {
  101. GM_xmlhttpRequest({
  102. method: "GET",
  103. url: "https://pan.baidu.com/rest/2.0/membership/user/info?method=query&clienttype=0&app_id=250528",
  104. onload: function(response) {
  105. try {
  106. const data = JSON.parse(response.responseText);
  107. resolve(data.user_info);
  108. } catch (error) {
  109. reject(error);
  110. }
  111. },
  112. onerror: function(error) {
  113. reject(error);
  114. }
  115. });
  116. });
  117. }
  118.  
  119. // 在页面加载完成后请求用户信息
  120. async function getUserInfoOnPageLoad() {
  121. try {
  122. const data = await fetchUserInfo();
  123. userInfo = data;
  124. console.log("User info fetched on page load:", userInfo);
  125. } catch (error) {
  126. console.error("Error fetching user info on page load:", error);
  127. }
  128. }
  129.  
  130. function AddElement() {
  131. if (document.getElementById("TTDown") === null) {
  132. const toolbar = document.querySelector("div.wp-s-agile-tool-bar__header");
  133. if (toolbar) {
  134. const newButton = document.createElement("button");
  135. newButton.id = "TTDown";
  136. newButton.className = "u-button nd-file-list-toolbar-action-item"; // 去掉原有的颜色类名
  137. newButton.style.marginRight = "8px";
  138. newButton.style.backgroundColor = "red"; // 设置背景颜色为红色
  139. newButton.style.color = "white"; // 设置文字颜色为白色以便更好地显示
  140. newButton.innerText = "TTDown";
  141. toolbar.prepend(newButton);
  142.  
  143. const statusButton = document.createElement("button");
  144. statusButton.id = "TTDownStatus";
  145. statusButton.className = "u-button nd-file-list-toolbar-action-item"; // 去掉原有的颜色类名
  146. statusButton.style.marginRight = "8px";
  147. statusButton.style.backgroundColor = "red"; // 设置背景颜色为红色
  148. statusButton.style.color = "white"; // 设置文字颜色为白色以便更好地显示
  149. statusButton.innerText = "TTDown Status";
  150. toolbar.prepend(statusButton);
  151.  
  152. newButton.addEventListener("click", handleTTDownClick);
  153. statusButton.addEventListener("click", handleTTDownStatusClick);
  154. } else {
  155. setTimeout(AddElement, 100);
  156. }
  157. } else {
  158. console.log("TTDown button already added.");
  159. }
  160. }
  161.  
  162. async function getBdsToken() {
  163. var htmlString = $("html").html();
  164. var regex = /"bdstoken":"(\w+)"/;
  165. var match = regex.exec(htmlString);
  166. console.log("bdstoken:", match ? match[1] : null);
  167. return match ? match[1] : null;
  168. }
  169.  
  170. async function shareFiles(bdstoken, selectedIds) {
  171. const bdpassword = "7777";
  172. console.log("Sharing files with bdstoken:", bdstoken, "selectedIds:", selectedIds, "bdpassword:", bdpassword);
  173. return $.post("https://pan.baidu.com/share/set?channel=chunlei&bdstoken=" + bdstoken, {
  174. period: 1,
  175. pwd: bdpassword,
  176. eflag_disable: true,
  177. channel_list: "[]",
  178. schannel: 4,
  179. fid_list: JSON.stringify(selectedIds)
  180. }).then(response => response);
  181. }
  182.  
  183. function extractShortUrl(link) {
  184. const regex = /https:\/\/pan\.baidu\.com\/s\/([a-zA-Z0-9-_]+)/;
  185. const match = regex.exec(link);
  186. console.log("Extracted short URL:", match ? match[1] : null);
  187. return match ? match[1] : null;
  188. }
  189.  
  190. function callWxlistApi(shorturl, password) {
  191. console.log("Calling Wxlist API with shorturl:", shorturl, "password:", password);
  192. const bdpassword = "7777";
  193. return new Promise((resolve, reject) => {
  194. const url = "https://api.moiu.cn/api/List";
  195. const formParams = {
  196. "surl": shorturl,
  197. "dir": "/",
  198. "password": password,
  199. "pwd": bdpassword
  200. };
  201.  
  202. $.ajax({
  203. type: "POST",
  204. url: url,
  205. data: formParams,
  206. success: function(response) {
  207. console.log("Wxlist API response:", response);
  208. resolve(response);
  209. },
  210. error: function(xhr, status, error) {
  211. console.error("Error calling Wxlist API:", xhr, status, error);
  212. reject({
  213. status: xhr.status,
  214. statusText: xhr.statusText
  215. });
  216. }
  217. });
  218. });
  219. }
  220.  
  221. function extractWxlistData(responseBody) {
  222. const data = responseBody.data;
  223. console.log("Extracted data from Wxlist response:", data);
  224. return {
  225. uk: data.uk,
  226. shareid: data.shareid,
  227. randsk: data.randsk,
  228. list: data.list,
  229. fsidlist: data.list.map(item => item.fs_id.toString()),
  230. size: data.list[0]?.size || 0, // 提取第一个列表项的 size 属性
  231. filename: data.list[0]?.server_filename || 0, // 提取第一个列表项的 size 属性
  232. };
  233. }
  234.  
  235. function postToSaveApi(data, password, userid, shorturl) {
  236. const requestData = {
  237. fsidlist: data.list[0].fs_id.toString(), // 确保是字符串
  238. sekey: data.randsk,
  239. uk: data.uk,
  240. surl: shorturl,
  241. shareid: data.shareid,
  242. password: password,
  243. userid: userid,
  244. size: data.size.toString(), // 确保是字符串
  245. filename: data.filename
  246. };
  247.  
  248. console.log("Prepared request data for Save API:", requestData);
  249.  
  250. return new Promise((resolve, reject) => {
  251. GM_xmlhttpRequest({
  252. method: "POST",
  253. url: "https://api.tttt.ee/parse.php",
  254. headers: {
  255. "Content-Type": "application/json"
  256. },
  257. data: JSON.stringify(requestData),
  258. onload: function(response) {
  259. const responseData = JSON.parse(response.responseText);
  260. console.log("Save API response:", responseData);
  261. if (responseData.code !== 200) {
  262. Swal.fire("错误", responseData.message, "error");
  263. reject({
  264. status: response.status,
  265. statusText: responseData.message
  266. });
  267. } else {
  268. resolve(responseData.data); // 直接返回data对象
  269. }
  270. },
  271. onerror: function(response) {
  272. const errorMessage = JSON.parse(response.responseText).message || '网络错误';
  273. Swal.fire("错误", errorMessage, "error");
  274. console.error("Error posting to Save API:", response);
  275. reject({
  276. status: response.status,
  277. statusText: errorMessage
  278. });
  279. }
  280. });
  281. });
  282. }
  283.  
  284. let currentLinkIndex = 0;
  285. let downloadLinks = [];
  286.  
  287. async function handleTTDownClick() {
  288. console.log("TTDown button clicked.");
  289. let selectedElements = document.querySelectorAll(".wp-s-pan-table__body-row.mouse-choose-item.selected, .wp-s-file-grid-list__item.text-center.cursor-p.mouse-choose-item.is-checked, .wp-s-file-contain-list__item.text-center.cursor-p.mouse-choose-item.is-checked");
  290. let selectedIds = Array.from(selectedElements).map(item => item.getAttribute("data-id"));
  291.  
  292. console.log("Selected elements:", selectedElements);
  293. console.log("Selected IDs:", selectedIds);
  294.  
  295. if (selectedIds.length === 0) {
  296. Swal.fire({
  297. showConfirmButton: true,
  298. title: '系统提示',
  299. text: '请选择需要下载的文件',
  300. icon: 'error'
  301. });
  302. return;
  303. }
  304.  
  305. if (selectedIds.length > 1) {
  306. Swal.fire({
  307. showConfirmButton: true,
  308. title: '系统提示',
  309. text: '暂时只能下载一个文件',
  310. icon: 'error'
  311. });
  312. return;
  313. }
  314.  
  315. let selectedItems = Array.from(selectedElements);
  316. if (selectedItems.some(item => item.dataset.isdir === "true") || $('tr.selected img[src*="ceH8M5EZYnGhnBKRceGqmaZXPPw2xbO+1x"]').length > 0) {
  317. Swal.fire({
  318. title: '系统提示',
  319. text: '请不要选择文件夹解析,因为还没学会.',
  320. icon: 'error'
  321. });
  322. return;
  323. }
  324.  
  325. const { value: requestType } = await Swal.fire({
  326. title: '选择请求类型',
  327. html: `
  328. <div>
  329. <input type="radio" id="cloud" name="requestType" value="cloud" checked>
  330. <label for="cloud">1号接口(全天稳定无法保证,有时可能加速正常)</label>
  331. </div>
  332. <div>
  333. <input type="radio" id="local" name="requestType" value="local">
  334. <label for="local">2号接口(稳定,加速需要自带SVIP账号)</label>
  335. </div>
  336. `,
  337. showCancelButton: true,
  338. cancelButtonText: '取消',
  339. preConfirm: () => {
  340. const requestType = document.querySelector('input[name="requestType"]:checked').value;
  341. return requestType;
  342. }
  343. });
  344.  
  345. if (!requestType) {
  346. Swal.fire("提示", "您需要选择一个请求类型来继续", "info");
  347. return;
  348. }
  349.  
  350. const { value: password } = await Swal.fire({
  351. title: '输入密码',
  352. input: 'password',
  353. inputLabel: '使用前请先关注公众号:冰箱喵 获取验证码吧!',
  354. inputPlaceholder: '密码为了控制流量,理解下',
  355. inputAttributes: {
  356. maxlength: 6,
  357. autocapitalize: 'off',
  358. autocorrect: 'off'
  359. }
  360. });
  361.  
  362. if (!password) {
  363. Swal.fire("提示", "需要密码来继续", "info");
  364. return;
  365. }
  366.  
  367. Swal.fire({
  368. title: "正在获取下载链接...",
  369. onBeforeOpen: () => {
  370. Swal.showLoading();
  371. }
  372. });
  373.  
  374. if (requestType === 'local') {
  375. try {
  376. const rootListResponse = await fetchBaiduRootFileList();
  377. const rootFileList = rootListResponse.list;
  378.  
  379. console.log("Baidu root file list response:", rootFileList);
  380.  
  381. const myResourceFolderExists = rootFileList.some(file => file.path === "/我的资源");
  382.  
  383. if (!myResourceFolderExists) {
  384. Swal.fire({
  385. title: '错误',
  386. text: '似乎你解析的文件没有放在 我的资源 文件夹,或者你根本没创建这个文件夹',
  387. icon: 'error'
  388. });
  389. return;
  390. }
  391.  
  392. let pathLocal;
  393. let filename;
  394. try {
  395. const listResponse = await fetchBaiduFileList();
  396. const fileList = listResponse.list;
  397.  
  398. console.log("Baidu file list response:", fileList);
  399.  
  400. fileList.forEach(file => {
  401. if (selectedIds.includes(file.fs_id.toString())) {
  402. pathLocal = file.path;
  403. filename = file.server_filename;
  404. }
  405. });
  406.  
  407. if (!pathLocal || !filename) {
  408. Swal.fire("错误", "未找到匹配的文件或文件名", "error");
  409. return;
  410. }
  411.  
  412. console.log("Matched file path:", pathLocal);
  413. console.log("Matched file name:", filename);
  414.  
  415. // 生成下载链接的请求
  416. const bdstoken = await getBdsToken();
  417. if (!bdstoken) {
  418. Swal.fire("错误", "无法获取bdstoken", "error");
  419. return;
  420. }
  421.  
  422. const queryParams = new URLSearchParams({
  423. "target": JSON.stringify([pathLocal]),
  424. "dlink": 1,
  425. "channel": "chunlei",
  426. "web": 1,
  427. "app_id": 250528,
  428. "bdstoken": bdstoken,
  429. "logid": "QzBQUQORDY1N0E0QzMzNzEyRDDBNjZDZjc1NzJFQUY6Rkc9MQ%3D%3D",
  430. "clienttype": 0
  431. });
  432.  
  433. const requestUrl = `https://pan.baidu.com/api/filemetas?${queryParams.toString()}`;
  434.  
  435. // 发起请求以获取下载链接
  436. const downloadLinkResponse = await fetch(requestUrl);
  437. const downloadLinkData = await downloadLinkResponse.json();
  438.  
  439. if (downloadLinkData.errno === 0) {
  440. console.log("Download link data:", downloadLinkData);
  441.  
  442. const downloadLink = downloadLinkData.info[0].dlink;
  443.  
  444. // 发送请求到 parse 接口
  445. const parseResponse = await postToSaveApi({ filename, dlink: downloadLink }, password, userInfo.uk, shorturl);
  446.  
  447. console.log("Parse API Response Data:", parseResponse);
  448.  
  449. Swal.fire({
  450. icon: 'success',
  451. title: '下载链接获取成功',
  452. html: `<a href="${downloadLink}" target="_blank">${downloadLink}</a>`,
  453. showCancelButton: true,
  454. cancelButtonText: '关闭',
  455. confirmButtonText: '复制链接',
  456. preConfirm: async () => {
  457. try {
  458. await navigator.clipboard.writeText(downloadLink);
  459. Swal.fire("已复制", "下载链接已复制到剪贴板", "success");
  460. } catch (err) {
  461. console.error("Failed to copy: ", err);
  462. Swal.fire("复制失败", "无法将链接复制到剪贴板", "error");
  463. }
  464. }
  465. });
  466.  
  467. } else {
  468. Swal.fire("错误", "无法获取下载链接", "error");
  469. }
  470.  
  471. } catch (error) {
  472. Swal.fire("错误", "无法获取文件列表", "error");
  473. console.error("Error fetching file list:", error);
  474. return;
  475. }
  476.  
  477. } catch (error) {
  478. Swal.fire("错误", "无法获取根目录文件列表", "error");
  479. console.error("Error fetching root directory file list:", error);
  480. return;
  481. }
  482. } else {
  483. const bdstoken = await getBdsToken();
  484. if (!bdstoken) {
  485. Swal.fire("错误", "无法获取bdstoken", "error");
  486. return;
  487. }
  488.  
  489. const shareResponse = await shareFiles(bdstoken, selectedIds);
  490. const shorturl = extractShortUrl(shareResponse.link);
  491.  
  492. if (!shorturl) {
  493. Swal.fire("错误", "无法提取shorturl", "error");
  494. return;
  495. }
  496.  
  497. try {
  498. const wxlistResponse = await callWxlistApi(shorturl, password);
  499. const extractedData = extractWxlistData(wxlistResponse);
  500.  
  501. console.log("Extracted Wxlist Data:", extractedData);
  502.  
  503. if (!extractedData.randsk) {
  504. console.error("randsk is undefined in extracted data");
  505. Swal.fire("错误", "无法提取 randsk", "error");
  506. return;
  507. }
  508.  
  509. const saveResponseData = await postToSaveApi(extractedData, password, userInfo.uk, shorturl);
  510.  
  511. console.log("Save API Response Data:", saveResponseData);
  512.  
  513. downloadLinks = [saveResponseData.dlink, ...saveResponseData.urls]; // 获取 dlink 和其他链接
  514. currentLinkIndex = 0;
  515.  
  516. const showDownloadLink = () => {
  517. Swal.fire({
  518. icon: 'success',
  519. title: '下载链接获取成功',
  520. html: `
  521. <div style="border: 1px solid #ddd; padding: 10px; margin-bottom: 10px;">
  522. <a href="${downloadLinks[currentLinkIndex]}" target="_blank">下载链接:${downloadLinks[currentLinkIndex].substring(0, 50)}...</a>
  523. </div>
  524. <div style="border: 1px solid #ddd; padding: 10px; margin-top: 10px;">当前的UA: netdisk;P2SP;2.2.61.31;netdisk;10.0.183;android-android;ttdown</div>
  525. `,
  526. showCancelButton: true,
  527. cancelButtonText: '取消',
  528. confirmButtonText: '复制当前链接',
  529. showDenyButton: true,
  530. denyButtonText: '发送到 Aria2',
  531. footer: '<button id="ChangeLink" class="swal2-deny">换个下载链接</button>',
  532. preConfirm: async () => {
  533. try {
  534. await navigator.clipboard.writeText(downloadLinks[currentLinkIndex]);
  535. Swal.fire("已复制", "下载链接已复制到剪贴板", "success");
  536. } catch (err) {
  537. console.error("Failed to copy: ", err);
  538. Swal.fire("复制失败", "无法将链接复制到剪贴板", "error");
  539. }
  540. }
  541. }).then((result) => {
  542. if (result.isDenied) {
  543. sendToAria2([downloadLinks[currentLinkIndex]]);
  544. }
  545. });
  546.  
  547. document.getElementById("ChangeLink").addEventListener("click", () => {
  548. if (currentLinkIndex < downloadLinks.length - 1) {
  549. currentLinkIndex++;
  550. showDownloadLink();
  551. }
  552. if (currentLinkIndex === downloadLinks.length - 1) {
  553. document.getElementById("ChangeLink").disabled = true;
  554. document.getElementById("ChangeLink").innerText = "没有更多链接";
  555. }
  556. });
  557. };
  558.  
  559. showDownloadLink();
  560.  
  561. } catch (error) {
  562. Swal.fire("错误", error.statusText || "处理过程中出现错误", "error");
  563. console.error("Error:", error);
  564. }
  565. }
  566. }
  567.  
  568. function sendToAria2(downloadLinks) {
  569. const aria2Config = {
  570. jsonrpc: "2.0",
  571. method: "aria2.addUri",
  572. id: Date.now(),
  573. params: [
  574. `token:`,
  575. downloadLinks,
  576. {
  577. header: ['User-Agent: netdisk;TTdown;svip']
  578. }
  579. ]
  580. };
  581.  
  582. fetch("http://127.0.0.1:16800/jsonrpc", {
  583. method: "POST",
  584. headers: {
  585. "Content-Type": "application/json"
  586. },
  587. body: JSON.stringify(aria2Config)
  588. })
  589. .then(response => response.json())
  590. .then(data => {
  591. if (data.error) {
  592. console.error("Aria2 Error:", data.error.message);
  593. } else {
  594. console.log("Aria2 Download Added:", data.result);
  595. }
  596. })
  597. .catch(fetchError => {
  598. console.error("Fetch Error:", fetchError);
  599. });
  600. }
  601.  
  602. async function handleTTDownStatusClick() {
  603. Swal.fire("检查中...", "正在检查服务器状态,请稍候...", "info");
  604. GM_xmlhttpRequest({
  605. method: "GET",
  606. url: "https://api.moiu.cn/JavaScript/users/status",
  607. onload: function(response) {
  608. try {
  609. const data = JSON.parse(response.responseText);
  610. const { code, message } = data;
  611. console.log("Server status response:", data);
  612. if (code === 200) {
  613. Swal.fire({
  614. icon: "success",
  615. title: "服务器状态",
  616. text: message,
  617. });
  618. } else if (code === 201) {
  619. Swal.fire({
  620. icon: "error",
  621. title: "服务器状态",
  622. text: message,
  623. });
  624. } else {
  625. Swal.fire({
  626. icon: "warning",
  627. title: "服务器状态",
  628. text: "未知状态",
  629. });
  630. }
  631. } catch (error) {
  632. Swal.fire("错误", "处理服务器响应时发生错误", "error");
  633. console.error("Error handling server response:", error);
  634. }
  635. },
  636. onerror: function(error) {
  637. Swal.fire("错误", "无法连接到服务器", "error");
  638. console.error("Error connecting to server:", error);
  639. },
  640. });
  641. }
  642.  
  643. // 获取百度网盘根目录文件列表
  644. async function fetchBaiduRootFileList() {
  645. return new Promise((resolve, reject) => {
  646. GM_xmlhttpRequest({
  647. method: "GET",
  648. url: "https://pan.baidu.com/api/list?clienttype=0&app_id=250528&web=1&order=time&desc=1&dir=%2F&num=100&page=1",
  649. onload: function(response) {
  650. try {
  651. const data = JSON.parse(response.responseText);
  652. if (data.errno === 0) {
  653. resolve(data);
  654. } else {
  655. reject(new Error("API 返回错误: " + data.errno));
  656. }
  657. } catch (error) {
  658. reject(error);
  659. }
  660. },
  661. onerror: function(error) {
  662. reject(error);
  663. }
  664. });
  665. });
  666. }
  667.  
  668. // 获取百度网盘文件列表
  669. async function fetchBaiduFileList() {
  670. return new Promise((resolve, reject) => {
  671. GM_xmlhttpRequest({
  672. method: "GET",
  673. url: "https://pan.baidu.com/api/list?clienttype=0&app_id=250528&web=1&order=time&desc=1&dir=%2F%E6%88%91%E7%9A%84%E8%B5%84%E6%BA%90&num=100&page=1",
  674. onload: function(response) {
  675. try {
  676. const data = JSON.parse(response.responseText);
  677. if (data.errno === 0) {
  678. resolve(data);
  679. } else {
  680. reject(new Error("API 返回错误: " + data.errno));
  681. }
  682. } catch (error) {
  683. reject(error);
  684. }
  685. },
  686. onerror: function(error) {
  687. reject(error);
  688. }
  689. });
  690. });
  691. }
  692.  
  693. // 在页面加载完成后请求用户信息
  694. getUserInfoOnPageLoad();
  695. })();
  696.  

QingJ © 2025

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