NightCafe 没有官方本地同步功能,所以“自动归档”实际是借助浏览器开发者工具和脚本,把生成结果从网页里提取出来,再按任务名组织成本地文件夹。这个方案不需要登录接口,也不依赖 NightCafe 的内部 API,只处理你在浏览器里能看到、能下载的图片文件。
适用场景是 NightCafe 网页端生成图片较多、手工保存容易漏的场景。操作动作是:从页面 DOM 或 Network 面板取图片链接,用脚本分组命名,再用 wget 或 Python 批量下载。验证方式是检查本地文件数量与页面结果数量一致、文件大小非零。风险边界是:页面结构或 CDN 地址可能调整,脚本需要按当前页面实际 class 名微调;如果下载被防盗链拦截,需要补充请求头。
分析 NightCafe 页面中图片地址的获取方式
NightCafe 的生成结果在网页上显示为图片,但直接截图会丢失原始分辨率。正确做法是拿到图片元素的真实文件链接。在浏览器中打开历史创建页,右键点击任意一张生成图,选择“检查”,在开发者工具的 Elements 面板里会看到对应的 img 标签,它的 src 属性就是图片的真实 URL。有些图片可能不是 img 而是背景图,这时要查看父元素的 background-image。这些 URL 通常指向 CDN 上的静态文件,可以单独用新标签页打开,如果能直接显示大图,说明链接可下载。
用脚本从历史创建页批量提取图片链接
按照上面方法拿到一张图的 class 之后,就可以在浏览器 Console 里批量抓取当前页面所有同类的图片链接。下面的脚本会找出所有包含指定 class 的 img 元素,把 src 提取出来并复制到剪贴板。你需要把 your-image-class 替换成实际观察到的 class 名。
const selector = 'img.your-image-class';
const urls = Array.from(document.querySelectorAll(selector))
.map(img => img.src)
.filter(url => url && url.startsWith('http'));
copy(urls.join('\n'));
console.log('提取到 ' + urls.length + ' 个图片链接');
如果页面是无限滚动加载,需要先滚动到底部,等待所有图片加载完再运行脚本。如果剪贴板不可用,可以把 urls 打印到控制台手动复制。
把图片 URL 分组成可下载的清单
从页面提取的 URL 顺序可能不是最终命名顺序。建议你在下载前先根据任务名给图片重命名,避免文件混乱。例如任务名是 concept_01,该任务下第 2 张图可以命名为 concept_01_02.png。以下 Python 示例读取一个纯文本 URL 列表,每行一个链接,再按一定规则生成对应的文件名清单。
import os
urls = open('urls.txt').read().splitlines()
task = 'concept_01'
with open('download_list.txt', 'w', encoding='utf-8') as f:
for i, url in enumerate(urls, 1):
ext = os.path.splitext(url.split('?')[0])[1] or '.jpg'
f.write(f"{url}\t{task}_{i:02d}{ext}\n")
这一步会把“URL 和保存文件名”的对应关系写进 download_list.txt,后续下载脚本可以直接读取这个清单。
用 wget 或下载器自动落盘到本地目录
有了清单,下一步就是把文件下载到以日期命名的目录里。以 Linux/macOS 的 wget 为例,可以读取清单中第一列 URL、第二列文件名,并保存到 NightCafe_20250607 目录下。命令如下:
mkdir -p NightCafe_20250607
while IFS=$'\t' read -r url filename; do
wget -O "NightCafe_20250607/$filename" "$url"
done < download_list.txt
如果使用 Python,也可以用 requests 循环下载,遇到网络失败可以自动重试:
import requests
import os
from time import sleep
os.makedirs('NightCafe_20250607', exist_ok=True)
with open('download_list.txt') as f:
for line in f:
url, filename = line.rstrip().split('\t')
target = os.path.join('NightCafe_20250607', filename)
try:
r = requests.get(url, timeout=30, headers={'User-Agent': 'Mozilla/5.0'})
r.raise_for_status()
with open(target, 'wb') as fp:
fp.write(r.content)
print('已保存', target)
except Exception as e:
print('失败', url, e)
sleep(1)
建议给 requests 加上 User-Agent 请求头,部分 CDN 会拦截空 UA 的请求。如果遇到 403,通常就是防盗链,还需要补上 Referer 头,值设成 NightCafe 的页面地址。
验证归档结果是否完整
下载完成后,需要确认本地文件数量和页面显示的结果数量一致,且文件大小不是 0 字节。在本地目录里执行下面的命令,统计文件个数和总大小:
ls -l NightCafe_20250607 | wc -l
find NightCafe_20250607 -type f -size 0 -print
第一条输出应该等于“下载清单里的行数 + 1”(因为 ls -l 的头部也算一行)。第二条找出空文件,如果有空文件说明下载失败,需要重新尝试。常见的失败原因是页面图片懒加载导致 src 是占位图,或者 CDN 校验了 Referer。针对懒加载,可以把脚本里的 img.src 换成 img.dataset.original 或 img.currentSrc 再试。针对防盗链,给 wget 加上 `--referer`=https://creator.nightcafe.studio/ 参数即可。