文叔叔游客上传 API 文档
说明:本文档为接口整理文档,接口为网站私有接口,仅供个人文件传输使用;接口随时可能发生变更,禁止高频调用、批量上传及滥用行为。
限制说明:游客模式文件有效期固定为 1 天,单文件最大支持 5GB。
通用说明
基础域名
- 业务 API 域名:
https://www.wenshushu.cn/ap
- 时间接口域名:
https://www.wenshushu.cn/ag/time
请求头公共参数
| 请求头 |
值 |
说明 |
Prod |
com.wenshushu.web.pc |
业务产品标识 |
X-TOKEN |
string |
匿名登录获取的 token,格式以 wss: 开头,除登录接口外所有接口必须携带 |
Req-Time |
string |
秒级服务器时间戳,创建任务接口签名使用 |
A-code |
string |
签名值,仅创建发送任务接口需要 |
Content-Type |
application/json |
POST JSON 请求统一类型;分片 PUT 上传使用 binary/octet-stream |
通用返回格式
1 2 3 4 5
| { "code": 0, "message": "", "data": {} }
|
code=0 代表请求成功;非 0 为业务错误码。
完整业务流程
- 匿名登录获取 Token
- 获取服务器时间戳
- 创建发送任务(计算 A-code 签名)
- 申请上传 ID
- 秒传探测
- 分片获取上传地址、PUT 上传文件分片
- 完成上传合并分片
- 轮询上传处理状态
- 生成文件分享链接
接口列表
1. 匿名登录(获取游客 Token)
请求
1 2
| POST /ap/login/anonymous Content-Type: application/json
|
请求体
响应 data 字段
| 字段 |
类型 |
说明 |
token |
string |
鉴权 token,前缀为 wss:,后续接口放入 X-TOKEN 请求头 |
2. 获取服务器时间戳
请求
1 2
| GET /ag/time Prod: com.wenshushu.web.pc
|
响应 data 字段
| 字段 |
类型 |
说明 |
time |
string |
秒级时间戳字符串,用于签名计算、Req-Time 头 |
3. 创建发送任务(需要 A-code 签名)
请求
1 2 3 4 5
| POST /ap/task/addsend A-code: {签名结果} Prod: com.wenshushu.web.pc Req-Time: {服务器秒级时间戳} Content-Type: application/json
|
请求体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| { "sender": "", "remark": "", "isextension": false, "notSaveTo": false, "notDownload": false, "notPreview": false, "downPreCountLimit": 0, "trafficStatus": 0, "pwd": "", "expire": "1", "recvs": ["social", "public"], "file_size": 文件字节数, "file_count": 1 }
|
注意:expire 游客模式仅支持传字符串 "1",代表有效期 1 天;JSON 原始字节必须和签名计算使用的 body 字符串完全一致,紧凑无多余空格,字段顺序不能修改。
响应 data 字段
| 字段 |
类型 |
说明 |
tid |
string |
任务 ID |
bid |
string |
box ID |
ufileid |
string |
预分配文件 ID |
4. 申请上传 ID
请求
1 2 3
| POST /ap/uploadv2/getupid Content-Type: application/json X-TOKEN: {token}
|
请求体
1 2 3 4 5 6 7 8 9
| { "preid": "{ufileid}", "boxid": "{bid}", "linkid": "{tid}", "utype": "sendcopy", "originUpid": "", "length": 文件字节数, "count": 1 }
|
响应 data 字段
| 字段 |
类型 |
说明 |
upId |
string |
上传会话 ID,后续上传全流程使用 |
5. 秒传探测
请求
1 2 3
| POST /ap/uploadv2/fast Content-Type: application/json X-TOKEN: {token}
|
请求体
1 2 3 4 5 6 7 8 9 10 11 12
| { "hash": { "cm1": "首片文件md5", "cs1": "首片文件sha1" }, "uf": { "name": "文件名", "boxid": "{bid}", "preid": "{ufileid}" }, "upId": "{upId}" }
|
业务规则
- 文件分片场景:需要计算
cm = sha1(全部分片md5字符串拼接结果),在首次 fast 之后再次调用接口带上完整 hash;
- 文件 ≤ 2MB 不分片场景:
cm = sha1(cm1);
- 命中秒传条件:返回
data.status=1,同时携带 data.ufile,可以跳过分片上传,直接执行后续合并接口。
6. 获取分片上传地址
请求
1 2 3
| POST /ap/uploadv2/psurl Content-Type: application/json X-TOKEN: {token}
|
请求体
1 2 3 4 5 6 7
| { "ispart": true, "fname": "文件名", "fsize": 分片字节大小, "upId": "{upId}", "partnu": 分片序号,从1开始 }
|
响应 data 字段
| 字段 |
类型 |
说明 |
url |
string |
PUT 上传分片目标地址 |
拿到 url 后,发送 PUT 请求,请求 Body 为分片原始二进制字节,请求头:
1
| Content-Type: binary/octet-stream
|
分片大小规则
| 文件总大小 |
单分片大小 |
| ≤ 2 MB |
不分片 |
| 2 MB ~ 1 GB |
2 MB |
| 1 GB ~ 10 GB |
6 MB |
| 10 GB ~ 20 GB |
10 MB |
| > 20 GB |
14 MB |
7. 合并上传分片
请求
1 2 3
| POST /ap/uploadv2/complete Content-Type: application/json X-TOKEN: {token}
|
请求体
1 2 3 4 5 6 7 8 9
| { "ispart": true, "fname": "文件名", "upId": "{upId}", "location": { "boxid": "{bid}", "preid": "{ufileid}" } }
|
8. 查询上传处理进度
请求
1 2 3
| POST /ap/ufile/getprocess Content-Type: application/json X-TOKEN: {token}
|
请求体
响应 data 字段
| 字段 |
类型 |
说明 |
rst |
string |
处理状态;success 代表处理完成 |
调用策略
间隔约 1 秒轮询,最多调用 60 次,直到 rst="success"。
9. 生成分享链接
请求
1 2 3
| POST /ap/task/copysend Content-Type: application/json X-TOKEN: {token}
|
请求体
1 2 3 4 5
| { "bid": "{bid}", "tid": "{tid}", "ufileid": "{ufileid}" }
|
响应 data 字段
| 字段 |
类型 |
说明 |
public_url |
string |
公开分享页面链接 |
social_url |
string |
带凭证社交分享链接 |
mgr_url |
string |
任务管理链接,禁止对外分发 |
social_token |
string |
社交分享凭证 token |
附加接口
获取任务详情
请求
1 2 3
| POST /ap/task/mgrtask Content-Type: application/json X-TOKEN: {token}
|
请求体
1
| {"tid":"{tid}","password":""}
|
返回任务基础信息、过期时间。
获取取件码
请求
1 2 3
| POST /ap/task/get_code Content-Type: application/json X-TOKEN: {token}
|
请求体
公开分享模式返回空字符串。
A-code 签名算法
入参
epoch:服务器返回的秒级时间戳字符串
token:匿名登录返回完整 token(带 wss: 前缀)
body:本次 POST 请求原始 JSON 字符串(紧凑,与 HTTP 请求发送字节完全一致)
算法步骤
- 计算
md5(body + token),得到 32 位小写 md5 十六进制字符串
- 将 md5 十六进制原始字节做 base58 编码
- 将
epoch 字符串反转,截取前 5 位字符
- 使用截取到的 5 位索引字符,依次取出
epoch 对应下标的字符拼接,末尾拼接 000,得到 8 字节 key_iv,同时作为 DES-CBC 的 key 和 iv
- base58 编码结果使用 pkcs7 填充,DES-CBC 加密
- 加密结果 base64 编码,输出字符串即为
A-code
Python 示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import base64 import hashlib import base58 from Cryptodome.Cipher import DES from Cryptodome.Util import Padding
def a_code(epoch: str, token: str, body: str) -> str: md5_hex = hashlib.md5((body + token).encode()).hexdigest() b58 = base58.b58encode(md5_hex) idx = epoch[::-1][:5] key_iv = ("".join(epoch[int(i)] for i in idx) + "000").encode() cipher = DES.new(key_iv, DES.MODE_CBC, key_iv) ct = cipher.encrypt(Padding.pad(b58, DES.block_size, style="pkcs7")) return base64.b64encode(ct).decode()
|
签名错误返回 code=-3,message 为 user-agent error:-3,该提示与 UA 无关,仅代表签名校验失败。
业务限制
- 游客 Token 与上传任务有效期均为 1 天,
expire 参数游客模式只能传 "1"。
- 存在 IP 访问频率风控,禁止批量上传。
- 部分文件类型会触发风控拦截,例如直接上传
apk 文件会返回 1170 错误,可将文件压缩为 zip 包规避。
- 创建任务接口签名校验严格,请求 JSON 字节必须和签名计算使用的 body 完全一致,空格、换行、字段顺序改变都会导致签名校验失败。