Claude Code 自动归类 6000 张照片,Base URL 填 TaoToken
2026/9/20 11:23:17 网站建设 项目流程

1. 手机存储满了:让 Claude Code 自动归类 6000 张照片

Claude Code 能不能自动归类照片?这篇就讲一件事:如何把 Claude Code 接到 TaoToken 通道上,Base URL 填 https://taotoken.net/api,然后用它把接近 6000 张、最早能追到 2019 年的手机照片,按20260101-北京游玩这种「日期-地点-时间」目录整理好,再转进 NAS。整个过程我实测下来十几分钟跑完了日期目录和文件移动,后面再补地点和时间信息。

先说明 Claude Code 在照片整理里的真实角色,不然容易误解。它不是把 6000 张图一张张丢给模型看,而是能读写你电脑上的文件、执行 shell 命令、写并运行 Python 脚本。照片归类拆开就是四件事:读 EXIF 拍摄时间、按时间生成目录名、把文件移动过去、生成一份可核对的清单。Claude Code 负责把这些步骤串起来,模型只在关键节点做判断,比如命名规则、异常文件怎么兜底。理解了这一点,成本和安全边界就清楚了。

1.1 现状:手动建目录至少要一天

我手机相册里从 2019 年开始的照片一直没系统整理过,之前只是把占空间的视频零星拷出来,照片就一直躺在里面。直到手机提示存储满、拍照开始卡,我才把接近 6000 张照片一次性转移到电脑,准备分类后转入 NAS。

如果手动做:新建20260101这样的目录、逐张看拍摄时间、剪切粘贴、遇到重名还要处理、NAS 上路径还不能搞错。6000 张这个量级,一天时间基本就交代进去了,而且中间很容易因为疲劳点错。

1.2 我定的目录规范和验收标准

动手前先把规则写死,这决定了后面脚本怎么写、怎么验收:

  • 第一阶段只按日期建目录,格式YYYYMMDD,例如20260101
  • 第二阶段再补地点和时间,变成20260101-北京游玩-0930这种形态。
  • 不删除任何原文件,目标目录重名时自动加-1-2后缀。
  • 生成manifest.csv,记录每个文件的来源、目标、拍摄时间、状态。
  • 读不到拍摄时间的文件,统一落到_unknown目录,人工再判断。

验收标准也很直接:目录名对不对、文件数量对不对、有没有文件被漏掉或覆盖、manifest 能不能和实际目录对上。

1.3 为什么先拿几十张试跑

6000 张一次性移动,脚本逻辑只要错一个点就很痛,比如时区换算错、HEIC 读不出、NAS 挂载是只读、同名文件被覆盖。先拿 30 张左右跑一遍完整流程,把目录命名和转移结果确认下来,再放大到全量,这是最省时间的路径。

2. 前置:TaoToken 的 Key 与 Base URL 怎么拿

在配置 Claude Code 之前,先把通道准备好。TaoToken 在这个流程里只负责两件事:给你一把可用的 Key,以及一个 API 根地址。你不需要在本地部署任何模型服务。

2.1 注册账号并创建 Key

打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 完成注册,然后进入控制台。在 API Keys 页面创建一把 Key,创建后立即复制保存,很多平台的 Key 只在创建时完整显示一次。

Key 的样子通常是一串以sk-开头的字符。这里有个习惯要养成:Key 不要写进会被提交到 Git 的文件,也不要发到群里。放到本机环境变量或本地 settings 文件里就行。如果你要同时管理多台设备,可以按设备分别创建 Key,后面某台设备不用了直接单独吊销。

2.2 Base URL 只填到 /api 这一层

这是整篇文章最容易出错的地方。Claude Code 里要填的 Base URL 是:

https://taotoken.net/api

注意三点。第一,不要在后面加/v1,Claude Code 自己会拼接后续路径。第二,不要把浏览器里带 UTM 参数的官网地址粘进去,那是给页面访问用的,API 请求不认。第三,注意别把最后的/api漏掉,只填域名一样会 404。区分方法很简单:官网链接是给浏览器打开注册和查看文档的,API 地址是给程序发请求用的,两者用途不同。

3. 可复制配置:把 Claude Code 接到 TaoToken

配置这一步我尽量给全平台写法。核心就是两个环境变量:ANTHROPIC_BASE_URL指向 TaoToken 的 API 根地址,ANTHROPIC_AUTH_TOKEN放你刚创建的 Key。

3.1 安装 Claude Code 并检查版本

先确认 Node 环境,再全局安装:

node -v npm install -g @anthropic-ai/claude-code claude --version

Node 版本建议 18 以上。如果claude --version能正常输出版本号,说明命令已经可用。装完之后不要急着跑照片任务,先把通道调通。

3.2 环境变量写法

macOS 或 Linux 下,写入~/.zshrc~/.bashrc

