修改CSDN博客数据,仅供娱乐使用!
// ==UserScript== // @name CSDN娱乐脚本 // @namespace http://tampermonkey.net/ // @match https://mp.csdn.net/mp_blog/analysis/article/* // @grant unsafeWindow // @run-at document-start // @version 1.0 // @license MIT // @author Berger // @require https://registry.npmmirror.com/sweetalert2/10.16.6/files/dist/sweetalert2.min.js // @require https://registry.npmmirror.com/hotkeys-js/3.13.3/files/dist/hotkeys.min.js // @resource style https://registry.npmmirror.com/sweetalert2/10.16.6/files/dist/sweetalert2.min.css // @description 修改CSDN博客数据,仅供娱乐使用! // @grant GM_registerMenuCommand // @grant GM_getValue // @grant GM_setValue // ==/UserScript== (function () { 'use strict'; const utils = { responseInterceptors(hijackUrl, functions) { // 保存原始的 open 和 send 方法 const originalOpen = XMLHttpRequest.prototype.open; const originalSend = XMLHttpRequest.prototype.send; // 重写 XMLHttpRequest 的 open 方法 XMLHttpRequest.prototype.open = function (method, url, async, user, password) { // 将请求的 URL 和方法存储在当前实例中 this._url = url; this._method = method; // 检查 URL 是否包含要劫持的 URL if (url.includes(hijackUrl)) { // 添加状态变化的事件监听器 this.addEventListener('readystatechange', function () { // 当请求完成时(readyState === 4) if (this.readyState === 4) { try { // 解析响应文本为 JSON 对象 const res = JSON.parse(this.responseText); // 调用提供的函数进行响应修改 const modifiedResponse = functions(res); // 使 responseText 属性可写,并进行修改 Object.defineProperty(this, "responseText", { writable: true, configurable: true, // 使属性可配置 }); // 将修改后的响应文本赋值给 responseText this.responseText = modifiedResponse; } catch (error) { // 处理 JSON 解析错误 console.error("Error parsing response:", error); } } }); } // 调用原始的 open 方法 originalOpen.call(this, method, url, async, user, password); }; // 重写 XMLHttpRequest 的 send 方法 XMLHttpRequest.prototype.send = function (body) { // 调用原始的 send 方法 originalSend.call(this, body); }; }, getValue(name) { return GM_getValue(name); }, setValue(name, value) { return GM_setValue(name, value); }, }; const responseContentModify = { modifyBlogStatics(response) { const blogStaticsData = utils.getValue("blogStatics") if (blogStaticsData.article) { //文章总数 response['data'][0]['num'] = blogStaticsData.article } if (blogStaticsData.fans) { //粉丝数 response['data'][1]['num'] = blogStaticsData.fans } if (blogStaticsData.digg) { //点赞数 response['data'][2]['num'] = blogStaticsData.digg } if (blogStaticsData.comment) { //评论数 response['data'][3]['num'] = blogStaticsData.comment } if (blogStaticsData.view) { //阅读量 response['data'][4]['num'] = blogStaticsData.view } if (blogStaticsData.score) { //积分 response['data'][5]['num'] = blogStaticsData.score } if (blogStaticsData.rank) { //总排名 response['data'][6]['num'] = blogStaticsData.rank } if (blogStaticsData.collect) { //收藏数 response['data'][7]['num'] = blogStaticsData.collect } return response } } function hijackBlogStatics() { // 博客数据请求接口 const blogStaticsUrl = 'https://bizapi.csdn.net/blog/phoenix/console/v1/data/blog-statistics' utils.responseInterceptors(blogStaticsUrl, responseContentModify.modifyBlogStatics) } function registerMenuCommand() { GM_registerMenuCommand('⚙️ 配置博客数据', () => { main.showBlogStaticsSettingBox() }); } let main = { init() { hijackBlogStatics() registerMenuCommand() }, // 博客数据配置 showBlogStaticsSettingBox() { const blogStaticsData = utils.getValue("blogStatics") console.log(blogStaticsData) Swal.fire({ title: '博客数据配置', html: '<span>文章总数</span><input id="article" class="swal2-input" placeholder="文章总数" value="' + (blogStaticsData == null || undefined ? '' : blogStaticsData.article) + '">' + '<span>粉丝数</span><input id="fans" class="swal2-input" placeholder="粉丝数" value="' + (blogStaticsData == null || undefined ? '' : blogStaticsData.fans) + '">' + '<span>点赞数</span><input id="digg" class="swal2-input" placeholder="点赞数" value="' + (blogStaticsData == null || undefined ? '' : blogStaticsData.digg) + '">' + '<span>评论数</span><input id="comment" class="swal2-input" placeholder="评论数" value="' + (blogStaticsData == null || undefined ? '' : blogStaticsData.comment) + '">' + '<span>阅读量</span><input id="view" class="swal2-input" placeholder="阅读量" value="' + (blogStaticsData == null || undefined ? '' : blogStaticsData.view) + '">' + '<span>积分</span><input id="score" class="swal2-input" placeholder="积分" value="' + (blogStaticsData == null || undefined ? '' : blogStaticsData.score) + '">' + '<span>总排名</span><input id="rank" class="swal2-input" placeholder="总排名" value="' + (blogStaticsData == null || undefined ? '' : blogStaticsData.rank) + '">' + '<span>收藏数</span><input id="collect" class="swal2-input" placeholder="收藏数" value="' + (blogStaticsData == null || undefined ? '' : blogStaticsData.collect) + '">', focusConfirm: false, showDenyButton: true, confirmButtonText: '保存数据到本地', denyButtonText: '清除本地信息', footer: 'tips:未填写的信息不会被修改', preConfirm: () => { const articleNum = Swal.getPopup().querySelector('#article').value; const fansNum = Swal.getPopup().querySelector('#fans').value; const diggNum = Swal.getPopup().querySelector('#digg').value; const commentNum = Swal.getPopup().querySelector('#comment').value; const viewNum = Swal.getPopup().querySelector('#view').value; const scoreNum = Swal.getPopup().querySelector('#score').value; const rankNum = Swal.getPopup().querySelector('#rank').value; const collectNum = Swal.getPopup().querySelector('#collect').value; const inputs = [ articleNum, fansNum, diggNum, commentNum, viewNum, scoreNum, rankNum, collectNum ]; for (let input of inputs) { const num = Number(input); if (!Number.isInteger(num) || num < 0) { return Swal.fire({ icon: 'error', title: '输入错误', text: '数据必须是大于等于的整数', }); } } return {articleNum, fansNum, diggNum, commentNum, viewNum, scoreNum, rankNum, collectNum} } }).then((r###lt) => { const {articleNum, fansNum, diggNum, commentNum, viewNum, scoreNum, rankNum, collectNum} = r###lt.value; if (r###lt.isConfirmed) { // 保存信息 const blogStaticsData = { article: articleNum, fans: fansNum, digg: diggNum, comment: commentNum, view: viewNum, score: scoreNum, rank: rankNum, collect: collectNum, } utils.setValue("blogStatics", blogStaticsData); // 提示 Swal.fire({ icon: "success", title: "保存成功!", showConfirmButton: false, timer: 1300 }).then(()=>location.reload()); } if (r###lt.isDenied) { utils.setValue("blogStatics", null) Swal.fire({ icon: "success", title: "博客数据已清除!", showConfirmButton: false, timer: 1300 }).then(()=>location.reload()); } }); }, } window.addEventListener('DOMContentLoaded', main.init); })();