▼
English
Deutsch
Plattdüütsch
Lëtzebuergesch
Nederlands
Dansk
Svenska
Bokmål
Nynorsk
Íslenska
Føroyskt
Español
Català
Galego
Português
Français
Italiano
Latina
Română
Rumantsch
Gaeilge
Suomi
Magyar
Euskara
Esperanto
日本語
繁體中文(台灣)
繁體中文(香港)
粵語
한국어
Tiếng Việt
ไทย
Bahasa Indonesia
Bahasa Melayu
हिन्दी
Ελληνικά
Polski
Čeština
Українська
Русский
Türkçe
العربية
עברית
Kiswahili
ʻŌlelo Hawaiʻi
tlhIngan Hol
Quenya
本站各表单能做的一切,都可以用脚本完成。所有响应都是 JSON,包括错误在内,所以您永远不必猜测响应体是结果还是说明。
向端点发送 POST,使用表单参数或 JSON 请求体均可。两者等价;选您的工具更方便的那种。action 参数决定要执行的操作。凡是人输入的内容 — 粘贴的文本、URL、待翻译的文本 — 都请使用 --data-urlencode,因为 -d 会原样发送值,遇到第一个 & 就会被截断。像 action 这样的固定值用普通的 -d 就行。wget 根本没有 --data-urlencode,所以用 wget 时要么自己对这类值做百分号编码,要么发送 JSON 请求体,后者无需任何编码。
curl -X POST https://0wx.cat/api.cgi \
-d action=paste --data-urlencode 'content=hello & world'
curl -X POST https://0wx.cat/api.cgi \
-H 'Content-Type: application/json' \
-d '{"action":"paste","content":"hello & world"}'
wget -qO- --header='Content-Type: application/json' \
--post-data '{"action":"paste","content":"hello & world"}' https://0wx.cat/api.cgi
在表单请求体中,& 用于分隔参数,而 curl -d 不会对您给出的内容做编码。因此带查询字符串的 URL 会在第一个 & 处被截断,其余部分会作为单独的参数到达。请使用 --data-urlencode,或发送 JSON。多余的参数会被拒绝而不是忽略,所以这会明确地失败,而不是存下半截链接。
# wrong -- the value is cut at the &
curl -X POST https://0wx.cat/api.cgi \
-d action=tinyurl -d 'url=https://example.com/?a=1&b=2'
# right
curl -X POST https://0wx.cat/api.cgi \
-d action=tinyurl --data-urlencode 'url=https://example.com/?a=1&b=2'
# also right -- JSON needs no escaping
curl -X POST https://0wx.cat/api.cgi -H 'Content-Type: application/json' \
-d '{"action":"tinyurl","url":"https://example.com/?a=1&b=2"}'
# wget has no --data-urlencode, so percent-encode it yourself...
wget -qO- --post-data 'action=tinyurl&url=https%3A%2F%2Fexample.com%2F%3Fa%3D1%26b%3D2' https://0wx.cat/api.cgi
# ...or send JSON, which needs no encoding at all
wget -qO- --header='Content-Type: application/json' \
--post-data '{"action":"tinyurl","url":"https://example.com/?a=1&b=2"}' https://0wx.cat/api.cgi
可选。不带密钥的请求是匿名的,行为与匿名访客完全相同 — 结果无论如何都是公开的,唯一的区别是它是否出现在您的文件列表里。在账户页面生成密钥,并作为 bearer 令牌发送;也可以通过 apikey 参数传递,但放在查询字符串里的密钥会留在服务器日志和浏览器历史中。
curl -X POST https://0wx.cat/api.cgi \
-H 'Authorization: Bearer YOUR_KEY' \
-d action=whoami
wget -qO- --header='Authorization: Bearer YOUR_KEY' \
--post-data 'action=whoami' https://0wx.cat/api.cgi
| action | 参数 | 说明 |
|---|---|---|
whoami | — | 确认密钥可用,并报告当前的限制。不消耗任何配额;请先调用它。 |
ip | — | 报告您的地址、它的 PTR 记录、地理定位到的国家、省/州和城市、坐标,以及您发送的 user agent。不需要密钥,带不带密钥答案都相同。有意比网页版窄:没有 WHOIS、没有 DNS 区域、也没有黑名单查询,所以调用它对服务器来说只是一次本地数据库读取。 |
upload | file (可重复), resize, lifetime, gallery 或 g * | 上传一个或多个文件。必须使用 multipart/form-data。指定图库名称会把文件直接放进该图库,并返回其 id。 |
tinyurl | url, lifetime | 缩短一个 URL。 |
hugeurl | url, lifetime | 故意把一个 URL 加长到荒唐的程度。 |
paste | content, lifetime | 存储一段文本并返回指向它的链接。 |
translate | content, to, from | 翻译文本。to 和 from 使用 langs 操作返回的代码 — 注意它们并不总是国家代码:丹麦语是 da 而不是 dk。from 可以省略或填 auto,由后端自动检测语言;对于短文本,明确给出会得到更好的结果。 |
langs | 以 supported_langs 列出 translate 接受的语言:每种语言一个对象,代码对应名称,顺序与本站提供的顺序相同。不需要 API 密钥。 | |
dyndns | key, ip, format | 更新动态 DNS 名称。这是唯一不需要 API 密钥的操作:它由路由器调用,而路由器只有一个填 URL 的字段,没法发送请求头。key 是您账户中显示的每个名称各自的更新密钥,不是您的 API 密钥。省略 ip 则使用您发起调用的地址。响应是事实上的 dyndns2 标准用词 — good、nochg、badauth、abuse 或 dnserr — 以纯文本返回,因为路由器解析的就是这个;加 format=json 可得到通常的 JSON。 |
listfiles * | page, g | 列出您的文件,包含信息面板显示的所有内容,外加缩略图和直接链接。g 可将范围限定为某一个图库,或填 none 只列出不在任何图库中的文件。 |
listpastes * | page | 列出您的粘贴内容,每条附带 200 个字符的预览,而不是完整正文。 |
listurls * | page | 列出您的短网址和超长网址,以及每一个指向的地址。 |
otl * | share | 为您的某个文件创建一次性链接。每次调用都会生成新的链接,所以把同一个文件交给两个人会得到两个链接。 |
listotl * | page | 列出您的有效一次性链接、每个链接指向的文件,以及该文件是否已经过期。 |
listgalleries * | — | 列出您的图库,包括 id、名称、文件数和发布状态。 |
gallery * | g, publish | 报告图库的发布状态,给出 publish 时则修改它。 |
move * | share (可重复), gallery 或 g | 把文件移入图库,可按名称(不存在则新建)或按 id 指定。两者都省略则把文件移回主列表。 |
delete * | share (可重复), g, otl, withfiles | 删除文件、粘贴内容、短网址、图库、一次性链接,或它们的任意组合。分享标识会先与您的文件匹配,然后再与您的粘贴内容和链接匹配,所以调用者不必按类型区分。一次性链接单独放在 otl 里:删除链接不能与删除它所指向的文件混淆。 |
* 这些操作需要 API 密钥。它们读取或修改某一账户自己的数据,因此没有匿名形式。
share 和 g 接受重复字段、JSON 数组或逗号分隔的列表 — 选您的工具最方便的那种。重复项会被忽略。
curl -X POST https://0wx.cat/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
-d action=move -d share=Ab3xK9pQ -d share=Zz7yT2mN --data-urlencode 'gallery=Holiday 2026'
curl -X POST https://0wx.cat/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
-d action=delete -d 'share=Ab3xK9pQ,Zz7yT2mN'
curl -X POST https://0wx.cat/api.cgi -H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_KEY' \
-d '{"action":"move","share":["Ab3xK9pQ","Zz7yT2mN"],"g":7}'
wget -qO- --header='Authorization: Bearer YOUR_KEY' \
--post-data 'action=delete&share=Ab3xK9pQ,Zz7yT2mN' https://0wx.cat/api.cgi
凡是需要指定图库的地方 — 无论是 upload 还是 move — 都有同样两种方式:g 给出已有的 id,或 gallery 给出名称,名称不存在时会新建。两者都发送时,以 g 为准。响应中包含图库 id。注意,删除图库只删除图库本身,其中的文件会留在主列表中 — 这与网页表单不同,网页表单会在询问后连文件一起删除。传 withfiles=true 可以把文件也删掉:一个整理分组的脚本不应该不小心弄丢上传的内容。
curl -X POST https://0wx.cat/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
-F action=upload -F file=@photo.jpg --form-string 'gallery=Holiday 2026'
curl -X POST https://0wx.cat/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
-d action=gallery -d g=7 -d publish=true
wget -qO- --header='Authorization: Bearer YOUR_KEY' \
--post-data 'action=gallery&g=7&publish=true' https://0wx.cat/api.cgi
上传不能使用 JSON 请求体,因为文件必须以 multipart 形式发送。重复 file 部分即可一次发送多个文件。每个文件单独报告:响应包含一个 files 列表列出被接受的文件,和一个 rejected 列表列出被拒绝的文件,所以部分成功仍然算成功。
curl -X POST https://0wx.cat/api.cgi \
-H 'Authorization: Bearer YOUR_KEY' \
-F action=upload \
-F file=@photo.jpg \
-F file=@notes.txt \
-F lifetime=7d
这一项没有 wget 的写法。wget 无法构造 multipart/form-data 请求体 — 它没有与 curl 的 -F 对应的功能 — 而上传必须是 multipart。请使用 curl,或者自己组装请求体和 boundary,再用 --post-file 发送。
对所有会存储内容的操作都是可选的。接受纯秒数,或者数字后接 m、h 或 d — 与网页表单接受的形式相同。省略或传 0 表示永久保存。
每个响应都是一个带有 ok 字段的 JSON 对象。成功时携带结果;失败时携带一个稳定的 error 代码和一段供人阅读的 message。请根据代码做分支,把消息写进日志。
{"ok":true,"type":"paste","share":"Ab3xK9pQ",
"url":"https://0wx.cat/p/Ab3xK9pQ","bytes":11}
{"ok":false,"error":"url_too_long",
"message":"URL exceeds the maximum length."}
当文件带有标签时,listfiles 会在其条目中加入 file_tags:艺术家、标题和专辑,在文件上传时从 ID3、Vorbis 注释或 MP4 atom 中读取。没有可报告的内容时(这是大多数文件的情况),这个键是不存在而不是 null,所以读取前请先检测。各个字段也可能缺失 — 一个文件可能有标题却没有专辑。文件元数据中的其他内容一概不暴露:iTunes 购买的文件记录了购买者的姓名和 Apple ID,这些是有意从不读取的。
{"ok":true,"type":"files","total":2,"page":1,"pages":1,"files":[
{"share":"Ab3xK9pQ","name":"autobahn.mp3","mime":"audio/mpeg",
"bytes":8123456,"url":"https://0wx.cat/i/Ab3xK9pQ",
"file_tags":{"artist":"Kraftwerk","title":"Autobahn","album":"Autobahn"}},
{"share":"Zz7yT2mN","name":"photo.jpg","mime":"image/jpeg",
"bytes":204800,"url":"https://0wx.cat/i/Zz7yT2mN"}
]}
| error | HTTP | 说明 |
|---|---|---|
unknown_action | 400 | 没有这个操作。 |
bad_json | 400 | 请求体不是有效的 JSON,或者某个字段包含了嵌套结构。 |
unexpected_parameter | 400 | 收到了该操作不接受的参数 — 通常是值里有未编码的 &。消息中会列出这些参数。 |
bad_key | 401 | 无法识别该密钥。错误的密钥会被拒绝,而不是悄悄当作匿名处理。 |
bad_url | 400 | URL 格式不正确,或者使用了 http(s)、ftp、gopher 以外的协议。 |
bad_lifetime | 400 | 保存期限不是数字,也不是数字后接 m、h 或 d 的形式。 |
no_content | 400 | 没有发送任何要存储的内容。 |
url_too_long | 413 | URL 超过了长度限制。 |
paste_too_long | 413 | 文本超过了粘贴内容的大小限制。限制以 UTF-8 字节计算,因此非拉丁文字占用的字节数会多于其字符数。 |
too_many_files | 413 | 文件数超过单次调用可接受的上限。 |
no_usable_files | 415 | 所有文件都被拒绝。请查看 rejected 列表了解原因。 |
backend_unavailable | 502 | 翻译后端没有应答。 |
internal | 500 | 发生了意外错误。已记录到日志。 |
请调用 whoami 读取当前值,而不要硬编码 — 这些值由服务器运营者设定,可能会变。大小以 UTF-8 字节计。
0wx.sh 封装了上面的全部功能。它是纯 POSIX shell,只依赖 curl,而且短到可以在运行前读一遍 — 对一个会持有您 API 密钥的脚本来说,这正是应该做的事。把密钥放进 OWX_KEY 而不是通过 --key 传递,它就不会留在您的 shell 历史里。
wget https://0wx.cat/clients/0wx.sh chmod +x 0wx.sh export OWX_KEY=YOUR_KEY ./0wx.sh help ./0wx.sh paste --content 'hello & world'
0wx.py 与 shell 客户端功能相同,但会解析响应并打印各字段的含义,而不是把原始 JSON 扔给您 — 想要原始形式时加 --json。只用标准库:不需要 requests,无需安装任何东西。如果您在写自己的客户端,它的 send() 和 report() 函数值得一读:两者合起来展示了如何构造请求、如何从失败的请求中取出消息,以及响应里有什么。
wget https://0wx.cat/clients/0wx.py chmod +x 0wx.py export OWX_KEY=YOUR_KEY ./0wx.py listfiles ./0wx.py listfiles --json | jq '.files[].url'
0wx.pl 与 Python 版功能相同,输出也相同。只用核心模块 — HTTP::Tiny 和 JSON::PP 自 Perl 5.14 起就随 Perl 一起发布,所以无需安装任何东西。如果您在写自己的客户端,值得和 Python 客户端对照着读:两种语言在请求出错时的失败方式不同,两个脚本都标明了出错的位置。
wget https://0wx.cat/clients/0wx.pl chmod +x 0wx.pl export OWX_KEY=YOUR_KEY ./0wx.pl listfiles
0wx.ps1 是 Python 客户端在 Windows 上的对应版本:相同的命令、相同的输出,并且会解析响应而不是把原始 JSON 扔给您 — 想要原始形式时加 --json。它是为机器上已有的 Windows PowerShell 编写的,所以无需安装任何东西,并且可以不加修改地在 PowerShell 7 上运行。您可能需要在运行它的窗口中执行 Set-ExecutionPolicy -Scope Process Bypass,这是 Windows 在问您是否真的要运行一个下载来的脚本 — 一个合理的问题,而且这个文件短到可以先读一遍。
$env:OWX_KEY = 'YOUR_KEY' .\0wx.ps1 listfiles .\0wx.ps1 paste --content 'hello & world' .\0wx.ps1 upload --file .\holiday.jpg --gallery 'Holiday 2026'
0wx.html 与桌面客户端有同样一组标签页,由三个文件组成 — 一个页面、一个样式表和一个脚本 — 无需安装、不用框架,除了本站之外不从任何地方加载内容。分成三个而不是一个,是因为本站的内容安全策略禁止内联脚本和样式,这一点值得保留。可以把文件拖放到它上面。它必须从这里打开,而不是保存后从您的磁盘打开:API 不发送跨域头,所以本地副本的每一个请求都会在发出之前被您的浏览器拒绝。密钥保存在内存中,除非您勾选记住它。
https://0wx.cat/clients/0wx.html
0wx-gui.ps1 与桌面客户端有同样一组标签页,用 WinForms 绘制 — 这意味着完全不需要安装任何东西,因为它已经是 Windows 的一部分。请把它和 0wx.ps1 放在同一个文件夹里:窗口借用那个文件的请求处理逻辑,而不是再带一份副本,所以两个文件都需要。Windows 在运行不是它自己写的脚本之前会先询问,这是合理的;两个文件都短到可以在回答之前读一遍。
powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
0wx-gtk.pl 是一个小型 GTK 窗口,带有上传、粘贴、缩短网址和浏览文件的标签页 — 可以按列表或按缩略图图库查看,并按图库筛选。它是这里唯一需要额外安装东西的客户端 — Perl 的 GTK3 绑定 — 这一点值得和上面的 Windows 窗口版对比,那一个什么都不用装。它用到的其他一切都随 Perl 一起发布。密钥只保存在内存中:关闭窗口就会忘记,设置 OWX_KEY 则会在启动时自动填入。无论它显示什么,服务器的原始响应都在 “Server reply” 下一键可见。
apt install libgtk3-perl # or: dnf install perl-Gtk3 wget https://0wx.cat/clients/0wx-gtk.pl chmod +x 0wx-gtk.pl OWX_KEY=YOUR_KEY ./0wx-gtk.pl
0wx-android.apk 在手机上做其他客户端能做的事:上传、粘贴、缩短网址、翻译,以及按列表或图库浏览您的文件。从任何其他应用把文件分享给它就会上传,分享文本则会存为粘贴内容。它不在任何应用商店上架,所以您的设备会询问是否允许安装 — 这个问题在一般情况下都值得认真对待,也正因如此完整源代码也放在这里:请在 Android Studio 中打开并自行构建,而不是信任这个文件。构建需要 JDK 21;里面的 BUILDING.md 说明了原因。
https://0wx.cat/clients/0wx-android.apk # install it https://0wx.cat/clients/0wx-android.zip # build it yourself
这里有意不提供远程获取操作。它会让服务器去获取调用者指定的任意 URL,这是一个请求伪造的攻击面,而脚本能比表单更猛烈地利用它。请自行上传文件。