扒 Shadertoy shader 的小工具 ShadertoyTool
ShadertoyTool 是个单文件 Python CLI, 扔一个 Shadertoy 的 URL 或 6 位 ID 进去, 就能把整个 shader 连源码带贴图、音频、视频一次性扒下来。网页上只能看效果, 想把全部输入资源拿全还得手动绕 Cloudflare, 太麻烦, 干脆自动化。
它把所有 Render Pass(Image / Buffer / Sound / Common)合并写进一个 .glsl, 每个 pass 前面加注释头标清楚来源:
// ShaderToy ID: XltGDr
// Name: Contra
// Retrieved: 2025-01-01 12:00:00 UTC
// ===== Pass 0: Image (image) =====
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
// ...
}
// ===== Pass 1: Buffer_A (buffer) =====
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
// ...
}
引用的纹理、音频、视频、Cubemap 全下下来放进 <shader_id>_assets/, 再生成一份 manifest.json, 记下每个资源的 URL、文件名、下载状态和引用位置, 一个 shader 的完整现场就齐了。
用法很直接:
python fetch_shadertoy.py https://www.shadertoy.com/view/4djyRD
# 或者直接给 ID
python fetch_shadertoy.py 4djyRD
只要源码不要资源加 --skip-assets, 换输出目录用 -o。Windows 上有个 fetch_shadertoy.cmd, 会先查 requests、browser_cookie3、playwright 装没装, 缺啥自动 pip 补上再跑。
真正费劲的不是解析 shader, 是怎么稳定拿到数据。Shadertoy 前面挡着 Cloudflare, 直接请求经常吃闭门羹, 所以做了三级 fallback, 从最省事到最暴力:
- API v1:建个应用拿到 key 就走官方接口
/api/v1/shaders/<id>?key=<key>, 完全绕开 Cloudflare, 最稳, 一般推荐配个 key。 - Legacy POST:没 key 就模拟网页端向
https://www.shadertoy.com/shadertoy发内部请求, Cookie 用browser-cookie3从本机浏览器(Chrome / Edge / Brave / Firefox)里扒出来。 - 浏览器回退:前两条都不行, 就用 Playwright 拉起本机 Edge 过验证, 再在页面里用
fetch调同一个接口, 也能--headless。
资源下载同一套思路, 先 requests 直拉, 被 403 或 Cloudflare 拦的再丢进浏览器上下文重试, 碰到 408/429/500 自动重试。抓取吃的是 Shadertoy 内部接口和 Cloudflare 的脸色, 成功率会随站点变化上下波动, 所以配了 key 的路径永远首选。依赖就仨:requests、browser-cookie3、playwright, Python 3.8+。