女朋友换头像比翻书快?我3天肝出一个去水印小程序

我女朋友天天泡小红书,看到好看的图就想当头像。可小红书的图都带水印,她嫌截图裁剪太麻烦。有一天直接甩给我一句:"你是程序员,给我想个办法把水印弄掉!"

得,女朋友发话,那就干呗。花三天时间,整了个去水印的小工具,挺好用。下面就是我怎么一步步搞出来的,有兴趣的可以看看。

先看效果

先给大佬们体验体验【# 去水印下载鸭】>>> nologo.code24.top/ ,移动端访问需要扫码跳转小程序。

电脑端是这样的:

功能亮点

  • 小某书、某音、某手......主流平台的图片、视频都能扒
  • 完全免费,不用登录,打开就用,零广告
  • 复制分享链接→粘贴→秒出无水印素材,一步到位

后端怎么做到的

前端只是壳,真正干活的是后端:拿到分享链接后,靠爬虫把平台返回的数据里"无水印原始地址"抠出来,再回传给你。

我是前端,最顺手的组合是 Node.js + Vue3,既然后端也要有人顶,干脆一把梭:Node 写接口,语法熟、模块多,撸起来嘎嘎快。

举个例子:拿【某信公众号】来练手,它最简单了。

首先想薅无水印的资源,得先摸透平台套路。公众号最"耿直",它直接把无水印原图塞在 HTML 里。打开文章源码,一眼就能看到 window.picture_page_info_list 这个大对象,无水印原图地址全躺在里面。

之前写过一篇文章 Node.js操作Dom ,轻松hold住简单爬虫 文章提到三方库 jsdom,它能把字符串html摸拟成Dom。

复制链接发送请求获取页面 HTML 内容,再转成模拟的 Dom,这样就能使用jquery 获取元素。

javascript 复制代码
const axios = require('axios');
const jquery = require('jquery');
const jsdom = require("jsdom");
const { JSDOM } = jsdom;

const str2Dom = (html = '') => {
    if (!html) return;
    const page = new JSDOM(html);
    const window = page.window;
    return window;
}

const getHtml = async (url) => {
    return new Promise((resole, reject) => {
        axios.get(url, {
            headers: {
                'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0',
                'sec-ch-ua-platform': "macOS",
                cookie: 'rewardsn=; wxtokenkey=777'
            }
        }).then(res => {
            resole(res.data)
        }, err => {
            reject('')
        })
    })
}

const getFileUrl = async (url) => {
	  const window = str2Dom(await getHtml(url));
	  if (!window) return;
    let $ = jquery(window);
    //省略...
}

获取所有script 标签,挨个循环用正则捕获数据。

ini 复制代码
  const getPicturePageInfoList = ($, reversedScrips) => {
    const START_STR = 'window.picture_page_info_list = [';
    let result = null;
    $.each(reversedScrips, function (i, script) {
        let scriptContent = $(script).text() || '';
        if (scriptContent.includes(START_STR)) {
            scriptContent = scriptContent.replace('.slice(0, 20)', '')
            // 使用正则表达式捕获方括号内的内容
            const regex = /window\.picture_page_info_list\s*=\s*(\[.*?\])(?=\s*;|\s*$)/s;
            const match = scriptContent.match(regex);

            if (match && match[1]) {
                try {
                    const fn = new Function(`return ${match[1]}`);
                    result = fn();
                } catch (e) {
                    console.warn('JSON解析失败,返回原始内容:', e);
                    result = match[1]; // 返回原始内容
                }
            }
            return false; // 跳出each循环
        }
    })
    return result;
}

const getFileUrl = async (url) => {
	//省略...
    let $ = jquery(window);
    const scrips = $('script');
    const reversedScrips = [...scrips].reverse();
    const weiXinData = getPicturePageInfoList($, reversedScrips);
 }

这个我们就能得到某信公众号无水印的图片,某信公众号是最简单,基本没做太多防爬虫机制。

其他平台较复杂点,涉及到 js 逆向,大多接口做了保密。

最后

本工具仅限于学习,请勿用于其他用途,否则后果自负。

相关推荐
Chrischaan24 分钟前
做 AI 塔罗小程序时,我为什么不让大模型自己抽牌:一次上线复盘
前端
一条泥憨鱼27 分钟前
【从0开始学习计算机网络】| ARP 协议:地址解析,ARP 欺骗,链路层寻址
网络·后端·学习·计算机网络
2501_9339232531 分钟前
SpringCloud组件:Eureka服务注册与发现
java·开发语言·后端·spring cloud·eureka
leikooo36 分钟前
ARTS 1011: 双堆动态对顶求中位数、IPC 注入与空密码串联接管账户与程序从不做决策
后端
合尘猫42 分钟前
AI 项目上线就停:一次事件循环阻塞的完整排查过程
人工智能·后端·python
骑着蜗牛撵大象3271 小时前
LangChain 工具调用从声明到闭环:给智能体接上真实的手脚
前端
Re_zero1 小时前
一次 SSE 断流排查:PrintWriter 吞掉了我的 IOException
java·后端
数据掘金1 小时前
百度统计后台页面数据异常?从手动调用时机开始排查
前端
hunteritself1 小时前
10 层 4K 实时剪辑,国产工作站进入广电制作核心
大数据·前端·人工智能·深度学习·transformer
踩着两条虫1 小时前
我在浏览器里“盖”了一个村:Vue + Three.js 大屏开发踩坑记
前端·vue.js·three.js