本帖最后由 zl20110000 于 2021-8-14 22:51 编辑
1.分析
- 1.1 关键词搜索定位js
- 1.2 从这里就可以看出生成水印的url (这里有一个
.gif
判断,这里先埋个伏笔,等会找到位置后,可以利用这个规则修改生成的url)
- 1.3 排查执行方法栈,发现函数
onImageUpload
,继续搜索,
- 1.4 注意这个暴露出来的全局方法
window.csdn.uploadSource
,定位这个函数的js文件,可以通过断点,或者直接搜索uploadSource
,定位的js文件,源码表示这是一个立即执行的函数表达式,在里面对window.csdn.uploadSource赋值。其实看到这里,基本流程都已经很清晰了。
-
1.5 生成水印分为两种,1.上传图片,通过参数决定上传图片是否加上水印,这里可以通过,将watermark参数置空 2.还一种就是之前旧版的生成url链接的形式,这种直接去掉后面的参数就可以了
-
1.6 回到之前的流程中,有一个
setWatermark
方法,这里有判断加水印的规则
2.注入js
重新定义 window.csdn.uploadSource
方法
还记得上面说的.gif
伏笔吗,这里可以修改返回的url值,就可以避免生成的url附加水印参数
3.虽然来52很久了,但是没发过贴,不清楚可不可以贴写好的油猴脚本。如果有违规,我立马删掉
<div style="padding:15px 0;"><div style="font-size:12px;">[Asm] <em class="viewsource" style="cursor:pointer;font-size:12px;color:#369 !important;">纯文本查看</em> <em class="copycode" style="cursor:pointer;font-size:12px;color:#369 !important;">复制代码</em></div><pre class="brush: asm; gutter: true">~~~js
// ==UserScript==
// @name csdn去除水印
// @namespace https://greasyfork.org/scripts/465212
// @version 0.1
// @description csdn去除水印
// @author zl20110000
// @match ://editor.csdn.net/
// @icon https://g.csdnimg.cn/static/logo/favicon32.ico
// ==/UserScript==
(function() {
"use strict";
! function (e, t) {
function a(e) {
return Object.prototype.toString.call(e).match(/[object (.*?)]/)[1]
}
function r(e) {
function r(e) {
return new Promise(function (a, r) {
t.ajax({
url: "https://imgservice.csdn.net/direct/v1.0/image/upload",
type: "get",
contentType: "application/json",
dataType: "json",
data: {
watermark: o,
type: l,
rtype: p
},
headers: {
"x-image-app": s,
"x-image-dir": c,
"x-image-suffix": e.name.split(".")[e.name.split(".").length - 1]
},
xhrFields: {
withCredentials: !0
},
success: function (t) {
if (200 === t.code && t.data) {
var i = t.data,
c = new FormData,
s = {
key: "" + i.filePath,
policy: i.policy,
OSSAccessKeyId: i.accessId,
success_action_status: 200,
signature: i.signature,
callback: i.callbackUrl,
file: e
};
for (var o in s) Object.hasOwnProperty.call(s, o) && c.set(o, s[o]);
n(c, i.host, a, r)
} else r(t)
},
error: function (e) {
r(e)
}
})
})
}
function n(e, a, r, n) {
t.ajax({
url: a,
type: "post",
contentType: !1,
processData: !1,
dataType: "json",
mimeType: "multipart/form-data",
data: e,
xhrFields: {
withCredentials: !0
},
success: function (e) {
console.log(e);
if (200 === e.code && e.data && e.data.imageUrl) {
e.data.imageUrl+="?_.gif"
}
console.log(e);
r(e)
},
error: function (e) {
n(e)
}
})
}
var i, c = e.dir,
s = e.app,
o = "",
l = e.type,
p = e.rtype;
console.log(e);
return i = "FileList" !== a(e.file) && "Array" !== a(e.file) ? [e.file] : Array.prototype.slice.call(e.file),
function (e) {
return Promise.all(e.map(function (e) {
return r(e)
}))
}(i)
}
e.csdn = e.csdn || {}, e.csdn.uploadSource = r
console.log("替换完成",e.csdn.uploadSource);
}(window, jQuery);
})();
~~~<</div>