export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_AUTH_TOKEN="sk-替换成你自己的Key"

改完执行source ~/.zshrc让配置生效。Windows PowerShell 临时生效可以这样写:

$env:ANTHROPIC_BASE_URL="https://taotoken.net/api" $env:ANTHROPIC_AUTH_TOKEN="sk-替换成你自己的Key"

想让 PowerShell 永久生效,用setx写入用户环境变量,然后重开一个终端窗口。如果 401 一直报,可以把ANTHROPIC_AUTH_TOKEN换成ANTHROPIC_API_KEY再试一次,两者在请求头里的传递方式不同,某些客户端只认其中一种。

3.3 settings.json 写法

不想污染全局环境变量,可以写 Claude Code 的 settings 文件,用户级路径是~/.claude/settings.json,项目级路径是项目下的.claude/settings.json

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "sk-替换成你自己的Key" } }

这种写法的好处是配置跟着项目走。你可以在照片整理项目里用 TaoToken 的通道,其他项目继续用别的配置,互不影响。

3.4 先用一条 curl 确认通道连通

配置文件写完后,先用最原始的方式验证。注意这里 Base URL 是https://taotoken.net/api,实际请求路径要拼上/v1/messages

curl -sS https://taotoken.net/api/v1/messages \ -H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "max_tokens": 32, "messages": [{"role": "user", "content": "只回复 OK"}] }'

返回的 JSON 里能看到模型回复的内容,就说明 Key 和地址都没问题。模型 ID 请以 TaoToken 文档里列出的为准,不同账号可用的模型可能不一样。接着再跑一条最短的 Claude Code 命令:

claude -p "只回复 OK 两个字"

两条都通过,通道就算接好了,可以进入照片任务。

4. 验证请求:先拿 30 张照片试跑

不要一上来就处理 6000 张。先从原始文件夹里挑 30 张,覆盖几种情况:有正常 EXIF 的 JPG、有 HEIC、有截图这类没有拍摄时间的、有文件名相同的。这样一轮就能把脚本的边界暴露出来。

4.1 准备样本目录

建议原始文件只读,目标目录单独建,两边不要混:

D:\photos_raw 原始照片,只读,不动 D:\photos_sorted 归类输出目录 D:\photos_sorted\manifest.csv

把 30 张样本复制到photos_raw下的sample子目录,先只对这个子目录操作。

4.2 给 Claude Code 的提示词

进入项目目录后启动claude,把下面这段需求发给它:

我的照片在 D:\photos_raw\sample,请帮我写一个 Python 脚本完成自动归类。 规则: 1. 读取 JPG/JPEG/HEIC/PNG 的 EXIF 拍摄时间,字段优先 DateTimeOriginal,其次 DateTime。 2. 读不到就把文件修改时间当兜底,并记录到 _unknown 目录。 3. 目录名用 YYYYMMDD,例如 20260101,先不带地点。 4. 目标根目录 D:\photos_sorted,重名时加 -1、-2 后缀,绝对不要覆盖。 5. 先生成 dry-run,把 源路径 -> 目标路径 打印出来,不要移动文件。 6. 生成 manifest.csv,字段 source,target,shot_time,status。 7. 我确认之后,再加 --run 参数执行真实移动。

4.3 参考脚本,用来核对我让它生成的结果

Claude Code 会写出脚本,你可以对照下面这段逻辑检查关键点。HEIC 需要额外依赖,先装pip install pillow pillow-heif

import csv import datetime import pathlib import shutil import sys from PIL import Image try: from pillow_heif import register_heif_opener register_heif_opener() except ImportError: pass SRC = pathlib.Path(r"D:\photos_raw\sample") DST = pathlib.Path(r"D:\photos_sorted") MANIFEST = DST / "manifest.csv" DRY_RUN = "--run" not in sys.argv EXTS = {".jpg", ".jpeg", ".png", ".heic"} def shot_time(p: pathlib.Path): try: with Image.open(p) as im: exif = im.getexif() except Exception: return None raw = exif.get(36867) or exif.get(306) if not raw: return None for fmt in ("%Y:%m:%d %H:%M:%S", "%Y-%m-%d %H:%M:%S"): try: return datetime.datetime.strptime(str(raw), fmt) except ValueError: continue return None rows = [] used = set() for p in sorted(SRC.rglob("*")): if not p.is_file() or p.suffix.lower() not in EXTS: continue dt = shot_time(p) folder = dt.strftime("%Y%m%d") if dt else "_unknown" if dt is None: dt = datetime.datetime.fromtimestamp(p.stat().st_mtime) d = DST / folder dst = d / p.name n = 1 while str(dst) in used or dst.exists(): dst = d / f"{p.stem}-{n}{p.suffix}" n += 1 used.add(str(dst)) rows.append({ "source": str(p), "target": str(dst), "shot_time": dt.isoformat(sep=" "), "status": "planned" if DRY_RUN else "moved", }) if DRY_RUN: print(f"PLAN {p} -> {dst}") else: d.mkdir(parents=True, exist_ok=True) shutil.move(str(p), str(dst)) DST.mkdir(parents=True, exist_ok=True) with MANIFEST.open("w", newline="", encoding="utf-8") as f: writer = csv.DictWriter( f, fieldnames=["source", "target", "shot_time", "status"]) writer.writeheader() writer.writerows(rows) print(f"共处理 {len(rows)} 个文件,dry_run={DRY_RUN}")

