使用 cloudflare workers 做了一些小玩具;比如小红书去水印...

350 天前
 zhwithsweet

最近沉迷使用 hono.js 开发 cloudflare workers. Cloudflare workers 不用多说,赛博菩萨的免费力作;提供了基本的 nodejs API ,比如 fetch / static server 等,甚至支持 puppeteer !玩法有很多。

Hono 更是社区中比较优秀的轻量级应用的佼佼者,适配了多个云平台,具备基本的代码经验的人几乎是无缝上手,体验也非常优秀。

本人就使用 hono.js 做了几个,分享一下。如下:

仓库在此:cofo-workers

效果图:

3113 次点击
所在节点    分享创造
14 条回复
codehz
350 天前
话说去水印真的需要用 workers browser render API 吗,如果是静态/ssr 的话,用 HTMLRewriter 应该也可以吧
zhwithsweet
350 天前
@codehz #1 要看的,如果你需要的部分是 <ClientOnly /> 的组件,你必须要用 render API 了。据我所知,小红书的图片部分是 <ClientOnly />。如果都是 SSR 的,直接 parse HTML 即可。
codehz
350 天前
你说的对,图片确实不是直接 ssr ,但是提供了 window.__INITIAL_STATE__在末尾
也就是说你只要提取__INITIAL_STATE__里的数据就可以
( curl 之后获取到的信息)
用 HTMLRewriter 去直接 new HTMLRewriter().on("script")即可获取信息
节选一段如下
"imageList":[{"urlDefault":"http:\u002F\u002Fsns-webpic-qc.xhscdn.com\u002F202312081052\u002F640610f27499f2c0de31b46e2cb87443\u002F1040g00830p861vr1k6005n0uvm7haceq0rtl90o!nd_whgt34_nwebp_wm_1","fileId":"","height":1920,"width":1440,"url":"","traceId":"","infoList":
tifanynic
349 天前
请问怎么部署呀?直接把 index.js 粘贴到 workers 里吗
zhwithsweet
349 天前
@codehz #3 哇 不错的思路,有代码吗?
zhwithsweet
349 天前
@tifanynic #4 在 hono.js 的项目里直接执行 pnpm run deploy 即可;在 cloudflare dashboard 里边可以直接贴 index.js
codehz
349 天前
@zhwithsweet HTMLRewriter 处理文本节点的时候稍微有点问题,
可以参考我这个写法去一次性提取全部文本(考虑到你这里只需要提取数据,因此可以省略替换内容的部分,不需要 remove 了)
https://github.com/codehz/hertz.moe/blob/main/src/TextHandler.ts
然后提取出 script 字符串之后,只要稍作裁剪,就可以用 JSON.parse 来读取(注意到 cf worker 不让 eval )
不过我觉得这里甚至可以直接用 regex 来匹配__INITIAL_STATE__=到</script>之间的内容,这样也许更快。
zhwithsweet
349 天前
@codehz #3 试了下,curl 里边拿到的 imageList 图片地址是低质量的图片;不过这个思路确实很好。
zhwithsweet
349 天前
@codehz #7 可以的,我已经看到它的 defaultImageurl 了
v2yllhwa
349 天前
我之前写的代码,供参考。

let getUser = async (url) => {
let res = await fetch(url);
let scripts = [];
let rewriter = new HTMLRewriter()
.on('script', {
element(element) {
scripts.push('');
},
text(text) {
scripts[scripts.length - 1] += text.text;
},
})
.transform(res);
await rewriter.text();
let script = scripts.find((script) => script.startsWith('window.__INITIAL_STATE__='));
script = script.slice('window.__INITIAL_STATE__='.length);
// replace undefined to null
script = script.replace(/undefined/g, 'null');
let state = JSON.parse(script);
return state.user;
};
zhwithsweet
349 天前
@v2yllhwa #10 nice ,我暂时用的正则直接匹配的。回头试试 rewriter 这个写法
blueeon
348 天前
workers browser render 是需要申请吗?好不好申请?
zhwithsweet
348 天前
@blueeon #12 需要,直接去 discord 联系官方人员加白就行
RiverRay
236 天前
很 nice 的想法,谢博主贡献~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/998464

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX