▼
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 надсилає значення як є, і воно обріжеться на першому &. Звичайного -d досить для фіксованих значень на кшталт самого action. У 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 | Перелічує мови, які приймає translate, як supported_langs: один об'єкт на мову, код і назва, у тому порядку, в якому їх пропонує сайт. Ключ 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 | Перелічує ваші короткі та величезні URL з адресою, на яку вказує кожен. |
otl * | share | Створює одноразове посилання на один із ваших файлів. Кожен виклик карбує нове, тож віддати один файл двом людям — отримати два посилання. |
listotl * | page | Перелічує ваші активні одноразові посилання, файл, на який вказує кожне, і чи не сплив відтоді термін цього файлу. |
listgalleries * | — | Перелічує ваші галереї з їхніми id, назвами, кількістю файлів і станом публікації. |
gallery * | g, publish | Повідомляє стан публікації галереї та змінює його, якщо передано publish. |
move * | share (повторюваний), gallery або g | Переміщує файли в галерею за назвою (створюється, якщо нова) або за id. Якщо пропущено обидва, повертає їх до основного списку. |
delete * | share (повторюваний), g, otl, withfiles | Видаляє файли, тексти, короткі URL, галереї, одноразові посилання або будь-яку їх суміш. Share спершу зіставляється з вашими файлами, потім із текстами й посиланнями, тож тому, хто викликає, не треба сортувати їх за типом. Одноразові посилання йдуть окремо, в 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 — у нього немає аналога -F із curl — а вивантаження мають бути multipart. Використовуйте curl або зберіть тіло й boundary самі та надішліть через --post-file.
Необов'язково для будь-якої дії, що щось зберігає. Приймає просто секунди або число з m, h чи d після нього — ті самі форми, що й веб-форми. Пропустіть або передайте 0, щоб зберігати елемент безстроково.
Кожна відповідь — об'єкт JSON із полем ok. У разі успіху він несе результат; у разі помилки — стабільний код 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 під час вивантаження файлу. Коли повідомляти нічого — а це більшість файлів — ключ відсутній, а не дорівнює 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, і він не потрапить до історії вашої оболонки.
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, тож встановлювати нічого. Варто читати поруч із клієнтом на 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 — той самий набір вкладок, що й у настільного клієнта, у вигляді трьох файлів — сторінки, таблиці стилів і скрипту — без встановлення, без фреймворку й без завантаження будь-чого звідкись, крім цього сайту. Три замість одного тому, що Content-Security-Policy сайту забороняє вбудовані скрипти й стилі, і це варто зберегти. На нього можна перетягувати файли. Відкривати його треба звідси, а не зберігати й відкривати з диска: API не надсилає заголовків cross-origin, тож у локальної копії браузер відхилив би кожен запит ще до відправлення. Ключ тримається в пам'яті, якщо ви не поставите позначку «запам'ятати».
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 із вкладками для вивантаження, вставлення, скорочення та перегляду ваших файлів — списком або галереєю мініатюр, із фільтром за галереєю. Це єдиний клієнт тут, якому треба щось установити — прив'язки GTK3 для Perl — що варто пам'ятати поруч із вікном для 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 на вибір того, хто викликає, а це поверхня для підробки запитів, і скрипт здатен експлуатувати її значно жорсткіше за форму. Вивантажте файл самі.