4.4 成功结果长什么样

先不带参数运行,看 dry-run 输出。正常情况下你会看到类似这样的映射:

PLAN D:\photos_raw\sample\IMG_0231.jpg -> D:\photos_sorted\20240317\IMG_0231.jpg PLAN D:\photos_raw\sample\IMG_0232.jpg -> D:\photos_sorted\20240317\IMG_0232.jpg PLAN D:\photos_raw\sample\Screenshot_1.png -> D:\photos_sorted\_unknown\Screenshot_1.png

重点检查四件事:日期目录是不是和照片实际拍摄日期对得上、同一天的照片是不是进了同一个目录、没有拍摄时间的有没有落到_unknown、有没有出现目标路径相同的情况。确认没问题再加--run执行真实移动,移动完去看manifest.csvstatus字段应该都是moved

5. 常见错排查

这一节是我自己踩过的坑,按现象对照处理。

现象常见原因处理方式
401 UnauthorizedKey 复制不全、带空格、Key 已吊销重新复制 Key,检查首尾空格,去控制台确认状态
404 Not FoundBase URL 多写了/v1,或粘了带 UTM 的官网地址改回https://taotoken.net/api
400 model not found模型 ID 拼错或账号不可用按文档里列出的模型 ID 原样填写
429 Too Many Requests触发频率或额度限制降低并发,检查账户额度
请求超时本机网络抖动、公司防火墙拦截换网络环境重试,先用 curl 定位是网络还是配置问题
HEIC 全部进_unknown没装pillow-heifpip install pillow-heif并注册 opener
日期集体偏一天用 UTC 时间做了换算EXIF 时间本身就是本地时间,不要转 UTC
文件名乱码终端编码和脚本编码不一致脚本统一用 UTF-8,路径用pathlib
移动到 NAS 报只读挂载参数是只读,或权限不足先整理到本地目录,再用同步工具推过去
同名文件被覆盖没做重名检测重名加-1-2后缀,并写进 manifest

还有两个容易忽略的点。一是路径过长,中文目录名叠加上层路径在 Windows 上可能超过限制,归类时别把层级搞太深。二是 NAS 上直接跑移动会非常慢,6000 个小文件的 IO 开销比本地大得多,先本地整理再整体同步,效率差好几倍。

6. 全量 6000 张与后续补地点、补时间

样本验证通过后,把SRC改成真正的原始目录,分批处理。6000 张不建议一次全跑,按 500 张一批,每批跑完看一次 manifest 和目录数量,发现问题可以立刻停下来。因为脚本逻辑是幂等的,已经移动过的文件不会重复处理,中断了直接重跑即可。

同步到 NAS 时,本地整理完再用工具推过去。Windows 下可以用robocopy的移动模式,macOS 和 Linux 下用rsync

rsync -av --remove-source-files /本地/photos_sorted/ /nas/photos/

第二阶段补地点和时间,思路是让 Claude Code 读取 manifest,再结合照片里的 GPS 信息或文件名线索,把20260101这种目录升级成20260101-北京游玩-0930。这里建议先输出一份重命名对照表,人工扫一眼确认,再批量执行。目录改名的脚本要额外处理路径冲突,比如改名后的目标目录已经存在,就把文件合并进去,而不是整体覆盖。

整个流程跑通之后,以后每个季度把新照片拷进原始目录,重跑一遍脚本就行。真正花时间的不是模型推理,而是文件 IO 和 NAS 同步,这也是为什么把规则先写死、脚本先验证,比反复对话调整要划算得多。

7. 把通道固定下来,继续做你的自动化

照片归类只是 Claude Code 的一个用法,它本质上是个能操作文件和执行命令的智能体,换个任务照样能用。如果你卡在接入这一步,先去 API Keys 页面重新确认 Key,再对照接入文档检查 Base URL:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api-keys 和 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc。

只是想快速验证模型是否可用、回复是否正常,可以打开模型对话页发一条消息试试:https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model-chat。如果你打算把 Claude Code 长期用在编码、脚本和 Agent 类任务上,直接看 Coding Plan 更合适:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding-plan。

配置这件事一次做对,后面就是重复跑流程了。我的建议是先把 30 张样本跑顺,再动全量,manifest 每次都要留下来,出了问题它就是你的回滚地图。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询