1. 問題描述
由于部落格園允許使用者添加含js的html代碼來裝飾自己的部落格界面,這導緻很多人跟風地給自己部落格添加背景動态線條、live2D等,其中動态背景線條如下圖所示:

它不停地随機生成線條,并漂浮移動,一段時間後消失。但如果滑鼠靠近,就會吸附到滑鼠上,且不會消失。
當我們閱讀文章時,如果滑鼠停留在頁面上,那麼滑鼠位置就會不停地吸附線條,然後越來越多(達到最大數量時,貌似就不生成了),且不停地計算旋轉變換,這會占用一部分的CPU資源,如果其他程式也開得挺多的話,可能導緻CPU風扇狂轉。
這麼沒用的東西,既占CPU還分散注意力,應該統統禁掉!
2. 動态線條js加載過程
當我們打開一個部落格園使用者首頁或某篇文章時,網址格式如下:
https://www.cnblogs.com/oldwangcy/p/11371550.html
此
html
會請求下載下傳
blog-common.min.js
,在這個js檔案中定義了一個函數
loadBlogNews
,然後
html
檔案内部script會稍後調用
loadBlogNews()
。
loadBlogNews
的定義如下:
function loadBlogNews() {
$.ajax({
url: getAjaxBaseUrl() + "news.aspx",
type: "get",
dataType: "text",
success: function(n) {
if (n)
if (n.indexOf("<script") < n.indexOf("<script>getFollowStatus")) {
if (n.indexOf("cdn.jsdelivr.net/gh/BNDong/Cnblogs-Theme-SimpleMemory") >= 0) {
var t = n.match(/GhUserName *: *['"](\w+)['"]/);
(t === null || t[1].toUpperCase() === "BNDong".toUpperCase()) && (n = n.replace(/(GhVersions *: *["'])v1\.([0-1]\.\d+|2\.[0-5].*?),*/g, "$1v1.2.6").replace(/([email protected])v1\.([0-1]\.\d+|2\.[0-5])/gi, "$1v1.2.6"))
}
$.getScript(location.protocol + "//common.cnblogs.com/script/jquery.writeCapture-min.js", function() {
$("#sidebar_news").writeCapture().html(n).show()
})
} else
n.indexOf("錯誤提示:發生了異常") < 0 && $("#sidebar_news").html(n).show()
}
})
}
可以看到,此函數将使用
$.ajax
下載下傳了一個名為
new.aspx
的檔案,然後這一句
$("#sidebar_news").writeCapture().html(n).show()
執行了此檔案的内容。
可以在浏覽器開發者工具-network下找到此檔案。檔案内容大概如下(不同的人可能不一樣):
<!--done-->
<h3 class="catListTitle">公告</h3>
<div id="blog-news">
<div style = "display:none;">動态線條</div>
<script>
!function(){
function n(n,e,t){
return n.getAttribute(e)||t
}
function e(n){
return document.getElementsByTagName(n)
}
function t(){
var t=e("script"),o=t.length,i=t[o-1];
return{
l:o,z:n(i,"zIndex",-1),o:n(i,"opacity",.5),c:n(i,"color","0,0,0"),n:n(i,"count",99)
}
}
function o(){
a=m.width=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,
c=m.height=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight
}
function i(){
r.clearRect(0,0,a,c);
var n,e,t,o,m,l;
s.forEach(function(i,x){
for(i.x+=i.xa,i.y+=i.ya,i.xa*=i.x>a||i.x<0?-1:1,i.ya*=i.y>c||i.y<0?-1:1,r.fillRect(i.x-.5,i.y-.5,1,1),e=x+1;e<u.length;e++)n=u[e],
null!==n.x&&null!==n.y&&(o=i.x-n.x,m=i.y-n.y,
l=o*o+m*m,l<n.max&&(n===y&&l>=n.max/2&&(i.x-=.03*o,i.y-=.03*m),
t=(n.max-l)/n.max,r.beginPath(),r.lineWidth=t/2,r.strokeStyle="rgba("+d.c+","+(t+.2)+")",r.moveTo(i.x,i.y),r.lineTo(n.x,n.y),r.stroke()))
})
,
x(i)
}
var a,c,u,m=document.createElement("canvas"),
d=t(),l="c_n"+d.l,r=m.getContext("2d"),
x=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||
function(n){
window.setTimeout(n,1e3/45)
},
w=Math.random,y={
x:null,y:null,max:2e4};
m.id=l,m.style.cssText="position:fixed;top:0;left:0;z-index:"+d.z+";opacity:"+d.o,e("body")[0].appendChild(m),o(),window.onresize=o,
window.onmousemove=function(n){
n=n||window.event,y.x=n.clientX,y.y=n.clientY
},
window.onmouseout=function(){
y.x=null,y.y=null
};
for(var s=[],f=0;d.n>f;f++){
var h=w()*a,g=w()*c,v=2*w()-1,p=2*w()-1;
s.push({
x:h,y:g,xa:v,ya:p,max:6e3})
}
u=s.concat([y]),
setTimeout(function(){
i()},
100)
}
();
</script>
<div style = "display:none;"> 動态線條end</div>
<div id="profile_block">
昵稱:
<a href="https://home.cnblogs.com/u/baby-lily/">Baby-Lily</a><br />
園齡:
<a href="https://home.cnblogs.com/u/baby-lily/" title="入園時間:2019-03-19">
1年5個月
</a><br />
粉絲:
<a href="https://home.cnblogs.com/u/baby-lily/followers/">
24
</a><br />
關注:
<a href="https://home.cnblogs.com/u/baby-lily/followees/">
9
</a>
<div id="p_b_follow"></div>
<script>
getFollowStatus('73594955-3c31-45bb-d67b-08d6ab35ac30');
</script>
</div>
</div>
顯然,使用者自定義的腳本就放在這裡。
3. 解決方案
既然已經知道了是怎樣加載的,那麼我們可以寫一個腳本,交給TamperMonkey這個插件去執行。
大緻思路是這樣
- 檢測loadBlogNews是否已成功定義,如果是,那麼重寫一個函數覆寫掉。
- 重寫的函數與原來的基本一緻,但是在 new.aspx 被執行前,用正則把使用者自定義的腳本替換成空字元串。
代碼如下:
在 油猴中建立腳本,粘貼如下代碼,儲存。
// ==UserScript==
// @name prevent dynamic lines of cnblogs 屏蔽部落格園動态線條
// @namespace https://blog.csdn.net/qq1337715208/article/details/108289826
// @version 0.1
// @description 将部落格園背景中使用者添加的腳本代碼替換掉
// @author jin
// @match *://*.cnblogs.com/*
// @grant none
// @require https://common.cnblogs.com/scripts/jquery-2.2.0.min.js
// ==/UserScript==
(function() {
'use strict';
// 最多檢測50次,找不到 loadBlogNews 就放棄
let maxCheckNum = 50;
function check_f(){
try {
if (typeof(loadBlogNews) == "function") {
return true;
}
} catch(e) {
return false;
}
return false;
}
function tryStopIt(){
if (!check_f()){
if (maxCheckNum > 0){
maxCheckNum -= 1
setTimeout(tryStopIt, 100); //沒找到就每隔0.1秒重試
} else {// 嘗試50次後還沒有找到,就放棄
console.log("未找到,替換失敗。");
}
return;
} // end if (!check_f)
loadBlogNews = function () {
$.ajax({
url: getAjaxBaseUrl() + "news.aspx",
type: "get",
dataType: "text",
success: function(n) {
if (n)
if (n.indexOf("<script") < n.indexOf("<script>getFollowStatus")) {
if (n.indexOf("cdn.jsdelivr.net/gh/BNDong/Cnblogs-Theme-SimpleMemory") >= 0) {
var t = n.match(/GhUserName *: *['"](\w+)['"]/);
(t === null || t[1].toUpperCase() === "BNDong".toUpperCase()) && (n = n.replace(/(GhVersions *: *["'])v1\.([0-1]\.\d+|2\.[0-5].*?),*/g, "$1v1.2.6").replace(/([email protected])v1\.([0-1]\.\d+|2\.[0-5])/gi, "$1v1.2.6"))
}
$.getScript(location.protocol + "//common.cnblogs.com/script/jquery.writeCapture-min.js", function() {
let reg1 = new RegExp("[\\r\\n]", "g");
let reg2 = new RegExp("<script.*?>.*?window\\.requestAnimationFrame.*?</script>","g");
let filted_content = n.replace(reg1," ");
filted_content = filted_content.replace(reg2, " ");
let reg3 = new RegExp("<script.+?src=[\"'](.+?)[\"'].*?>.*?</script>","g");
filted_content = filted_content.replace(reg3, function(subtxt, cat1, pian, txt){
let bad = false;
$.ajax({
url:cat1,
type:"get",
dataType:"text",
async:false,
success:function(resp){
resp = resp.replace(reg1, " ");
let reg4 = new RegExp("<script.*?>.*?window\\.requestAnimationFrame.*?</script>","g");
//let reg5 = new RegExp("<script.+?src=[\"'].+?[\"'].*?>.*?</script>","g");
if (reg4.exec(resp)) {
bad = true;
}
}
});
if (bad) {
return " ";
}
return subtxt;
});
///
console.alert("debug : " + filted_content);
$("#sidebar_news").writeCapture().html(filted_content).show();
})
} else
n.indexOf("錯誤提示:發生了異常") < 0 && $("#sidebar_news").html(n).show();
}
}) // end $.ajax
} //end loadBlogNews
console.log("成功地替換了 loadBlogNews");
return;
}
tryStopIt();
})();
4. 效果測試
随便找了個有動态線條的部落格:https://www.cnblogs.com/oldwangcy/p/11371550.html