首页 > 其他分享 >手把手带你修改CSDN博客数据

手把手带你修改CSDN博客数据

时间:2024-09-25 13:51:10浏览次数:13  
标签:脚本 const name 手把手 博客 num CSDN 数据

目录

声明

​编辑

用到的技术和工具

前提准备

项目开发

1.创建脚本

2.编写拦截响应方法

3.创建响应数据修改对象

4.创建博客数据拦截方法

5.运行

效果展示

进一步优化脚本

1.引入 资源管理器相关依赖

2.引入 SweetAler2

3.设置对话框

4.配置逻辑功能 

终极效果

设置数据

恢复数据

脚本链接


声明

对不起大家!我标题党了,其实是在本地修改数据!!!

脚本是免费并且开源的,但我还是把资源上传到了 CSDN,有条件的小伙伴希望支持一下,感谢大家!

本文章未经允许,禁止转载!


本次项目主要是修改以上数据。

用到的技术和工具

  1. JavaScript
  2. 脚本管理工具
  3. Webstorm

前提准备

通过F12可以看到加载的数据

博客数据请求接口

https://bizapi.csdn.net/blog/phoenix/console/v1/data/blog-statistics

响应数据(已对敏感数据进行脱敏)

{
  "code": 200,
  "message": "success",
  "traceId": "*",
  "data": [
    {
      "name": "文章总数",
      "enName": "article",
      "num": 2
    },
    {
      "name": "粉丝数",
      "enName": "fans",
      "num": 6
    },
    {
      "name": "点赞数",
      "enName": "digg",
      "num": 11
    },
    {
      "name": "评论数",
      "enName": "comment",
      "num": 0
    },
    {
      "name": "阅读量",
      "enName": "view",
      "num": 262
    },
    {
      "name": "积分",
      "enName": "score",
      "num": 47
    },
    {
      "name": "总排名",
      "enName": "rank",
      "num": 0
    },
    {
      "name": "收藏数",
      "enName": "collect",
      "num": 1
    }
  ]
}

到此位置准备的数据就此完成。

项目开发

主要的思路就是通过 脚本管理工具响应数据 进行拦截并修改。

1.创建脚本

Webstorm 中创建一个 js文件,名为 xxx.user.js

1.你可以用你自己喜欢的编译器,我比较习惯 Webstorm

2.js文件的名称必须是 user.js 结尾,因为这样 脚本管理器 才能识别出来是脚本

 初始化脚本如下:

// ==UserScript==
// @name        CSDN博客数据修改             // 脚本名称
// @namespace   http://tampermonkey.net/    // 命名空间,通常用于区分不同的脚本
// @match       https://mp.csdn.net/mp_blog/analysis/article/all // 该脚本将在此URL匹配时执行
// @grant       unsafeWindow                // 允许访问页面的全局变量
// @run-at      document-start              // 在文档开始加载时运行脚本
// @version     1.0                         // 脚本版本
// @license     MIT                         // 脚本许可证
// @author      Berger                      // 脚本作者
// @description 修改CSDN博客数据,仅供娱乐使用! // 脚本描述
// ==/UserScript==

(function () {
    'use strict'; // 严格模式,避免意外的错误

    // 在这里添加具体的代码逻辑以修改CSDN博客数据

})();

2.编写拦截响应方法

我把它封装到utils中,以便后续调用

其中 responseInterceptors 第一个参数是 拦截响应的路径;第二个是 传入一个方法,用于修改响应数据(具体的数据)。

    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);
            };
        }
    };

3.创建响应数据修改对象

    const responseContentModify = {
        modifyBlogStatics(response) {
            //文章总数
            response['data'][0]['num'] = 9999
            //粉丝数
            response['data'][1]['num'] = 9999
            //点赞数
            response['data'][2]['num'] = 9999
            //评论数
            response['data'][3]['num'] = 9999
            //阅读量
            response['data'][4]['num'] = 9999
            //积分
            response['data'][5]['num'] = 9999
            //总排名
            response['data'][6]['num'] = 9999
            //收藏数
            response['data'][7]['num'] = 9999
            return response
        }
    }

4.创建博客数据拦截方法

   function hijackBlogStatics() {
        // 博客数据请求接口
        const blogStaticsUrl = 'https://bizapi.csdn.net/blog/phoenix/console/v1/data/blog-statistics'
        utils.responseInterceptors(blogStaticsUrl,responseContentModify.modifyBlogStatics)
    }

