├── README.md ├── README-ScriptCat.md ├── LICENSE └── 123 云盘会员青春版.user.js /README.md: -------------------------------------------------------------------------------- 1 | > [!IMPORTANT] 2 | > 《限速好,限速妙,限速也比阻断好》——百度网盘 3 | > 虽然 123 云盘限制了直链获取。但此脚本仍会继续保持更新,以允许用户继续使用被前端限制的功能。 4 | > 5 | >  6 | > PS. 但凡他们给直链加个 Referer 和 IP 检查也不至于会出现 "生成的直链被恶意用户分发给任意普通用户访问" 的情况……这开发团队也太草台班子了 7 | > 8 | > --- 9 | > 10 | > Q: 哪些网盘都使用了限速技术? 11 | > A: 百度网盘、迅雷云盘、阿里云盘、夸克网盘、UC网盘 12 | > 13 | > --- 14 | > 15 | > ## 123云盘免费用户权益调整通知 16 | > **尊敬的123云盘用户:** 17 | > 18 | > 您好!自上线以来,123云盘始终秉持“大容量存储、不限速下载”的初心,致力于为每一位用户提供安全、稳定、高效的云存储服务。凭借免费且优质的产品体验,我们赢得了广大用户的信任与支持,注册用户规模持续增长。在此,我们向所有支持与陪伴123云盘成长的朋友们致以最诚挚的感谢! 19 | > 20 | > 然而,随着用户量的快速增长,我们也面临着日益严峻的运营挑战。尤其在流量与带宽成本持续攀升的背景下,部分免费用户通过技术手段或集中利用规则漏洞(如通过破解移动端接口绕过限制、游客身份高频下载等)批量注册大量账号,造成了服务器资源的严重挤占和滥用,影响了绝大多数正常用户的使用体验,也对平台的可持续运营构成了威胁。 21 | > 22 | > 为遏制“羊毛党” **(穷逼VIP)** 行为,保障会员及广大普通用户的合法权益,维护公平、健康的服务环境,经过慎重评估与反复测试,我们将对现有免费用户的流量使用规则进行进一步优化调整。新规则将于**即日起**正式生效,具体调整内容如下: 23 | > **1. 【全端统一】免费提取流量由原PC/网页端单日累计上限1GB调整为全端单月累计上限10GB** 24 | > ● 所有免费用户(包括网页端、PC客户端、APP端等)**每月累计提取流量上限为合计10GB**; 25 | > ● **使用PC客户端或官方APP最新版本进行下载**,文件体积可减半抵扣免费赠送流量,单月可累计免费下载**最多20GB的文件**(相当于额外赠送了10GB免费提取流量); 26 | > ● 超出免费额度后,免费用户可按**0.05元/GB**的价格按需购买提取流量,不足10GB按10GB计费; 27 | > ● **强烈建议:用户安装并使用官方客户端**,以获得更快更稳定更流畅的下载体验和更高的免费额度。 28 | > 29 | > 30 | > **2. 【新增限制】音视频在线播放也将计入单月提取流量** 31 | > ● 自新规则生效起,免费**用户在线播放音视频文件**所产生的流量,将**计入当月总提取流量**; 32 | > ● 建议:将常用音视频文件转存至本地或客户端缓存,减少重复在线播放带来的流量消耗。 33 | > 34 | > **3. 【取消权益】游客身份下载小于100MB文件免费权益将终止** 35 | > ● 原“游客用户无需登录即可免费下载小于100MB文件”的权益将终止; 36 | > ● 您仍可通过按0.1元/GB的价格按需购买下载文件,或您可登录后享受每月赠送的免费提取流量; 37 | > ● 此举旨在封堵“爬虫软件批量抓取或高频下载”的漏洞,防止资源被恶意滥用。 38 | > ● 建议:注册并登录您的123云盘账号,绑定手机号,不仅可保障数据安全,还能参与不定期赠送会员活动 39 | > 40 | > **4. 【保留权益】分享流量包机制继续有效** 41 | > ● 分享者若已购买并启用“分享流量包”,其分享的资源在被他人下载时,**仍不占用下载者的单月提取流量额度**; 42 | > ● 该机制将继续保留,鼓励用户通过分享优质内容获得传播价值,同时保障接收方的下载体验。 43 | > 44 | > **无付费意愿用户替代方案** 45 | > 我们理解部分用户暂无开通会员的计划,为此平台将持续推出多种**免费获取提取流量**的途径,包括: 46 | > ● 每日签到领提取流量券 47 | > ● 邀请好友注册得奖励 48 | > ● 文件转存任务奖励 49 | > 相关活动将陆续上线,敬请期待! 50 | > 51 | > **生效时间** 52 | > 本次规则调整将于**即日**起正式生效,适用于所有免费用户(含新注册与老用户)。 53 | > 54 | > 55 | > **温馨提示** 56 | > 123云盘的发展离不开每一位用户的理解与支持。我们深知任何规则的调整都可能带来不便,但请相信:**每一次改变,都是为了走得更稳、更远。** 我们承诺将持续优化产品功能,提升服务质量,努力在“免费”与“可持续”之间找到最佳平衡点,打造一个真正长久、可靠、值得托付的云存储平台。 57 | > 58 | > 如您对本次调整有任何疑问或建议,欢迎通过以下方式联系我们: 59 | > ● 客服邮箱:service@123pan.com 60 | > ● QQ群:725432565、418399181 61 | > ● 微信公众号:123云盘 62 | > ● 官方社群(QQ群、微信群) 63 | > 再次感谢您的理解与支持!祝您使用愉快! 64 | > 65 | > 123云盘 66 | > 2025年11月26日 67 | 68 | 71 | 72 |
“随风潜入夜,润物细无声”
73 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
“随风潜入夜,润物细无声”
3 |
5 | 搭配使用,效果更佳!👋姊妹脚本
6 |
7 | LinkSwift - 直链获取 | 百度网盘会员青春版 | 阿里云盘会员青春版
8 |
9 | ↓ ↓ ↓ ↓ ↓
10 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
336 |339 |风雨送春归,飞雪迎春到。已是悬崖百丈冰,犹有花枝俏。337 |俏也不争春,只把春来报。待到山花烂漫时,她在丛中笑。338 |
http(s): 或 data: 链接", "photo", "string", { "type": "string", "placeholder": "留空将使用已登录账户信息" })}
346 | ${generateHTML("邮箱|对外展示信息|为确保安全 不建议修改", "mail", "string", { "type": "string", "placeholder": "留空将使用已登录账户信息" })}
347 | ${generateHTML("手机号|对外展示信息|为确保安全 不建议修改", "phone", "string", { "type": "number", "placeholder": "留空将使用已登录账户信息" })}
348 | ${generateHTML("账户标识|对外展示信息|为确保安全 不建议修改", "id", "string", { "type": "number", "placeholder": "留空将使用已登录账户信息" })}
349 | ${generateHTML("成长容量等级|对外展示信息|最高可叠加 128 级", "level", "string", { "type": "number", "min": "1", "max": "128", "placeholder": temp.defaults.level })}
350 | ${generateHTML("会员过期时间|对外展示信息|Unix 时间戳", "endtime", "string", { "type": "number", "min": "-2147483648", "max": "253402185600", "placeholder": temp.defaults.endtime })}
351 | ${generateHTML("显示调试信息到控制台", "debug", "boolean")}
352 | 用爱发电不接广,共创开源新环境
感谢您选择会员青春版,喜欢的话就来给个 Star 吧~
`, 415 | }); 416 | 417 | if (dialog.isConfirmed) { 418 | location.reload(); // 刷新页面使设置生效 419 | } 420 | }, 421 | /** 422 | * 等待指定元素加载完成并执行回调 423 | * @author hmjz100 424 | * @description 监听 DOM 元素是否出现,若未出现则每隔一段时间重试,直到找到为止。 425 | * 支持在 iframe 内部查找元素,适用于异步加载场景。 426 | * @param {string} selectorElem - 要等待的目标元素选择器 427 | * @param {Function} actionFunction - 找到元素后执行的回调函数,接收 jQuery 元素作为参数,返回 true 可以不再继续寻找 428 | * @param {boolean} [bWaitOnce=false] - 是否只执行一次回调,默认为 false,如果不设置为 true 的话需要自行判断是否对元素进行操作 429 | * @param {string} [iframeSelector] - 若目标元素位于 iframe 中,传入 iframe 的选择器 430 | * @param {string} [controlKey] - 控制唯一性的键名,用于避免重复处理 431 | */ 432 | waitForKeyElements(selectorElem, actionFunction, bWaitOnce, iframeSelector, controlKey) { 433 | // 初始化管理器 434 | const manager = this.waitForKeyElements.manager || ( 435 | this.waitForKeyElements.manager = { 436 | observers: new WeakMap(), 437 | tasks: new Map(), 438 | instanceCounter: 0 439 | } 440 | ); 441 | const targetDoc = iframeSelector 442 | ? $(iframeSelector).get(0)?.contentDocument 443 | : document; 444 | if (!targetDoc) return; // 无效文档直接返回 445 | // 生成唯一控制键 446 | controlKey = controlKey || `wkfe_${manager.instanceCounter++}`; 447 | // 清理重复任务 448 | const existingTask = manager.tasks.get(controlKey); 449 | if (existingTask) { 450 | existingTask.observer.disconnect(); 451 | manager.tasks.delete(controlKey); 452 | } 453 | // 创建MutationObserver回调 454 | const processElements = () => { 455 | const elements = $(selectorElem, targetDoc); 456 | let foundActive = false; 457 | elements.each((i, el) => { 458 | const jEl = $(el); 459 | const isProcessed = jEl.data(controlKey); 460 | if (isProcessed) return true; // 跳过已处理元素 461 | const cancelAction = actionFunction(jEl); 462 | if (cancelAction) { 463 | foundActive = true; 464 | } else if (bWaitOnce) { 465 | jEl.data(controlKey, true); // 标记已处理 466 | } 467 | }); 468 | // 一次性任务且找到有效元素时清理 469 | if (bWaitOnce && foundActive) { 470 | observer.disconnect(); 471 | manager.tasks.delete(controlKey); 472 | } 473 | }; 474 | // 创建Observer实例 475 | const observer = new MutationObserver(processElements); 476 | // 配置并启动观察 477 | observer.observe(targetDoc.documentElement, { 478 | childList: true, 479 | subtree: true, 480 | attributes: true, 481 | characterData: true 482 | }); 483 | // 注册任务 484 | manager.tasks.set(controlKey, { 485 | observer, 486 | targetDoc 487 | }); 488 | // 立即执行初始检查 489 | processElements(); 490 | }, 491 | } 492 | 493 | let user = base.getSettings(); 494 | 495 | let rules = [ 496 | { 497 | // 用户信息 基本 498 | runat: "end", 499 | match: (url) => url.pathname.includes('api/user/info'), 500 | condition: () => user.vip == true, 501 | action: (res, url) => { 502 | res.data.Vip = true // VIP 503 | res.data.VipLevel = res.data.UserVipDetail.VipCode = user.pvip ? 3 : user.svip ? 2 : 1 504 | 505 | if (user.name) res.data.Nickname = user.name; 506 | if (user.photo) res.data.HeadImage = user.photo + "#/123-pics/head-pic"; 507 | if (user.mail) res.data.Mail = user.mail; 508 | if (user.phone) res.data.Passport = Number(user.phone); 509 | if (user.id) res.data.UID = Number(user.id); 510 | if (user.level) res.data.GrowSpaceAddCount = Number(user.level); 511 | if (user.dads == true) res.data.IsShowAdvertisement = false; 512 | 513 | if (!user.endtime) user.endtime = 253402185600 514 | let vipEndTime = new Date(user.endtime * 1000); 515 | res.data.VipExpire = vipEndTime.toLocaleString(); 516 | // VIP会员|至:2025.12.11 00:00:00 到期|使用中 517 | res.data.UserVipDetailInfos = res.data.UserVipDetail.UserVipDetailInfos = [ 518 | { 519 | VipDesc: '青春创始包:', 520 | TimeDesc: `${new Date(1638288000 * 1000).toLocaleDateString(mount)} 生效`, 521 | }, 522 | { 523 | VipDesc: '衣食所系包:', 524 | TimeDesc: `${new Date(1727539200 * 1000).toLocaleDateString(mount)} 生效`, 525 | }, 526 | { 527 | VipDesc: `${user.svip == true ? "SVIP会员" : "VIP会员"}:`, 528 | TimeDesc: `${vipEndTime.toLocaleDateString(mount)} 到期`, 529 | IsUse: vipEndTime >= new Date(), 530 | endTime: user.endtime, 531 | EndTime: user.endtime, 532 | StartTime: 1638288000 533 | }, 534 | ...res.data.UserVipDetailInfos 535 | ] 536 | if (user.pvip == true) { 537 | res.data.VipExpire = "永久有效"; 538 | res.data.UserVipDetail.UserPermanentVIPDetailInfos = [{ 539 | VipDesc: "长期VIP会员:", 540 | TimeDesc: "永久有效", 541 | IsUse: true 542 | }] 543 | } 544 | 545 | return res; 546 | } 547 | }, 548 | { 549 | // 用户信息 基本 550 | runat: "end", 551 | match: (url) => url.pathname.includes('api/vip/buy_list'), 552 | condition: () => user.vip == true, 553 | action: (res, url) => { 554 | if (res.data?.OrderList) { 555 | function generateOrderNo(date = new Date(), prefix = 'VMH', typeCode = '01', channel = 'V2CS') { 556 | const year = date.getFullYear(); 557 | const month = String(date.getMonth() + 1).padStart(2, '0'); 558 | const day = String(date.getDate()).padStart(2, '0'); 559 | const hours = String(date.getHours()).padStart(2, '0'); 560 | const minutes = String(date.getMinutes()).padStart(2, '0'); 561 | const seconds = String(date.getSeconds()).padStart(2, '0'); 562 | 563 | const datePart = `${year}${month}${day}`; 564 | const timePart = `${hours}${minutes}${seconds}`; 565 | 566 | // 3位随机数(000-999) 567 | const randomPart = String(Math.floor(Math.random() * 1000)).padStart(3, '0'); 568 | 569 | return `${prefix}${datePart}${typeCode}${channel}${timePart}${randomPart}`; 570 | } 571 | 572 | res.data.OrderList = [ 573 | ...(user.pvip == true ? [{ 574 | "orderId": generateOrderNo(new Date()), 575 | "createAt": new Date().toLocaleDateString(mount), 576 | "productExplain": "云盘长期会员(模拟)", 577 | "updateAt": new Date(Date.now() + 60 * 1000).toLocaleDateString(mount), 578 | "amount": 0, 579 | "originAmount": 3000, 580 | "itemType": 1, 581 | "memberLevel": "PVIP", 582 | "isCreditGoods": false, 583 | "signNo": "", 584 | "continuousPayment": 0 585 | }] : []), 586 | { 587 | "orderId": generateOrderNo(new Date(), undefined, "02"), 588 | "createAt": new Date().toLocaleDateString(mount), 589 | "productExplain": `云盘${user.svip == true ? "SVIP" : "VIP"}会员(模拟)`, 590 | "updateAt": new Date(Date.now() + 60 * 1000).toLocaleDateString(mount), 591 | "amount": 0, 592 | "originAmount": 3000, 593 | "itemType": 1, 594 | "memberLevel": user.svip == true ? "SVIP" : "VIP", 595 | "isCreditGoods": false, 596 | "signNo": "", 597 | "continuousPayment": 0 598 | }, 599 | ...res.data.OrderList 600 | ] 601 | } 602 | return res; 603 | } 604 | }, 605 | { 606 | // 用户信息 基本 607 | runat: "end", 608 | match: (url) => url.pathname.includes('api/user/benefit'), 609 | condition: () => user.vip == true, 610 | action: (res, url) => { 611 | if (res.data?.benefitList) { 612 | /* 613 | { 614 | "benefitType": "会员权益", 615 | "desc": "VIP", 616 | "sourceType": "123云盘团队赠送", 617 | }, 618 | { 619 | "benefitType": "长期容量", 620 | "desc": "2TB", 621 | "sourceType": "系统赠送", 622 | }, 623 | { 624 | "benefitType": "存储容量", 625 | "desc": "18TB", 626 | "sourceType": "VIP会员权益", 627 | }, 628 | { 629 | "benefitType": "直链流量", 630 | "desc": "10GB未用部分将在有效期结束时清零", 631 | "sourceType": "VIP会员权益", 632 | }, 633 | { 634 | "benefitType": "分享流量", 635 | "desc": "10GB未用部分将在有效期结束时清零", 636 | "sourceType": "VIP会员权益", 637 | } 638 | */ 639 | res.data.benefitList = [ 640 | ...(user.pvip == true ? [{ 641 | "benefitType": "会员权益", 642 | "desc": "长期VIP(模拟)", 643 | "startTime": new Date(1638288000 * 1000).toLocaleDateString(mount), 644 | "endTime": "", 645 | "sourceType": "123 云盘会员青春版", 646 | "isEffect": true 647 | }] : []), 648 | { 649 | "benefitType": "会员权益", 650 | "desc": `${user.svip == true ? "SVIP" : "VIP"}(模拟)`, 651 | "startTime": new Date(1638288000 * 1000).toLocaleDateString(mount), 652 | "endTime": new Date(user.endtime * 1000).toLocaleDateString(mount), 653 | "sourceType": "123 云盘会员青春版", 654 | "isEffect": true 655 | }, 656 | ...res.data.benefitList 657 | ] 658 | } 659 | return res; 660 | } 661 | }, 662 | { 663 | // 用户信息 报告 664 | runat: "start", 665 | match: (url) => url.pathname.includes('user/report/info'), 666 | condition: () => user.vip == true, 667 | action: (res, url) => { 668 | res = { 669 | "code": 0, 670 | "message": "ok", 671 | "data": { 672 | "vipType": user.pvip ? 3 : user.svip ? 2 : 1, 673 | "vipSub": 0, 674 | "developSub": 0, 675 | "packType": [0] 676 | }, 677 | "x-traceID": null 678 | }; 679 | return res; 680 | } 681 | }, 682 | { 683 | // 文件信息 下载 684 | runat: "end", 685 | match: (url) => ['file/download_info', 'file/batch_download_info', 'share/download/info', 'file/batch_download_share_info'].some(path => url.pathname.includes(path)), 686 | condition: () => true, 687 | action: (res, url) => { 688 | if (res.data && (res.data.DownloadUrl || res.data.DownloadURL)) { 689 | // 统一处理 DownloadUrl / DownloadURL 690 | let origKey = res.data.DownloadUrl ? 'DownloadUrl' : 'DownloadURL'; 691 | let origURL = new URL(res.data[origKey]); 692 | let finalURL; 693 | if (origURL.origin.includes("web-pro")) { 694 | let params = ((url) => { try { return decodeURIComponent(atob(url)) } catch { return atob(url) } })(origURL.searchParams.get('params')); 695 | let directURL = new URL(params, origURL.origin); 696 | directURL.searchParams.set('auto_redirect', 0); 697 | origURL.searchParams.set('params', btoa(directURL.href)); 698 | finalURL = decodeURIComponent(origURL.href); 699 | } else { 700 | origURL.searchParams.set('auto_redirect', 0); 701 | let newURL = new URL('https://web-pro2.123952.com/download-v2/ ', origURL.origin); 702 | newURL.searchParams.set('params', btoa(encodeURI(origURL.href))); 703 | newURL.searchParams.set('is_s3', 0); 704 | finalURL = decodeURIComponent(newURL.href); 705 | } 706 | res.data[origKey] = finalURL; 707 | } 708 | if (res?.code === 5113 || res?.code === 5114 || res?.message?.includes("下载流量已超出")) { 709 | if (url.pathname.includes("batch_download")) { 710 | res = { 711 | code: 400, 712 | message: "请不要多选文件!服务器不允许免费使用打包下载,已为您拦截支付窗口(123 云盘会员青春版)", 713 | data: null 714 | }; 715 | } else { 716 | res = { 717 | code: 400, 718 | message: "您今日下载流量已超出限制。服务器不允许免费获取下载直链,已为您拦截支付窗口(123 云盘会员青春版)", 719 | data: null 720 | } 721 | } 722 | } 723 | return res; 724 | } 725 | }, 726 | { 727 | // 文件信息 下载 728 | runat: "header", 729 | match: (url) => ['file/download_info', 'file/batch_download_info', 'share/download/info', 'file/batch_download_share_info'].some(path => url.pathname.includes(path)), 730 | condition: () => true, 731 | action: (res, url) => { 732 | res.platform = "android"; // 这是典型的安卓思维,安卓逻辑,安卓后端,安卓代码,安卓安卓…… 733 | return res; 734 | } 735 | }, 736 | { 737 | // 文件信息 视频 738 | runat: "end", 739 | match: (url) => url.pathname.includes("api/video/play/info"), 740 | condition: () => true, 741 | action: (res, url) => { 742 | // 移除没有播放链接的选项 743 | if (res.data?.video_play_info) res.data.video_play_info = res.data.video_play_info.filter(item => item.url !== ""); 744 | return res; 745 | } 746 | }, 747 | { 748 | // 手机验证码、邮箱验证码、忘记密码、修改密码、修改信息、账号注销、设备注销、创建支付、邮件验证 749 | runat: "start", 750 | match: (url) => ['user/get_vcode', 'get/mail_code', 'user/forget_pwd', 'user/modify_passport', '/user/whether/modify_passport', 'user/modify_info', 'identify/verify', 'user/log_off', 'user/kick_device', 'order/prepayment', 'option/mail'].some(path => url.pathname.includes(path)), 751 | condition: () => user.mail || user.phone || user.id, 752 | action: (res, url) => { 753 | let numbers = [5107, 5104, 5300, 6006, 6001, 100011, 5012]; 754 | res = { 755 | "code": url.pathname.includes('order/prepayment') ? numbers[Math.floor(Math.random() * numbers.length)] : 400, 756 | "message": "为确保账户安全,修改任意一个关键数据(邮箱、手机号、ID)后,将禁止执行本操作(123 云盘会员青春版)", 757 | "data": null 758 | } 759 | return res; 760 | } 761 | }, 762 | { 763 | // 获取基础地址 764 | runat: "start", 765 | match: (url) => url.pathname.includes('api/getBaseUrl'), 766 | condition: () => true, 767 | action: (res, url) => { 768 | res = { "apiUrl": location.origin } 769 | return res; 770 | } 771 | }, 772 | { 773 | // 获取服务器时间 774 | runat: "start", 775 | match: (url) => url.pathname.includes('api/get/server/time'), 776 | condition: () => true, 777 | action: (res, url) => { 778 | res = { 779 | "code": 0, 780 | "message": "success", 781 | "data": { 782 | "timestamp": Math.floor(Date.now() / 1000) 783 | } 784 | } 785 | return res; 786 | } 787 | }, 788 | { 789 | // 汇报信息 790 | runat: "start", 791 | match: (url) => url.pathname.includes('transfer/metrics/whether/report'), 792 | condition: () => true, 793 | action: (res, url) => { 794 | res = { 795 | "code": 0, 796 | "message": "success", 797 | "data": { 798 | "dll_err_open": 1, 799 | "download_coroutine": 10, 800 | "duration": 300, 801 | "pc_report": 0, 802 | "status": false, 803 | "upload_coroutine": 5, 804 | "web_report": 0 805 | } 806 | } 807 | return res; 808 | } 809 | }, 810 | { 811 | // 汇报信息 视频 812 | runat: "start", 813 | match: (url) => ['api/metrics/up', 'video/metrics/whether/report', 'api/video/metrics', 'restful/goapi/v1/content/payment/purchase-status'].some(path => url.pathname.includes(path)), 814 | condition: () => true, 815 | action: (res, url) => { 816 | res = { 817 | "code": 0, 818 | "message": "success", 819 | "data": { 820 | "status": true 821 | } 822 | } 823 | return res; 824 | } 825 | }, 826 | { 827 | // 汇报信息 友盟数据派 828 | runat: "start", 829 | match: (url) => url.host.includes('shujupie') && url.pathname.includes('web_logs'), 830 | condition: () => true, 831 | action: (res, url) => { 832 | let json = { "install_campaign": "unknown", "install_channel": "unknown", "install_referer_domain": "unknown", "install_datetime": "unknown" } 833 | res = { 834 | "imprint": btoa(JSON.stringify(json)) 835 | } 836 | return res; 837 | } 838 | }, 839 | { 840 | // 汇报信息 阿里业务实时监控服务ARMS 841 | runat: "start", 842 | match: (url) => url.host.includes('arms-retcode') && url.pathname.includes('r.png'), 843 | condition: () => true, 844 | action: (res, url) => { 845 | res = ""; 846 | return res; 847 | } 848 | }, 849 | ]; 850 | 851 | /** 852 | * 控制台输出 853 | * @author 油小猴 854 | * @author hmjz100 855 | * @description 来自【网盘智能识别助手】,有改动 856 | */ 857 | console.log(`%c %c 123 云盘会员青春版\n虚拟 123 云盘会员,可超 1GB 上限下载\n仓库:https://github.com/hmjz100/123panYouthMember\n版本:${info.version}\n领域:${(window.self !== window.top ? "[iframe] " : "") + (document.title ? (document.title + " (" + location.origin + location.pathname + ")") : location.href)}`, `background:url(${info.icon}) center center no-repeat;background-size:12px;padding:3px`, `padding:2px`); 858 | 859 | var originalFetch = fetch; 860 | unsafeWindow.fetch = base.hooker.fetch; 861 | var originalSend = XMLHttpRequest.prototype.send; 862 | unsafeWindow.XMLHttpRequest.prototype.send = base.hooker.send; 863 | var originalOpen = XMLHttpRequest.prototype.open; 864 | unsafeWindow.XMLHttpRequest.prototype.open = base.hooker.open; 865 | var originalSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader; 866 | unsafeWindow.XMLHttpRequest.prototype.setRequestHeader = base.hooker.setRequestHeader; 867 | var originalSendBeacon = navigator.sendBeacon; 868 | navigator.sendBeacon = base.hooker.sendBeacon; 869 | var originalAtob = atob; 870 | unsafeWindow.atob = base.hooker.atob; 871 | 872 | GM_registerMenuCommand('⚙️ 设置', () => { 873 | base.showSettings(); 874 | }); 875 | 876 | // 旧版 分享 提示 877 | base.waitForKeyElements(".contentBorder .cleanNet", (element) => { 878 | if (element.find("div").data("replaced")) return; 879 | let text = "感谢您选择会员青春版,喜欢的话就来给个 Star 吧~ >>>"; 880 | function replaceElement(target) { 881 | let div = $(""); 882 | div.data("replaced", true); 883 | 884 | let githubLink = $(`${text}`); 885 | githubLink.off("click").on("click", (e) => { 886 | window.open("https://github.com/hmjz100/123panYouthMember", "_blank"); 887 | }); 888 | div.append(githubLink); 889 | div.append("