▼
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
本站各表單能做的一切,都可以用指令碼完成。所有回應都是 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,這是一個請求偽造的攻擊面,而指令碼能比表單更兇猛地利用它。請自行上傳檔案。