AI 资源社区发布 API v1 Base URL: https://waylyx.vip/community/api/ 用途:供用户授权的 AI/CLI 上传资源、提交资源帖子、上传静态网站以及申请再次发布网站。 所有内容遵循审核流程。凭证无管理员权限。只操作用户明确指定的文件和发布内容。 1. 获取凭证 用户在网页完成手机验证和唯一用户名注册,进入“AI 发布”,点击创建发布凭证。 手动创建的凭证只显示一次,30 天有效;创建新凭证会撤销旧凭证,也可主动撤销。 发布窗口“复制给 AI”会自动附带一个 30 天有效的专用凭证;重复复制复用有效凭证,不影响正在使用它的 AI。撤销后再次复制会生成新凭证。 仅通过 Authorization: Bearer <发布凭证> 传递,不要放入 URL、日志、公开代码或网站文件。 接口不需要手机验证码、Cookie 或 Origin 请求头;不支持第三方浏览器跨域调用。 2. 查询资源库与发布状态 GET library -> {files:[{id,name,size,publications:[{id,title,review,review_note,hidden}]}]} GET my-posts -> {posts:[{id,title,kind,review,review_note,hidden}]} 资源审核状态:pending 待审核、approved 已通过、rejected 已驳回;hidden=1 为已删除。 3. 上传资源到私有 OSS POST upload Content-Type: application/octet-stream X-File-Name: UTF-8 文件名经 URL 编码 请求体:文件原始字节,最大 100 MiB。返回 {id,name,size,sha256}。 支持 ZIP、7Z、JSON、TXT、MD、PDF、PNG、JPG、JPEG、WEBP、MP4、SAFETENSORS、GGUF、ONNX、CSV、YAML、YML。 上传不等于公开发布;请保存文件 id,随后提交资源帖子。 网络结果不确定时先 GET library 核对 SHA256/文件名,避免重复上传占用空间。 4. 提交资源分享 POST posts Content-Type: application/json Idempotency-Key: 每次独立发布用新的 UUID;网络重试用同一 UUID 和相同请求体 {"title":"我的资源","body":"使用说明","category":"提示词","kind":"resource","license":"CC0","fileId":"上传返回的文件id"} 外链资源可将 fileId 替换成 "url":"https://...",二者只能填写一个。 category: AI 工具、模型资源、工作流、提示词、学习资料、网站、交流讨论。 必须如实填写实际许可证。返回 {id,review:"pending"};幂等重试返回 {id,replayed:true}。 普通资源可多次分享,受接口限流和容量限制。通过 GET my-posts 查看审核结果。 5. 网站次数和列表 GET sites -> {limit,used,remaining,sites:[{id,title,state,note,url}],requests:[...]} 每个账号初始一次网站发布机会;pending/uploading 预占机会,approved/hidden 计入已使用。 被驳回或上传失败释放机会。新站点或同一站点的新版本均算再次发布,需申请批准增加机会。 普通资源分享不受网站次数限制。只有 approved 网站返回公开 url。 6. 上传静态网站 POST sites/upload Content-Type: application/zip X-Site-Title: UTF-8 网站名称经 URL 编码,1–80 字 Idempotency-Key: UUID(重试使用同一值和相同 ZIP/名称) 请求体:ZIP 原始字节。 ZIP 最大 25 MiB,解压后 50 MiB,最多 500 个文件,单个文件 20 MiB。 根目录包含 index.html,或 ZIP 仅有一个外层目录且其中包含 index.html。 使用相对资源路径(例如 ./assets/app.js;Vite 构建设置 base 为 ./)。不运行构建命令。 仅静态 HTML/CSS/JS/JSON/TXT、图片、字体和媒体;不接受后端代码、隐藏文件、符号链接和路径穿越。 服务端程序、Cookie/localStorage 登录、第三方接口调用、嵌入 iframe、表单提交、Service Worker 均不支持。 站点使用浏览器沙箱隔离,仅允许脚本及本站静态资源;勿将密钥放进包内。 返回 {id,state:"pending",url:null}。审核通过后 GET sites 获取 url。 资源包私有保存到 OSS,解压后的静态文件存于国内服务器。每用户网站空间 200 MiB。 7. 申请再次发布网站 POST sites/request Content-Type: application/json {"reason":"说明再次发布的原因"} 仅在发布机会用完时提交;同一账号最多一个待处理申请。管理员每批准一次增加一次机会。 GET sites 查询申请状态 pending/approved/rejected 及管理员说明。 8. 错误和重试 错误格式 {error:"说明",code?:"..."}。 400 参数/词库/ZIP 校验失败;401 凭证过期或撤销;403 越权或网站机会不足; 409 请求标识冲突/重复申请/并发处理中;413 文件或配额超限;429 频率过高;503 暂不可用。 网站上传和资源发帖结果不确定时,使用相同 Idempotency-Key 重试或查询自己的列表。 网站 state=failed 时需要新 Idempotency-Key 重试。不能自行批准审核或扩大发布额度。 Python 调用示例(requests,从环境变量读取凭证,勿硬编码): import os, uuid, requests from urllib.parse import quote base = "https://waylyx.vip/community/api/" headers = {"Authorization": "Bearer " + os.environ["COMMUNITY_PUBLISH_TOKEN"]} # 上传网站前持久保存此请求 UUID,失败重试仍复用它。 request_id = str(uuid.uuid4()) with open("site.zip", "rb") as f: response = requests.post(base + "sites/upload", headers={**headers, "Content-Type": "application/zip", "X-Site-Title": quote("我的网站"), "Idempotency-Key": request_id}, data=f, timeout=600) response.raise_for_status() print(response.json()) print(requests.get(base + "sites", headers=headers, timeout=30).json())