写了两个实用的脚本获取知乎无水印图片

经常逛知乎,遇到好的回答/文章也会保存下来,但发现知乎有两个功能不是很喜欢,用油猴脚本解决了。

接下来介绍下这两个问题,以及原理,开发过程,开源地址等。

‍背景
作为一只数据仓鼠,我经常会保存互联网上的内容,其中就包括知乎上的回答。

但很多时候,这些回答会神秘地消失,只留下空荡荡的收藏夹…

所以,我会尽快将回答保存到自己的笔记软件。

但保存时,就经常遇到两个问题:一个是图片水印,一个是自动关键字链接。

由于没搜到类似的脚本,因此自己动手写了两个脚本,解决上述问题。

‍获取无水印原图‍

现象
在知乎,默认情况下,用户上传的图片都是自动在右下角添加水印的(可以在设置—偏好设置里取消):

原理
如果你查看网页源代码(F12),定位到图片,你会发现代码长这样,有很多的属性:

‍src 属性的值是图片链接(带用户水印的)。而 data-original-token​ 属性的值,和 src 里的图片文件名很相似,尝试用其替换掉 src 属性里的文件名,得到了无水印的原图:

‍PS:这个特性不是我发现的,而是看博主「致以无暇之人」的文章发现的:知乎图片去水印下载的方法,在此表示感谢。

老实说,我虽然也是程序员,但我都没怎么看过网页的源代码,更别说定位到图片、发现其关联之处了,汗 😓

解决思路
所以,开发思路就是,遍历网页上的所有图片,用 data-original-token​ 属性的值替换掉 src 属性值的文件名。

注意事项
当然,如果用户上传的图片本身就带有水印,那么获取到的原图自然也是带水印的,但也不是没其他办法:

用去水印工具,例如谷歌新发布的 Gemini 2.0 Flash 模型,去除图片水印的效果极佳。
将图片保存下来,然后以图搜图。推荐我的另一篇博客:这应该是「以图搜图」最全教程了,能帮你找到 90% 的图片出处
‍目前发现一个问题,即使替换为无水印版本的图片后,当用户选中网页内容并复制时,仍然会复制带水印的图片,而非替换后的图片:

‍当然,如果直接在图片上右键 → 复制图片,得到的就是无水印的图片:

那为什么会这样呢?问了下 DeepSeek,回答是因为知乎用了图片懒加载技术,图片代码中有 data-original​ 属性,里面的值存放图片地址。而 src 里的值只是占位符。当图片滚动到可视区域时,JavaScript 才会将 data-original 的值赋给 src 属性。

而用浏览器或剪贴板工具在复制内容时,可能会直接抓取 data-original(因为它被视为“真实地址”),而忽略当前 src 的值。

所以我的解决思路也简单粗暴:直接去除 data-original​ 的值。目前测试了下,确实没问题。

相关测试页面:我们为什么要禁止刑讯逼供? - 济东杂谈的回答 - 知乎

移除自动关键字链接
很多平台,都会自动将用户内容中的关键字,替换为超链接。

例如知乎:

 

B 站:

点击这些超链接,就会在平台内搜索该关键字,某种程度上算方便了用户,但也影响了美观以及保存。

开发思路:用正则匹配超链接,然后替换为纯文本。

由于我不怎么保存其他平台的内容,所以该脚本仅针对知乎。

开发过程
首先,看了几个教程:

脚本猫上找到的 油猴开发指南
篡改猴官方文档
Greasy Fork 上的帮助文档
然后看了开头几个文章,了解大概的编写过程,试着写了个 Hello World

然后直接问 DeepSeek,几分钟就写完了… (好像不用看教程也行?🙃)

只恨自己没早点写,老是手动去获取无水印原图(或者裁剪掉)、移除自动关键字链接,怪麻烦的 🤣。

开源和安装地址
代码都很简单,就不贴在文中了。

开源地址:https://github.com/Peter-JXL/UserScript

GreasyFork 地址:

知乎 - 获取无水印原图:https://greasyfork.org/zh-CN/scripts/531189
知乎 - 移除自动关键字链接:https://greasyfork.org/zh-CN/scripts/531190

测试案例:

油猴脚本测试文章 - 知乎:里面包含一张带水印的图片
为什么女儿忍痛不向我们说? - 知乎:回答里包含带自动关键字链接
目前已在 Chrome、Edge、FireFox 上通过测试。