5.运行

   let main = {
        init() {
            hijackBlogStatics()
        },
    }

    window.addEventListener('DOMContentLoaded', main.init);

效果展示

即使网页刷新,效果也依旧存在。

因为此脚本每次都会捕捉到博客数据响应,加以修改。

进一步优化脚本

从上面可以看出来,想要修改的数据被写死在了代码中,这非常不友好,所以我们进一步优化可以在网页中设置数据。

// ==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
// @description 修改CSDN博客数据,仅供娱乐使用!
// @grant       GM_registerMenuCommand
// ==/UserScript==

1.引入 资源管理器相关依赖

// @grant       GM_registerMenuCommand
// @grant       GM_getValue
// @grant       GM_setValue

这是脚本管理器的命令,可以创建命令菜单

    function registerMenuCommand() {
        GM_registerMenuCommand('⚙️ 配置博客数据', () => {
            alert(111)
        });
    }
    
    let main = {
        init() {
            hijackBlogStatics()
            registerMenuCommand()
        },

    }

utils中新增

getValue(name) {
    //从本地获取数据
    return GM_getValue(name);
},

setValue(name, value) {
    //设置数据到本地
    return GM_setValue(name, value);
},

效果展示

2.引入 SweetAler2

// @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

3.设置对话框

    function registerMenuCommand() {
        GM_registerMenuCommand('⚙️ 配置博客数据', () => {
            main.showBlogStaticsSettingBox()
        });
    }

4.配置逻辑功能 

