ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AI开发实战:五天撸了一个C站模型下载器,顺手把 TaoToken 配置塞进 settings.json

AI开发实战:五天撸了一个C站模型下载器,顺手把 TaoToken 配置塞进 settings.json 1. 从手动下载到自建工具这个场景到底解决什么问题C站Civitai上的模型动辄几个 GB手动点下载、等进度条、断线重连一套流程下来人已经麻了。更麻烦的是当你需要批量拉一批模型、打包发给同事或者想把模型元信息整理成自己的资料库时纯手工操作基本不可行。我试过市面上一些脚本和浏览器插件要么功能只做了一半要么跑着跑着就崩稳定性堪忧。所以这次干脆自己撸一个前端用 React 做任务提交和列表展示后端用 PHP 7.4 写接口层MySQL 8.0 存模型元信息和任务状态。整个链路拆成「提交下载任务 → 后端拉取模型信息 → 下载文件 → 分卷打包 → 上传网盘 → 回写状态」几个独立环节用定时任务串起来。五天时间从原型到跑通核心不是写多复杂的代码而是把每个环节的边界划清楚。这里有个容易被忽略的点当你同时用多个 AI 工具比如 Trae 写前端、Dify 跑工作流、Claude Code 做代码审查时每个工具都要单独配 Key、单独管额度切换成本很高。我的做法是把 TaoToken 的统一 Key 塞进settings.json让所有工具走同一个鉴权入口省掉反复登录和配置的麻烦。下面把整个搭建过程和配置骨架拆开讲。2. TaoToken 前置统一 Key 与 settings.json 骨架在开始写下载器之前先把 AI 工具的鉴权问题解决掉。个人开发者手里往往有好几个 AI 编码工具每个都要单独申请 Key、单独记额度时间一长就乱了。TaoToken 的思路是提供一个统一的 API 入口你只需要一个 Key就能在多个工具之间复用。官网地址https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 入口https://taotoken.net/api具体操作上先去控制台创建一个 API Key然后把它写进项目的settings.json。这个文件可以放在项目根目录也可以放在用户配置目录取决于你用的工具链。下面是一个可复制的配置骨架字段名按你实际使用的工具调整{ ai: { provider: taotoken, base_url: https://taotoken.net/api, api_key: sk-你的TaoTokenKey, models: { coding: claude-sonnet, chat: gpt-4o, workflow: grok-3 }, timeout: 120, max_retries: 3 }, project: { name: civitai-downloader, frontend: react, backend: php74, database: mysql8 } }注意api_key不要提交到 Git 仓库建议用环境变量注入或者在.gitignore里排除settings.json。配置好之后你的 React 前端、PHP 后端、Dify 工作流都可以读同一个settings.json不用每个工具单独配一遍。这一步做完后面写代码时调用 AI 接口就统一走 TaoToken 的入口省心不少。3. 可复制配置React PHP MySQL 三层落地3.1 React 前端任务提交与列表展示前端核心就两个页面一个提交表单一个任务列表。表单里填 C 站模型页面 URL、选择任务类型下载/打包/上传提交后调 PHP 接口写入 MySQL。列表页展示任务状态、文件大小、下载进度支持按状态筛选。用 Trae 生成前端代码时把原型截图和腾讯云验证码的接入文档一起丢进去Claude-3.7-Sonnet 基本能一次跑通。关键是把组件拆清楚TaskForm负责提交TaskList负责展示TaskItem负责单条状态渲染。状态管理用 React 自带的useStateuseEffect就够了不需要上 Redux。// TaskForm.jsx 核心逻辑 const submitTask async (url, taskType) { const res await fetch(/api/task/create, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ page: url, task_type: taskType }) }); const data await res.json(); if (data.code 0) { setTasks(prev [data.task, ...prev]); } };3.2 PHP 接口层拆成独立任务定时触发后端不搞复杂的状态机就是把每个环节拆成独立任务下载任务只管下载上传任务只管上传完成就改状态。因为服务器资源有限同一时间只允许一个下载任务跑所以不用考虑分布式锁。数据库访问用php-crud-api封装直接通过 URL 操作数据省掉手写 CRUD 的功夫。PHP 层只负责调 API、写状态、记日志。// download.php 核心逻辑 $task getTaskById($taskId); if ($task[status] ! pending) { exit(task already running); } updateTaskStatus($taskId, downloading); $file downloadModel($task[download_url], $task[folder]); if ($file) { updateTaskStatus($taskId, downloaded); updateTaskField($taskId, file, $file); } else { updateTaskStatus($taskId, failed); }3.3 MySQL 表结构task 与 volume任务表存模型元信息和状态分卷表存打包后的文件信息。字段设计上status用字符串而不是枚举方便后续扩展状态page存原始 URL方便回溯。CREATE TABLE task ( Id INT PRIMARY KEY AUTO_INCREMENT, created DATETIME, updated DATETIME, name VARCHAR(100), file_size VARCHAR(20), base_model VARCHAR(20), type VARCHAR(50), page VARCHAR(500), status VARCHAR(50), task_type VARCHAR(50), download_url VARCHAR(500), md5 VARCHAR(50), folder VARCHAR(50), file VARCHAR(50), pan VARCHAR(255), code VARCHAR(10), cover TEXT, description TEXT ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE volume ( Id INT PRIMARY KEY AUTO_INCREMENT, model VARCHAR(50), folder VARCHAR(50), file VARCHAR(100), status VARCHAR(20), created VARCHAR(20) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;3.4 Dify 工作流模型描述生成C 站采集回来的模型描述里经常有违禁词直接发布风险高。用 Dify 跑一个工作流把原始描述丢给 Grok3 重写输出 800 字以内的干净介绍。提示词里明确要求「不出现描述性、裸体、色情等不健康用语」输出纯文本不要 Markdown。工作流节点很简单输入模型页面 URL → 抓取原始描述 → Grok3 重写 → 输出到 Typecho。发布时直接往 API 提交 C 站页面地址就行。4. 验证请求一次下载任务从请求到落库配置写完之后跑一次完整链路验证。用 curl 模拟前端提交任务curl -X POST https://your-domain.com/api/task/create \ -H Content-Type: application/json \ -d {page:https://civitai.com/models/xxxxx,task_type:download}预期返回{ code: 0, task: { Id: 101, name: example-model, status: pending, task_type: download, page: https://civitai.com/models/xxxxx } }然后查数据库确认落库SELECT Id, name, status, task_type, created FROM task WHERE Id 101;如果status是pending说明任务已写入定时任务会把它捞起来执行。等几分钟后再查status应该变成downloading或downloadedfile字段有值。这一步跑通说明前端 → PHP → MySQL → 定时任务 → 下载器整条链路是通的。再验证一下 TaoToken 的 Key 是否生效在 PHP 里调一次模型对话接口确认返回正常。curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的TaoTokenKey \ -H Content-Type: application/json \ -d {model:gpt-4o,messages:[{role:user,content:ping}]}返回里有choices字段就说明 Key 配置正确。5. 本篇常见错排查问题一PHP 调 API 返回 401先检查settings.json里的api_key有没有多余空格再确认base_url是不是https://taotoken.net/api。如果用的是环境变量打印一下getenv(TAOTOKEN_KEY)看是否为空。问题二MySQL 写入中文乱码建表时确认CHARSETutf8mb4PHP 连接时设置SET NAMES utf8mb4。如果用的是php-crud-api在配置文件里指定charset参数。问题三下载任务卡在 downloading 不动检查定时任务是否在跑看 Cronicle 的任务日志。常见原因是下载 URL 过期C 站的下载链接有时效性需要重新拉取。另外确认服务器磁盘空间够不够几个 GB 的模型很容易把盘写满。问题四React 前端提交后列表不刷新检查fetch的返回状态码如果是 200 但code不是 0说明后端逻辑有问题。可以在 PHP 里加一行error_log把请求参数记下来方便排查。问题五TaoToken Key 在多个工具间冲突如果你同时在 Trae、Dify、Claude Code 里用同一个 Key注意并发限制。建议在settings.json里给每个工具单独配max_retries避免同时重试把额度打满。6. 统一鉴权与后续扩展把 TaoToken 的 Key 塞进settings.json之后最大的好处是切换工具时不用重新配鉴权。你可以在项目根目录放一份settings.json所有 AI 工具读同一个文件Key 变了只改一处。如果你主要做长期编码和 Agent 任务可以看看 Coding Plan 的额度方案比按次调用更划算。需要管理多个 Key 或者查看用量去控制台就行。接入文档里有完整的 API 说明和示例代码照着改就能用。后续扩展方向把分卷打包和网盘上传也接进定时任务任务表加一个pan字段记录网盘路径code字段存分享码。模型资讯站那边用 Typecho 的 Markdown 接口自动发布Dify 工作流跑完直接写库。整个链路跑顺之后你只需要在 React 页面提交一个 C 站 URL剩下的下载、打包、上传、发布全自动完成。
返回列表