🏠 Home 

(改)百度网盘会员青春版

《也许同类型中最好用?》系列 - 显示百度网盘身份信息为会员,支持使用视频倍速、生成字幕、下载AI字幕、关闭AI聊天、修改头像、修改用户名等功能,自定义程度超高!需要修改头部代码来配置显示内容(非常简单!)


安装此脚本?
作者推荐脚本

您可能也喜欢123 云盘会员青春版

安装此脚本
  1. // ==UserScript==
  2. // @name (改)百度网盘会员青春版
  3. // @author Hmjz100、Gwen
  4. // @namespace github.com/hmjz100
  5. // @version 1.2.6
  6. // @description 《也许同类型中最好用?》系列 - 显示百度网盘身份信息为会员,支持使用视频倍速、生成字幕、下载AI字幕、关闭AI聊天、修改头像、修改用户名等功能,自定义程度超高!需要修改头部代码来配置显示内容(非常简单!)
  7. // @icon data:image/png;base64,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
  8. // @license MIT
  9. // @match *://pan.baidu.com/*
  10. // @match *://yun.baidu.com/*
  11. // @grant GM_addStyle
  12. // @grant GM_openInTab
  13. // @grant unsafeWindow
  14. // @run-at document-start
  15. // @require https://unpkg.com/jquery@3.6.0/dist/jquery.min.js
  16. // ==/UserScript==
  17. (function () {
  18. 'use strict';
  19. var user = {
  20. // 以下设置项中,常规项目(就是以//开头注释的项目)除非特殊说明,否则一般 0 为关闭,1 为开启
  21. vip: 1, // 开启会员修改(总开关)
  22. svip: 1, // 显示为超级会员,建议 1
  23. previous: 0, // 显示为会员过期,建议 0,变为仅修改历史最高的会员类型、等级
  24. // 以下是自定义项目(以/*开头注释的项目),修改也非常简单
  25. /*
  26. 自定义用户名与头像,留空则使用已登录账号数据
  27. */
  28. name: "百湿不得其解",
  29. photo: "https://bkimg.cdn.bcebos.com/pic/cdbf6c81800a19d8bc3e5cfd95ab958ba61ea9d3e8b3",
  30. /*
  31. 会员等级与成长值,可留空为""
  32. 普通会员等级最高为 10 (以前是 8)
  33. 超级会员等级最高为 10
  34. 超级会员 1~10 的成长值分别为 0 1000 3000 7000 15000 27000 43000 56000 88000 152000,后两个值为猜测
  35. */
  36. level: 10,
  37. point: 152000,
  38. /*
  39. 自定义会员ID,留空则使用已登录账号数据
  40. 据网上观察应为六位数,现在亦可输入文本
  41. */
  42. vip_id: "000001 - What's your problem?",
  43. /*
  44. 会员过期时间 格式为Unix时间戳,可留空为""
  45. 1562118175 - 2019-07-03 09:42:55 (宏彦获水时)
  46. 2147483648 - 2038-01-19 11:14:08 (2038问题时)
  47. 253402185600 - 9999-12-31 00:00:00 (终极时)
  48. */
  49. endtime: 253402185600,
  50. // 以下的常规项目(就是以//开头注释的项目)均为独立功能,不受总开关控制
  51. aiChat: 0, // 显示云一朵 AI 聊天的相关功能,建议 0,相关功能大多数都是在右上角的 AI 聊天的右侧边栏入口中
  52. aiCollect: 0, // 显示百度网盘 AI 看的相关入口,建议 0,作用于左侧边栏
  53. versionSwitchButton: 1, // 显示百度网盘的新旧版界面切换按钮,建议 1
  54. feedbackButton: 0, // 显示百度网盘的反馈录屏工具的相关入口,建议 0
  55. pfileView: 1, // 在线打开文档时,使用新版在线文档查看器,而不是旧版的在线 WPS 文档查看器,建议 1
  56. analytics: 0, // 允许百度网盘网页分析浏览信息,建议 0,分析原理是以 new Image 或 document.createElement("img") 的形式让浏览器访问特殊的图片来给服务器传递信息
  57. adTime: 0.0001, // 视频播放时的广告(等待)时间,建议 0.0001
  58. debug: 0, // 显示本脚本的调试信息到 JavaScript 控制台中,建议 0,另外,1 显示所有,2 仅显示 Hook 修改参数,3 仅显示禁用网页分析
  59. // 以下是关键参数,不能修改
  60. adToken: null,
  61. }
  62. var originalOpen = XMLHttpRequest.prototype.open;
  63. unsafeWindow.XMLHttpRequest.prototype.open = function (method, url) {
  64. url = new URL(url, window.location.origin).href
  65. if (url.includes('/api/loginStatus')) {
  66. this.addEventListener('readystatechange', function () {
  67. if (this.readyState == 4) {
  68. let res, oriRes
  69. try {
  70. res = JSON.parse(this.responseText), oriRes = JSON.parse(this.responseText)
  71. } catch (e) {
  72. res = this.response, oriRes = this.response
  73. }
  74. res.login_info.vip_type && user.vip === 1 && user.previous === 0 ? res.login_info.vip_type = `${user.svip === 1 ? 2 : 1}1` : ""
  75. res.login_info.vip_identity && user.vip === 1 && user.previous === 0 ? res.login_info.vip_identity = Number(`${user.svip === 1 ? 2 : 1}1`) : ""
  76. res.login_info.vip_level && user.vip === 1 && user.previous === 0 ? res.login_info.vip_level = user.level : ""
  77. res.login_info.vip_point && user.vip === 1 && user.previous === 0 ? res.login_info.vip_point = user.point : ""
  78. res.login_info["photo_url"] && user.photo ? res.login_info["photo_url"] = user.photo : ""
  79. res.login_info.username && user.name ? res.login_info.username = user.name : ""
  80. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook XHR", "\n请求地址:", url, "\n原始回复:", oriRes, "\n修改回复:", res)
  81. Object.defineProperty(this, "responseText", {
  82. writable: true,
  83. });
  84. this.responseText = JSON.stringify(res)
  85. Object.defineProperty(this, "responseText", {
  86. writable: false,
  87. });
  88. }
  89. })
  90. originalOpen.apply(this, arguments);
  91. } else if (url.includes('/user/info')) {
  92. user.vip === 1 && user.previous === 0 ? this.addEventListener('readystatechange', function () {
  93. if (this.readyState == 4) {
  94. let res, oriRes
  95. try {
  96. res = JSON.parse(this.responseText), oriRes = JSON.parse(this.responseText)
  97. } catch (e) {
  98. res = this.response, oriRes = this.response
  99. }
  100. res.user_info.is_vip ? res.user_info.is_vip = user.vip : ""
  101. res.user_info.is_svip ? res.user_info.is_svip = user.svip : ""
  102. res.user_info.is_plus_buy ? res.user_info.is_plus_buy = user.svip : ""
  103. res.user_info.plus_buy_hit ? res.user_info.plus_buy_hit = user.svip : ""
  104. res.user_info.is_vip_v2 && user.level && user.level >= 2 ? res.user_info.is_vip_v2 = user.vip : "";
  105. res.user_info.is_vip_v2_new && user.level && user.level >= 2 ? res.user_info.is_vip_v2_new = user.vip : "";
  106. res.user_info.username && user.name ? res.user_info.username = user.name : "";
  107. res.user_info.photo && user.photo ? res.user_info.photo = user.photo : "";
  108. res.user_info.vipsid && user.vip_id ? res.user_info.vipsid = user.vip_id : "";
  109. res.user_info.phone ? res.user_info.phone = "01095099" : "";
  110. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook XHR", "\n请求地址:", url, "\n原始回复:", oriRes, "\n修改回复:", res)
  111. Object.defineProperty(this, "responseText", {
  112. writable: true,
  113. });
  114. Object.defineProperty(this, "response", {
  115. writable: true,
  116. });
  117. this.response = JSON.stringify(res)
  118. this.responseText = JSON.stringify(res)
  119. }
  120. }) : ""
  121. originalOpen.apply(this, arguments);
  122. } else if (url.includes('/membership/user') && !url.includes('method=rights')) {
  123. this.addEventListener('readystatechange', function () {
  124. if (this.readyState == 4) {
  125. let res, oriRes
  126. try {
  127. res = JSON.parse(this.responseText), oriRes = JSON.parse(this.responseText)
  128. } catch (e) {
  129. res = this.response, oriRes = this.response
  130. }
  131. // 决定网页显示会员标识
  132. user.vip === 1 && user.previous === 0 ? res.current_product = {
  133. "cluster": "vip",
  134. "detail_cluster": user.svip === 1 ? "svip" : "vip", // 决定修改会员标签
  135. "product_type": user.svip === 1 ? `vip2_1m_auto` : `vip_1m_auto`,
  136. "product_id": "12187135090581539740"
  137. } : ""
  138. user.vip === 1 && user.previous === 0 ? res.current_product_v2 = {
  139. "cluster": "vip",
  140. "detail_cluster": user.svip === 1 ? "svip" : "vip", // 决定修改会员标签
  141. "product_type": user.svip === 1 ? `vip2_1m_auto` : `vip_1m_auto`,
  142. "product_id": "12187135090581539740"
  143. } : ""
  144. // 决定网页显示会员等级
  145. user.vip === 1 ? res.level_info = {
  146. ...res.level_info,
  147. "current_value": user.point, // 决定所有会员标签
  148. "current_level": user.level, // 决定所有会员标签
  149. "history_value": user.point,
  150. "history_level": user.level,
  151. "v10_id": user.vip_id ? user.vip_id : "",
  152. "last_manual_collection_time": 0
  153. } : ""
  154. if (user.vip === 1 && res.privilege_list) {
  155. [...res.privilege_list].forEach(item => {
  156. item.free_count = 100
  157. })
  158. }
  159. // 决定网页展示会员剩余时间
  160. user.vip === 1 && user.previous === 0 && user.svip === 0 ? res.reminder = {
  161. ...res.reminder,
  162. "vip": {
  163. "leftseconds": ((user.endtime ? user.endtime : 2147483648) * 1000 - Date.now()) / 1000,
  164. "nextState": "normal"
  165. }
  166. } : user.svip === 1 && user.previous === 0 ? res.reminder = {
  167. ...res.reminder,
  168. "svip": {
  169. "leftseconds": ((user.endtime ? user.endtime : 2147483648) * 1000 - Date.now()) / 1000,
  170. "nextState": "normal"
  171. }
  172. } : ""
  173. // 其它(已有套餐、之前套餐)
  174. user.vip === 1 && user.previous === 0 && res.product_infos ? res.product_infos = [{
  175. "product_id": "12187135090581539740",
  176. "buy_time": "946656000",
  177. "start_time": 946656000,
  178. "end_time": user.endtime ? user.endtime : 2147483648,
  179. "cluster": "vip",
  180. "detail_cluster": user.svip === 1 ? "svip" : "vip",
  181. "product_name": user.svip === 1 ? "svip2_nd" : "vip1_nd",
  182. "cur_svip_type": "year",
  183. "function_num": 8,
  184. "status": 0,
  185. "buy_description": "超级SVIP套餐(永久)",
  186. "product_description": "自打百度一诞生我就买了!"
  187. }, ...res.product_infos] : ""
  188. user.vip === 1 ? res.previous_product = {
  189. "cluster": "vip",
  190. "detail_cluster": user.svip === 1 ? "svip" : "vip", // 决定之前会员标签
  191. "product_type": user.svip === 1 ? `vip2_1m_auto` : `vip_1m_auto`,
  192. "expired_time": 946656000
  193. } : ""
  194. user.vip === 1 ? res.previous_product_v2 = {
  195. "cluster": "vip",
  196. "detail_cluster": user.svip === 1 ? "svip" : "vip", // 决定之前会员标签
  197. "product_type": user.svip === 1 ? `vip2_1m_auto` : `vip_1m_auto`,
  198. "expired_time": 946656000
  199. } : ""
  200. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook XHR", "\n请求地址:", url, "\n原始回复:", oriRes, "\n修改回复:", res)
  201. Object.defineProperty(this, "response", {
  202. writable: true,
  203. });
  204. Object.defineProperty(this, "responseText", {
  205. writable: true,
  206. });
  207. this.response = JSON.stringify(res)
  208. this.responseText = JSON.stringify(res)
  209. }
  210. })
  211. originalOpen.apply(this, arguments);
  212. } else if (url.includes('/api/streaming') && !url.includes('M3U8_SUBTITLE_SRT')) { //获取视频m3u8接口
  213. let pureURL = url.replace(/vip=\d+/, 'vip=0').replace(/_1080&/, '_720&')
  214. if (user.adToken) {
  215. pureURL += ('&adToken=' + encodeURIComponent(user.adToken))
  216. this.adToken = user.adToken
  217. user.adToken = null
  218. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook XHR", "\n请求地址:", url, "\n修改地址:", pureURL)
  219. originalOpen.call(this, method, pureURL, false);
  220. } else {
  221. this.addEventListener('readystatechange', function () {
  222. if (this.readyState == 4 && this.responseText[0] == '{') {
  223. let res = JSON.parse(this.responseText), oriRes = JSON.parse(this.responseText), log
  224. user.adToken = res.adToken
  225. let m3uRequest = new XMLHttpRequest();
  226. m3uRequest.open(method, pureURL, false);
  227. m3uRequest.send();
  228. let m3uText = m3uRequest.responseText
  229. Object.defineProperty(this, "status", {
  230. writable: true,
  231. });
  232. this.status = m3uRequest.status;
  233. if (m3uText.startsWith('#EXTM3U')) {
  234. log = "M3U8预览\n" + m3uText.split('\n').slice(0, 5).join('\n')
  235. res = m3uText
  236. } else {
  237. res = JSON.parse(m3uText)
  238. res.errno = 133
  239. user.adTime ? (res.ltime = user.adTime) : (res.ltime = 0.0001)
  240. user.adTime ? (res.adTime = user.adTime) : (res.adTime = 0.0001)
  241. }
  242. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook XHR", "\n请求地址:", url, "\n原始回复:", oriRes, "\n修改回复:", log || res)
  243. Object.defineProperty(this, "responseText", {
  244. writable: true,
  245. });
  246. this.responseText = res;
  247. }
  248. })
  249. originalOpen.call(this, method, pureURL);
  250. }
  251. } else if (url.includes('/api/streaming') && url.includes('M3U8_SUBTITLE_SRT')) {
  252. this.addEventListener('readystatechange', function () {
  253. if (this.readyState == 4 && this.responseText.includes('#EXT-X-MEDIA:TYPE=SUBTITLES')) {
  254. let res = this.response
  255. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook XHR", "\n请求地址:", url, "\n原始回复:", res)
  256. var nameMatch = this.responseText.match(/NAME="([^"]+)"/);
  257. var aiSubMatch = this.responseText.match(/AI-SUB=([^,\s]+)/);
  258. var urlMatch = this.responseText.match(/(https?:\/\/[^\s]+)/);
  259. if (nameMatch && urlMatch && aiSubMatch && aiSubMatch[1] === 'YES') {
  260. var subName = nameMatch[1];
  261. var aiSub = aiSubMatch[1] === 'YES' ? 'AI-' : '';
  262. var subUrl = urlMatch[0];
  263. waitForKeyElements(`aside.vp-aside div.vp-tabs div.vp-tabs__content`, function (element) {
  264. var button = $(`<span id="downloads"><h1>[独家功能] AI字幕均为逐句分割而非整段分割</h1><br/><button class="downloadSubtitle" data-href="${subUrl}" data-name="${aiSub}${subName}.srt"><i class="u-icon-download-bold" style="vertical-align: text-bottom;"></i> ${aiSub}${subName} (Blob下载,自动命名)</button><a class="downloadSubtitle" href="${subUrl}" title="默认命名是乱码,别忘了加上后缀 .srt 哦" target="_blank"><i class="u-icon-download-bold" style="vertical-align: text-bottom;"></i> ${aiSub}${subName} (打开链接,手动命名)</a></span>`)
  265. button.find("button").on('click', async function (element) {
  266. if (!$(this).data('href')) return;
  267. element.preventDefault();
  268. element = $(this)
  269. let ins = {};
  270. let progress = {};
  271. let index = element.data('index');
  272. element.prop('disabled', true);
  273. ins[index] = setInterval(function () {
  274. let prog = +progress[index] || 0;
  275. element.html('<i class="u-icon-download-bold" style="vertical-align: text-bottom;"></i> 已下载 ' + prog + "%");
  276. }, 10);
  277. try {
  278. let response = await unsafeWindow.fetch(element.data('href'));
  279. if (!response.ok) throw new Error('网络响应失败');
  280. let totalSize = response.headers.get('Content-Length') || 0;
  281. let reader = response.body.getReader();
  282. let receivedLength = 0;
  283. let chunks = [];
  284. while (true) {
  285. const { done, value } = await reader.read();
  286. if (done) break;
  287. chunks.push(value);
  288. receivedLength += value.length;
  289. progress[index] = ((receivedLength / totalSize) * 100).toFixed(1);
  290. }
  291. const blob = new Blob(chunks);
  292. clearInterval(ins[index]);
  293. progress[index] = 100;
  294. element.html('<i class="u-icon-download-bold" style="vertical-align: text-bottom;"></i> 下载完成,浏览器弹框中')
  295. const url = URL.createObjectURL(blob);
  296. const a = document.createElement('a');
  297. a.href = url;
  298. a.download = `${element.data('name')}`;
  299. a.style.display = 'none';
  300. document.body.appendChild(a);
  301. a.click();
  302. setTimeout(() => {
  303. URL.revokeObjectURL(url);
  304. document.body.removeChild(a);
  305. }, 1000);
  306. setTimeout(function () {
  307. element.html(`<i class="u-icon-download-bold" style="vertical-align: text-bottom;"></i> ${aiSub}${subName} (Blob下载,自动命名)`);
  308. $(this).prop('disabled', false);
  309. }.bind(this), 3000);
  310. } catch (error) {
  311. clearInterval(ins[index]);
  312. console.error("下载失败:", error);
  313. element.html('<i class="u-icon-download-bold" style="vertical-align: text-bottom;"></i> 下载失败,点击重试?');
  314. $(this).prop('disabled', false).one('click', async function () {
  315. $(this).trigger('click');
  316. });
  317. }
  318. })
  319. element.before(button)
  320. })
  321. }
  322. }
  323. });
  324. originalOpen.apply(this, arguments);
  325. } else if (url.includes('/msg/streaming') || url.includes('/share/streaming')) {
  326. this.addEventListener('readystatechange', function () {
  327. if (this.readyState == 4 && this.responseText[0] == '{') {
  328. let res, oriRes
  329. try {
  330. res = JSON.parse(this.responseText), oriRes = JSON.parse(this.responseText)
  331. } catch (e) {
  332. res = this.response, oriRes = this.response
  333. }
  334. user.adTime ? (res.ltime = user.adTime) : (res.ltime = 0.0001)
  335. user.adTime ? (res.adTime = user.adTime) : (res.adTime = 0.0001)
  336. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook XHR", "\n请求地址:", url, "\n原始回复:", oriRes, "\n修改回复:", res)
  337. Object.defineProperty(this, 'responseText', {
  338. writable: true,
  339. })
  340. this.responseText = JSON.stringify(res)
  341. }
  342. })
  343. originalOpen.apply(this, arguments);
  344. } else if (url.includes('/api/getsyscfg') && url.includes('huge_upgrade')) {
  345. this.addEventListener('readystatechange', function () {
  346. if (this.readyState == 4) {
  347. let res, oriRes
  348. try {
  349. res = JSON.parse(this.responseText), oriRes = JSON.parse(this.responseText)
  350. } catch (e) {
  351. res = this.response, oriRes = this.response
  352. }
  353. res.huge_upgrade.cfg_list[1].show_features = (user.feedbackButton === 0 ? "0" : "1")
  354. res.huge_upgrade.cfg_list[0].new_nav_show = (user.versionSwitchButton === 0 ? "0" : "1")
  355. res.huge_upgrade.cfg_list[0].new_nav_href = "https://pan.baidu.com/disk/main"
  356. res.huge_upgrade.cfg_list[0].old_nav_show = (user.versionSwitchButton === 0 ? "0" : "1")
  357. res.huge_upgrade.cfg_list[0].old_nav_href = "https://pan.baidu.com/disk/home?stayAtHome=true"
  358. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook XHR", "\n请求地址:", url, "\n原始回复:", oriRes, "\n修改回复:", res)
  359. Object.defineProperty(this, "response", {
  360. writable: true,
  361. });
  362. Object.defineProperty(this, "responseText", {
  363. writable: true,
  364. });
  365. this.response = JSON.stringify(res)
  366. this.responseText = JSON.stringify(res)
  367. }
  368. })
  369. originalOpen.apply(this, arguments);
  370. } else if (url.includes('/api/getsyscfg') && url.includes('netdisk_docchat_config')) {
  371. user.aiChat === 0 ? this.addEventListener('readystatechange', function () {
  372. if (this.readyState == 4) {
  373. let res, oriRes
  374. try {
  375. res = JSON.parse(this.responseText), oriRes = JSON.parse(this.responseText)
  376. } catch (e) {
  377. res = this.response, oriRes = this.response
  378. }
  379. res.netdisk_docchat_config.cfg_list[0].is_chat_show = "0"
  380. res.netdisk_docchat_config.cfg_list[0].is_docview_chat_auto_show = "0"
  381. res.netdisk_docchat_config.cfg_list[0].is_docview_chat_show = "0"
  382. res.netdisk_docchat_config.cfg_list[0].is_home_need_out_sug = "0"
  383. res.netdisk_docchat_config.cfg_list[0].is_main_chat_show = "0"
  384. res.netdisk_docchat_config.cfg_list[0].is_videoview_chat_auto_show = "0"
  385. res.netdisk_docchat_config.cfg_list[0].is_videoview_chat_show = "0"
  386. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook XHR", "\n请求地址:", url, "\n原始回复:", oriRes, "\n修改回复:", res)
  387. Object.defineProperty(this, "response", {
  388. writable: true,
  389. });
  390. Object.defineProperty(this, "responseText", {
  391. writable: true,
  392. });
  393. this.response = JSON.stringify(res)
  394. this.responseText = JSON.stringify(res)
  395. }
  396. }) : ""
  397. originalOpen.apply(this, arguments);
  398. } else if (url.includes('/api/getsyscfg') && url.includes('ai_collect')) {
  399. user.aiCollect === 0 ? this.addEventListener('readystatechange', function () {
  400. if (this.readyState == 4) {
  401. let res, oriRes
  402. try {
  403. res = JSON.parse(this.responseText), oriRes = JSON.parse(this.responseText)
  404. } catch (e) {
  405. res = this.response, oriRes = this.response
  406. }
  407. res.ai_collect.cfg_list[0].is_ai_collect_show = "0"
  408. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook XHR", "\n请求地址:", url, "\n原始回复:", oriRes, "\n修改回复:", res)
  409. Object.defineProperty(this, "response", {
  410. writable: true,
  411. });
  412. Object.defineProperty(this, "responseText", {
  413. writable: true,
  414. });
  415. this.response = JSON.stringify(res)
  416. this.responseText = JSON.stringify(res)
  417. }
  418. }) : ""
  419. originalOpen.apply(this, arguments);
  420. } else if (url.includes('/api/getsyscfg') && url.includes('netdisk_docview_config')) {
  421. this.addEventListener('readystatechange', function () {
  422. if (this.readyState == 4) {
  423. let res, oriRes
  424. try {
  425. res = JSON.parse(this.responseText), oriRes = JSON.parse(this.responseText)
  426. } catch (e) {
  427. res = this.response, oriRes = this.response
  428. }
  429. res.netdisk_docview_config.cfg_list[0].auto_search_to_ai = (user.aiChat === 0 ? "0" : "1")
  430. res.netdisk_docview_config.cfg_list[0].use_pfile_for_doc = (user.pfileView === 0 ? "0" : "1")
  431. res.netdisk_docview_config.cfg_list[0].use_pfile_for_ppt = (user.pfileView === 0 ? "0" : "1")
  432. res.netdisk_docview_config.cfg_list[0].use_pfile_reader = (user.pfileView === 0 ? "0" : "1")
  433. res.netdisk_docview_config.cfg_list[0].use_wps_reader = (user.pfileView === 0 ? "1" : "0")
  434. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook XHR", "\n请求地址:", url, "\n原始回复:", oriRes, "\n修改回复:", res)
  435. Object.defineProperty(this, "response", {
  436. writable: true,
  437. });
  438. Object.defineProperty(this, "responseText", {
  439. writable: true,
  440. });
  441. this.response = JSON.stringify(res)
  442. this.responseText = JSON.stringify(res)
  443. }
  444. })
  445. originalOpen.apply(this, arguments);
  446. } else {
  447. originalOpen.apply(this, arguments);
  448. }
  449. }
  450. var hookedOpen = unsafeWindow.XMLHttpRequest.prototype.open
  451. GM_addStyle(`
  452. /* 帮助百度网盘修正错误的会员色 */
  453. dt.level-1 {
  454. background: #fd6d65 !important;
  455. }
  456. dt.level-2 {
  457. background: #f3a723 !important;
  458. }
  459. dt.level-1 i.desc-arrow {
  460. border-bottom: 10px solid #dd6966 !important;
  461. }
  462. dt.level-2 i.desc-arrow {
  463. border-bottom: 10px solid #d29633 !important;
  464. }
  465. span#downloads h1 {
  466. margin-left: 20px;
  467. font-size: small;
  468. }
  469. [data-theme="dark"] span#downloads h1 {
  470. color: white;
  471. }
  472. a.downloadSubtitle, button.downloadSubtitle {
  473. border: none;
  474. border-radius: 5px;
  475. font-size: 12px;
  476. background: #0095ff;
  477. color: #fff;
  478. padding: 5px;
  479. margin: 0 0 20px 20px;
  480. width: fit-content;
  481. }
  482. a.downloadSubtitle:hover, a.downloadSubtitle:disabled, button.downloadSubtitle:hover, button.downloadSubtitle:disabled {
  483. background: #0095ffD0;
  484. }
  485. `)
  486. // 禁止分析网页信息
  487. unsafeWindow.Image = function () {
  488. const img = new Image();
  489. return new Proxy(img, {
  490. set(target, prop, value) {
  491. if (prop === 'src' && (value.includes('analytics') || value.includes('ztbox'))) {
  492. let url = new URL(value, location.origin);
  493. if (user.debug === 1 || user.debug === 3) console.warn("【(改)百度网盘会员青春版】unAnalytics", '\n类型:new Image\n禁止网页分析信息:', url.href);
  494. return true; // 阻止设置
  495. }
  496. target[prop] = value; // 设置其他属性
  497. return true;
  498. },
  499. get(target, prop) {
  500. return target[prop]; // 获取属性值
  501. }
  502. });
  503. };
  504. const originalCreateElement = document.createElement;
  505. unsafeWindow.document.createElement = function (tagName) {
  506. const element = originalCreateElement.call(unsafeWindow.document, tagName);
  507. if (tagName.toLowerCase() === 'img') {
  508. Object.defineProperty(element, 'src', {
  509. set(value) {
  510. if (value.includes('analytics') || value.includes('ztbox')) {
  511. let url = new URL(value, location.origin);
  512. if (user.debug === 1 || user.debug === 3) console.warn("【(改)百度网盘会员青春版】unAnalytics", '\n类型:document.createElement("img")\n禁止网页分析信息:', url.href)
  513. return true;
  514. } else {
  515. element.setAttribute('src', value)
  516. }
  517. },
  518. get() {
  519. return element.getAttribute('src');
  520. }
  521. });
  522. }
  523. return element;
  524. };
  525. waitForKeyElements(`.vp-video__control-bar--playback-rates button`, function (element) {
  526. element.on('click', function () {
  527. XMLHttpRequest.prototype.open = originalOpen;
  528. setTimeout(function () {
  529. XMLHttpRequest.prototype.open = hookedOpen;
  530. }, 20)
  531. })
  532. })
  533. let localsTimer = setInterval(() => {
  534. if (!unsafeWindow.locals) return
  535. clearInterval(localsTimer)
  536. let locals = unsafeWindow.locals
  537. let originalSet = locals.set
  538. locals.set = function (...args) {
  539. if (typeof args[1] == 'number' || typeof args[1] == 'string') {
  540. let oriarg = args[1]
  541. if (args[0].includes('is_vip')) {
  542. args[1] = user.vip === 1 && user.previous === 0 ? 1 : 0
  543. } else if (args[0].includes('is_svip')) {
  544. args[1] = user.svip === 1 && user.previous === 0 ? 1 : 0;
  545. } else if (args[0] === 'vip_level') {
  546. user.level ? args[1] = user.level : "";
  547. } else if (args[0] === 'v10_id') {
  548. user.vip_id ? args[1] = user.vip_id : "";
  549. } else if (args[0] === 'username') {
  550. user.name ? args[1] = user.name : "";
  551. } else if (args[0] === 'photo') {
  552. user.photo ? args[1] = user.photo : "";
  553. }
  554. if (oriarg !== args[1]) {
  555. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook Locals", "\n原始数据:", args[0], "-", oriarg, "\n修改数据:", args[0], "-", args[1]);
  556. }
  557. }
  558. originalSet.apply(this, args);
  559. }
  560. if (/\/s\/.*?\?fid=.*?/.test(location.href)) unsafeWindow.locals.self = 1
  561. if (locals.userInfo) {
  562. user.vip === 1 && user.previous === 0 ? locals.userInfo.vip_identity = Number(`${user.svip === 1 ? 2 : 1}1`) : ""
  563. user.name ? locals.userInfo.username = user.name : ""
  564. user.photo ? locals.userInfo["photo_url"] = user.photo : ""
  565. user.level ? locals.userInfo.vip_level = user.level : ""
  566. user.vip_id ? locals.userInfo.svip10_id = user.vip_id : ""
  567. } else if (locals.mset && user.vip === 1 && user.previous === 0) {
  568. locals.mset({
  569. 'is_vip': user.vip === 1 && user.previous === 0 ? 1 : 0,
  570. 'is_svip': user.svip === 1 && user.previous === 0 ? 1 : 0,
  571. 'vip_level': user.level ? user.level : "",
  572. 'svip10_id': user.vip_id ? user.vip_id : "",
  573. 'show_vip_ad': 0
  574. })
  575. } else {
  576. user.level ? locals.vip_level = user.level : ""
  577. locals.is_vip = user.vip === 1 && user.previous === 0 ? 1 : 0
  578. locals.is_svip = user.svip === 1 && user.previous === 0 ? 1 : 0
  579. user.vip === 1 && user.previous === 0 ? locals.show_vip_ad = 0 : ""
  580. user.photo ? locals.photo = user.photo : ""
  581. user.name ? locals.username = user.name : ""
  582. }
  583. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook", "\nLocals:", locals)
  584. }, 1)
  585. let yunDataTimer = setInterval(() => {
  586. if (!unsafeWindow.yunData) return;
  587. clearInterval(yunDataTimer)
  588. let yunData = unsafeWindow.yunData
  589. let originalSet = yunData.setData;
  590. yunData.setData = function (...args) {
  591. if (typeof args[0] === 'object') {
  592. let oriargs = { ...args[0] }
  593. let newargs = args[0]
  594. if (oriargs.hasOwnProperty('is_vip')) {
  595. newargs.is_vip = user.vip === 1 && user.previous === 0 ? 1 : 0;
  596. }
  597. if (oriargs.hasOwnProperty('is_svip')) {
  598. newargs.is_svip = user.svip === 1 && user.previous === 0 ? 1 : 0;
  599. }
  600. if (oriargs.hasOwnProperty('vip_level')) {
  601. user.level ? newargs.vip_level = user.level : "";
  602. }
  603. if (oriargs.hasOwnProperty('v10_id')) {
  604. user.vip_id ? newargs.v10_id = user.vip_id : "";
  605. }
  606. if (oriargs.hasOwnProperty('photo')) {
  607. user.photo ? newargs.photo = user.photo : "";
  608. }
  609. if (oriargs.hasOwnProperty('username')) {
  610. user.name ? newargs.username = user.name : "";
  611. }
  612. if (JSON.stringify(oriargs) !== JSON.stringify(newargs)) {
  613. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook yunData", "\n原始数据:", oriargs, "\n修改数据:", newargs);
  614. }
  615. } else {
  616. let oriarg = args[1]
  617. if (args[0].includes('is_vip')) {
  618. args[1] = user.vip === 1 && user.previous === 0 ? 1 : 0
  619. } else if (args[0].includes('is_svip')) {
  620. args[1] = user.svip === 1 && user.previous === 0 ? 1 : 0;
  621. } else if (args[0] === 'vip_level') {
  622. user.level ? args[1] = user.level : "";
  623. } else if (args[0] === 'v10_id') {
  624. user.vip_id ? args[1] = user.vip_id : "";
  625. } else if (args[0] === 'username') {
  626. user.name ? args[1] = user.name : "";
  627. } else if (args[0] === 'photo') {
  628. user.photo ? args[1] = user.photo : "";
  629. }
  630. if (oriarg !== args[1]) {
  631. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook yunData", "\n原始数据:", args[0], "-", oriarg, "\n修改数据:", args[0], "-", args[1]);
  632. }
  633. }
  634. originalSet.apply(this, args);
  635. }
  636. user.name ? yunData.username = user.name : ""
  637. user.name ? yunData.MYNAME = user.name : ""
  638. user.photo ? yunData.MYAVATAR = user.photo : ""
  639. user.photo ? yunData.photo = user.photo : ""
  640. user.level ? yunData.vip_level = user.level : ""
  641. yunData.ISVIP = user.vip === 1 && user.previous === 0 ? 1 : 0
  642. yunData.ISSVIP = user.svip === 1 ? 1 : 0
  643. user.vip ? yunData.ISYEARVIP = 1 : ""
  644. yunData.is_vip = user.vip === 1 && user.previous === 0 ? 1 : 0
  645. yunData.is_svip = user.svip === 1 ? 1 : 0
  646. yunData.is_vip_v2 = user.vip === 1 && user.previous === 0 ? 1 : 0
  647. yunData.is_svip_v2_new = user.svip === 1 ? 1 : 0
  648. user.vip ? yunData.show_vip_ad = 0 : ""
  649. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook", "\nyunData:", yunData)
  650. }, 1)
  651. let yunDataRequireTimer = setInterval(() => {
  652. if (!unsafeWindow.require) return;
  653. clearInterval(yunDataRequireTimer)
  654. require.async('pan-center:widget/data/yunData', function (yunData) {
  655. let originalSet = yunData.setData;
  656. yunData.setData = function (...args) {
  657. if (typeof args[0] === 'object') {
  658. let oriargs = { ...args[0] }
  659. let newargs = args[0]
  660. if (oriargs.hasOwnProperty('is_vip')) {
  661. user.vip === 1 && user.previous === 0 ? newargs.is_vip = 1 : newargs.is_vip = 0;
  662. }
  663. if (oriargs.hasOwnProperty('is_svip')) {
  664. user.svip === 1 && user.previous === 0 ? newargs.is_svip = 1 : newargs.is_svip = 0;
  665. }
  666. if (oriargs.hasOwnProperty('is_evip')) {
  667. user.svip === 1 && user.previous === 0 ? newargs.is_evip = 1 : newargs.is_evip = 0;
  668. }
  669. if (oriargs.hasOwnProperty('vip_level')) {
  670. user.level ? newargs.vip_level = user.level : "";
  671. }
  672. if (oriargs.hasOwnProperty('v10_id')) {
  673. user.vip_id ? newargs.v10_id = user.vip_id : "";
  674. }
  675. if (oriargs.hasOwnProperty('has_3V1_coupon')) {
  676. user.svip === 1 && user.previous === 0 ? newargs.has_3V1_coupon = 1 : newargs.has_3V1_coupon = 0;
  677. }
  678. if (oriargs.hasOwnProperty('photo')) {
  679. user.photo ? newargs.photo = user.photo : "";
  680. }
  681. if (oriargs.hasOwnProperty('username')) {
  682. user.name ? newargs.username = user.name : "";
  683. }
  684. if (JSON.stringify(oriargs) !== JSON.stringify(newargs)) {
  685. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook yunDataModule", "\n原始数据:", oriargs, "\n修改数据:", newargs);
  686. }
  687. } else {
  688. let oriarg = args[1]
  689. if (args[0].includes('is_vip')) {
  690. args[1] = user.vip === 1 && user.previous === 0 ? 1 : 0
  691. } else if (args[0].includes('is_svip')) {
  692. args[1] = user.svip === 1 && user.previous === 0 ? 1 : 0;
  693. } else if (args[0] === 'vip_level') {
  694. user.level ? args[1] = user.level : "";
  695. } else if (args[0] === 'v10_id') {
  696. user.vip_id ? args[1] = user.vip_id : "";
  697. } else if (args[0] === 'username') {
  698. user.name ? args[1] = user.name : "";
  699. } else if (args[0] === 'photo') {
  700. user.photo ? args[1] = user.photo : "";
  701. }
  702. if (oriarg !== args[1]) {
  703. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook yunDataModule", "\n原始数据:", args[0], "-", oriarg, "\n修改数据:", args[0], "-", args[1]);
  704. }
  705. }
  706. originalSet.apply(this, args);
  707. }
  708. if (user.debug === 1 || user.debug === 2) console.log("【(改)百度网盘会员青春版】Hook", "\nyunDataModule:", yunData)
  709. })
  710. }, 1)
  711. function waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector) {
  712. function findInShadowRoots(root, selector) {
  713. let elements = $(root).find(selector).toArray();
  714. $(root).find('*').each(function () {
  715. const shadowRoot = this.shadowRoot;
  716. if (shadowRoot) {
  717. elements = elements.concat(findInShadowRoots(shadowRoot, selector));
  718. }
  719. });
  720. return elements;
  721. }
  722. var targetElements;
  723. if (iframeSelector) {
  724. targetElements = $(iframeSelector).contents();
  725. } else {
  726. targetElements = $(document);
  727. }
  728. let allElements = findInShadowRoots(targetElements, selectorTxt);
  729. if (allElements.length > 0) {
  730. allElements.forEach(function (element) {
  731. var jThis = $(element);
  732. var alreadyFound = jThis.data('alreadyFound') || false;
  733. if (!alreadyFound) {
  734. var cancelFound = actionFunction(jThis);
  735. if (cancelFound) {
  736. return false;
  737. } else {
  738. jThis.data('alreadyFound', true);
  739. }
  740. }
  741. });
  742. }
  743. var controlObj = waitForKeyElements.controlObj || {};
  744. var controlKey = selectorTxt.replace(/[^\w]/g, "_");
  745. var timeControl = controlObj[controlKey];
  746. if (allElements.length > 0 && bWaitOnce && timeControl) {
  747. clearInterval(timeControl);
  748. delete controlObj[controlKey];
  749. } else {
  750. if (!timeControl) {
  751. timeControl = setInterval(function () {
  752. waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector);
  753. }, 1000);
  754. controlObj[controlKey] = timeControl;
  755. }
  756. }
  757. waitForKeyElements.controlObj = controlObj;
  758. }
  759. })()