// 博客数据配置
showBlogStaticsSettingBox() {
    // 获取博客统计数据
    const blogStaticsData = utils.getValue("blogStatics");
    console.log(blogStaticsData);
    
    // 使用SweetAlert2展示数据配置对话框
    Swal.fire({
        title: '博客数据配置',
        html:
            // 构建输入框用于各项博客统计数据
            '<span>文章总数</span><input id="article" class="swal2-input" placeholder="文章总数" value="' + (blogStaticsData == null ? '' : blogStaticsData.article) + '">' +
            '<span>粉丝数</span><input id="fans" class="swal2-input" placeholder="粉丝数" value="' + (blogStaticsData == null ? '' : blogStaticsData.fans) + '">' +
            '<span>点赞数</span><input id="digg" class="swal2-input" placeholder="点赞数" value="' + (blogStaticsData == null ? '' : blogStaticsData.digg) + '">' +
            '<span>评论数</span><input id="comment" class="swal2-input" placeholder="评论数" value="' + (blogStaticsData == null ? '' : blogStaticsData.comment) + '">' +
            '<span>阅读量</span><input id="view" class="swal2-input" placeholder="阅读量" value="' + (blogStaticsData == null ? '' : blogStaticsData.view) + '">' +
            '<span>积分</span><input id="score" class="swal2-input" placeholder="积分" value="' + (blogStaticsData == null ? '' : blogStaticsData.score) + '">' +
            '<span>总排名</span><input id="rank" class="swal2-input" placeholder="总排名" value="' + (blogStaticsData == null ? '' : blogStaticsData.rank) + '">' +
            '<span>收藏数</span><input id="collect" class="swal2-input" placeholder="收藏数" value="' + (blogStaticsData == null ? '' : 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((result) => {
        // 根据用户的操作处理结果
        const { articleNum, fansNum, diggNum, commentNum, viewNum, scoreNum, rankNum, collectNum } = result.value;
        if (result.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 (result.isDenied) {
            // 清除本地信息
            utils.setValue("blogStatics", null);
            Swal.fire({
                icon: "success",
                title: "博客数据已清除!",
                showConfirmButton: false,
                timer: 1300
            }).then(() => location.reload());
        }
    });
},

终极效果

设置数据

即使切换页面,刷新页面,效果依旧在

恢复数据

脚本链接

已同步到greasyfork:CSDN娱乐脚本icon-default.png?t=O83Ahttps://greasyfork.org/zh-CN/scripts/510074-csdn%E5%A8%B1%E4%B9%90%E8%84%9A%E6%9C%AC

脚本仅供娱乐,请多多包涵!感谢大家!

原创文章,未经允许禁止转载!!

标签:脚本,const,name,手把手,博客,num,CSDN,数据
From: https://blog.csdn.net/qq_22554999/article/details/142500454

相关文章

  • 思源笔记局域网内访问【使用教程】_思源笔记局域网访问-CSDN博客
    思源笔记局域网内访问【使用教程】_思源笔记局域网访问-CSDN博客思源笔记局域网内访问【使用教程】_思源笔记局域网访问-CSDN博客https://blog.csdn.net/qq_22841387/article/details/124738674文章浏览阅读4.3k次,点赞3次,收藏8次。在团队协作中,使用思源笔记进行需求文档的编......
  • 数据结构:二叉树 (Heap堆篇) 手把手带你入门数据结构~ (简单易懂超详细~)
    文章目录前言一、树的概念1.树的概念与结构2.树的特性3.树的相关术语4.树的表示方法5.树形结构实际场景二、二叉树1.二叉树的概念2.二叉树的结构3.满二叉树3.完全二叉树1.完全二叉树的概念2.完全二叉树的性质3.完全二叉树的结构三、堆1.堆的概念2.堆的......
  • 数据结构:双向链表(Doubly Linked List篇)手把手带你入门数据结构~
    文章目录前言一、双向链表的概念1.结构特点:2.优点:二、双向链表的实现1.双向链表的结构2.双向链表初始化3.双向链表销毁4.双向链表打印5.双向链表尾插6.双向链表头插7.双向链表尾删8.双向链表头删9.双向链表查找10.双向链表指定位置插入11.双向链表指定位置......
  • 为什么要写博客
    为什么要写博客1.使自己变得更善于观察2.防止遗忘3.加强记忆4.提升表达能力5.思维的扩散6.回顾7.让自己看到自己的进步写博客的好处,好记性不如烂笔头,随着年龄的增长,记忆力也大不如从前。有些技术细节点如果没有做好笔记,时间久了,需要把技术拿起来用的时候可能需要花费......
  • CSDN文章导出md并迁移至博客园
    一、获取所有文章地址1.进csdn首页,点击自己的头像 2.在个人主页界面,按F12打开控制台,并找到network,找到get-business开头的请求,右键copy他的url3.选择console,输入一下代码,其中fetch里面的url是你刚才复制的地址,并把里面的size改为100(这个是返回的文章内容数,上限为100),page是......
  • WordPress固定链接伪静态怎么设置?【手把手教你】
    WordPress默认链接是参数的形式,也就是常说的动态链接,这种链接对于SEO来说并不是很友好,所以一般我们都会对WordPress的固定链接格式进行修改,设置成伪静态。伪静态与静态的区别就是链接看起来是和静态页面链接一样,但是其实页面还是程序动态生成的。wordress就自带非常完善的伪静态规......
  • 论文速递!时序预测!DCSDNet:双卷积季节性分解网络,应用于天然气消费预测过程
    本期推文将介绍一种新的时序预测方法:双卷积季节性分解网络(DualConvolutionwithSeasonalDecompositionNetwork,DCSDNet)在天然气消费预测的应用,这项研究发表于《AppliedEnergy》期刊。针对天然气消费的多重季节性和非规律性,推荐的文献提出了一种新的预测方法:双卷积季节性分解......
  • PWA入门:手把手教你制作一个PWA应用
        根目录创建 manifest.json{"name":"我是pwa","short_name":"pwa是我","start_url":"/",//启动页面,如果首页是https://www.abc.com/,则直接用“/”即可"display":"standalone",......
  • 我来博客园了!
    \(\large{\texttt{HelloWorld!}}\)来\(\text{CnBlogs}\)的第一天今天是我第一天来到博客园,这里的一切都是如此的新鲜!作为一名来自河南省的初中生现在我的能力还菜的一批\(\dots\)我会什么作为全国统一的,每天晚上我也不可避免地染上\(\text{emo}\)的恶疾(雾,尽管有时会产出一......
  • IDEA的使用,手把手带你快速入门IDEA
    ??新建包及类的方式1.在src内右键选择Package2.在包内右键选择javaClass运行java类的方式创建模块Eclipse和Idea的对比?IDEA的常用配置设置鼠标滚轮修改字体大小修改类头的文档注释信息内容如下:修改字符集?设置自动编译??设置快捷键?首次使用方法======创......