~0wx.org~ :: Хостинг файлів та інші корисні інструменти


Вивантаження TinyURL HugeURL Pastebin Про сервіс Поскаржитися Вхід
Українська ▼
English English Deutsch Deutsch Plattdüütsch Plattdüütsch Lëtzebuergesch Lëtzebuergesch Nederlands Nederlands Dansk Dansk Svenska Svenska Bokmål Bokmål Nynorsk Nynorsk Íslenska Íslenska Føroyskt Føroyskt Español Español Català Català Galego Galego Português Português Français Français Italiano Italiano Latina Latina Română Română Rumantsch Rumantsch Gaeilge Gaeilge Suomi Suomi Magyar Magyar Euskara Euskara Esperanto Esperanto 日本語 日本語 简体中文 简体中文 繁體中文(台灣) 繁體中文(台灣) 繁體中文(香港) 繁體中文(香港) 粵語 粵語 한국어 한국어 Tiếng Việt Tiếng Việt ไทย ไทย Bahasa Indonesia Bahasa Indonesia Bahasa Melayu Bahasa Melayu हिन्दी हिन्दी Ελληνικά Ελληνικά Polski Polski Čeština Čeština Русский Русский Türkçe Türkçe العربية العربية עברית עברית Kiswahili Kiswahili ʻŌlelo Hawaiʻi ʻŌlelo Hawaiʻi tlhIngan Hol tlhIngan Hol Quenya Quenya

Для всіх функцій на 0wx.org є API. Його можна використовувати у сценаріях або з консолі.

Усе, що роблять форми на цьому сайті, для скриптів. Кожна відповідь — JSON, включно з помилками, тож вам ніколи не доведеться гадати, результат це чи пояснення.

Виконання запиту

POST на кінцеву точку з параметрами форми або з тілом JSON. Обидва варіанти рівнозначні; обирайте той, що зручніший вашим інструментам. Параметр action обирає дію. Для всього, що набрала людина — тексту, URL, перекладу — використовуйте --data-urlencode, бо -d надсилає значення як є, і воно обріжеться на першому &. Звичайного -d досить для фіксованих значень на кшталт самого action. У wget узагалі немає --data-urlencode, тож із wget або відсотково кодуйте такі значення самі, або надсилайте тіло JSON, якому кодування не потрібне.

curl -X POST https://0wx.org/api.cgi \
     -d action=paste --data-urlencode 'content=hello & world'

curl -X POST https://0wx.org/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.org/api.cgi
Значення, що містять &

У тілі форми & розділяє параметри, а curl -d не кодує того, що ви йому даєте. Тому URL із рядком запиту обрізається на своєму першому &, а решта надходить окремими параметрами. Використовуйте --data-urlencode або надсилайте JSON. Зайві параметри відхиляються, а не ігноруються, тож це гучно падає, а не зберігає половину посилання.

# wrong -- the value is cut at the &
curl -X POST https://0wx.org/api.cgi \
     -d action=tinyurl -d 'url=https://example.com/?a=1&b=2'

# right
curl -X POST https://0wx.org/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.org/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.org/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.org/api.cgi
Автентифікація

Необов'язково. Без ключа запит анонімний і поводиться точно як анонімний відвідувач — результат у будь-якому разі публічний, різниця лише в тому, чи потрапить він до вашого списку файлів. Створіть ключ на сторінці облікового запису й надсилайте його як bearer-токен; передавання параметром apikey теж працює, але ключ у рядку запиту осідає в журналах сервера та історії браузера.

curl -X POST https://0wx.org/api.cgi \
     -H 'Authorization: Bearer YOUR_KEY' \
     -d action=whoami

wget -qO- --header='Authorization: Bearer YOUR_KEY' \
     --post-data 'action=whoami' https://0wx.org/api.cgi
Дії
actionПараметриОпис
whoami—Підтверджує, що ключ працює, і повідомляє поточні ліміти. Нічого не коштує; викликайте його першим.
ip—Повідомляє вашу адресу, її PTR, країну, регіон і місто, куди вона геолокується, координати та надісланий вами user agent. Ключ не потрібен, відповідь однакова з ним і без нього. Навмисно вужчий за веб-сторінку: без WHOIS, без зони DNS і без запитів до чорних списків, тож виклик коштує серверу лише одного читання з локальної бази.
uploadfile (повторюваний), resize, lifetime, gallery або g *Вивантажує один або кілька файлів. Має бути multipart/form-data. Зазначення галереї кладе їх просто в неї й повертає її id.
tinyurlurl, lifetimeСкорочує URL.
hugeurlurl, lifetimeПодовжує URL, абсурдно, навмисно.
pastecontent, lifetimeЗберігає блок тексту й повертає посилання на нього.
translatecontent, to, fromПерекладає текст. to і from — коди з дії langs — зауважте, що це не завжди коди країн: данська — da, а не dk. from можна пропустити або вказати як auto, тоді бекенд визначить мову сам; явне зазначення дає кращий результат на короткому тексті.
langsПерелічує мови, які приймає translate, як supported_langs: один об'єкт на мову, код і назва, у тому порядку, в якому їх пропонує сайт. Ключ API не потрібен.
dyndnskey, 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.org/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.org/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
     -d action=delete -d 'share=Ab3xK9pQ,Zz7yT2mN'

curl -X POST https://0wx.org/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.org/api.cgi
Галереї

Де б не зазначалася галерея — в upload чи в move — це робиться тими самими двома способами: g для наявного id або gallery для назви, що створюється, якщо вона нова. Якщо передано обидва, перемагає g. Відповідь несе id галереї. Зауважте, що видалення галереї видаляє лише галерею, залишаючи її файли в основному списку — на відміну від веб-форми, яка після запитання видаляє і їх. Передайте withfiles=true, щоб видалити й файли: скрипт, що впорядковує свої групи, не має випадково втрачати вивантаження.

curl -X POST https://0wx.org/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
     -F action=upload -F file=@photo.jpg --form-string 'gallery=Holiday 2026'

curl -X POST https://0wx.org/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.org/api.cgi
Вивантаження файлів

Вивантаження не можуть використовувати тіло JSON, бо файл має передаватися як multipart. Повторіть частину file, щоб надіслати кілька за раз. Про кожен файл повідомляється окремо: відповідь несе список files прийнятих і список rejected відхилених, тож частковий успіх — усе одно успіх.

curl -X POST https://0wx.org/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.org/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.org/i/Ab3xK9pQ",
   "file_tags":{"artist":"Kraftwerk","title":"Autobahn","album":"Autobahn"}},
  {"share":"Zz7yT2mN","name":"photo.jpg","mime":"image/jpeg",
   "bytes":204800,"url":"https://0wx.org/i/Zz7yT2mN"}
]}
Коди помилок
errorHTTPОпис
unknown_action400Такої дії немає.
bad_json400Тіло не було коректним JSON, або поле містило вкладену структуру.
unexpected_parameter400Надійшов параметр, якого ця дія не приймає — зазвичай незакодований & у значенні. Повідомлення називає параметри.
bad_key401Ключ не розпізнано. Хибний ключ відхиляється, а не мовчки вважається анонімним.
bad_url400URL сформовано неправильно, або він використовує схему, відмінну від http(s), ftp чи gopher.
bad_lifetime400Термін зберігання не був числом або числом із m, h чи d після нього.
no_content400Нічого не надіслано для збереження.
url_too_long413URL довший за ліміт.
paste_too_long413Текст більший за ліміт для текстів. Ліміти вимірюються в байтах UTF-8, тому нелатинський текст рахується більшим, ніж підказує кількість символів.
too_many_files413Файлів більше, ніж приймає один виклик.
no_usable_files415Усі файли відхилено. Причини — у списку rejected.
backend_unavailable502Бекенд перекладу не відповів.
internal500Щось несподівано зламалося. Це записано до журналу.
Ліміти

Читайте поточні значення викликом whoami, а не зашивайте їх у код — їх задає оператор сервера, і вони можуть змінюватися. Розміри — у байтах UTF-8.

Клієнт для shell

0wx.sh обгортає все перелічене вище. Це чистий POSIX shell, йому потрібен лише curl, і він досить короткий, щоб прочитати його перед запуском — що й варто робити зі скриптом, який зберігатиме ваш ключ API. Покладіть ключ у OWX_KEY замість передавання --key, і він не потрапить до історії вашої оболонки.

wget https://0wx.org/clients/0wx.sh
chmod +x 0wx.sh
export OWX_KEY=YOUR_KEY
./0wx.sh help
./0wx.sh paste --content 'hello & world'
Клієнт на Python

0wx.py робить те саме, що й shell-клієнт, але розбирає відповідь і друкує, що означають поля, замість того щоб видавати сирий JSON — додайте --json, коли потрібна сира форма. Лише стандартна бібліотека: жодного requests, встановлювати нічого. Якщо пишете свій клієнт, його функції send() і report() — те, що варто прочитати: разом вони показують, як зібрати запит, як витягти повідомлення з невдалого й що містять відповіді.

wget https://0wx.org/clients/0wx.py
chmod +x 0wx.py
export OWX_KEY=YOUR_KEY
./0wx.py listfiles
./0wx.py listfiles --json | jq '.files[].url'
Клієнт на Perl

0wx.pl робить те саме, що й клієнт на Python, і друкує те саме. Лише базові модулі — HTTP::Tiny і JSON::PP постачаються з Perl починаючи з 5.14, тож встановлювати нічого. Варто читати поруч із клієнтом на Python, якщо пишете свій: дві мови по-різному падають на зламаному запиті, і обидва скрипти кажуть де.

wget https://0wx.org/clients/0wx.pl
chmod +x 0wx.pl
export OWX_KEY=YOUR_KEY
./0wx.pl listfiles
Клієнт на PowerShell

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.org/clients/0wx.html
Вікно у Windows

0wx-gui.ps1 — той самий набір вкладок, що й у настільного клієнта, намальований засобами WinForms — тобто встановлювати не треба взагалі нічого, адже це вже частина Windows. Покладіть його в одну теку з 0wx.ps1: вікно позичає обробку запитів із того файлу, а не носить другу копію, тож потрібні обидва. Windows запитає, перш ніж запустити скрипт, який писала не вона, і це слушне питання; обидва файли досить короткі, щоб прочитати їх перед відповіддю.

powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
Вікно в Linux із GTK

0wx-gtk.pl — невелике вікно GTK із вкладками для вивантаження, вставлення, скорочення та перегляду ваших файлів — списком або галереєю мініатюр, із фільтром за галереєю. Це єдиний клієнт тут, якому треба щось установити — прив'язки GTK3 для Perl — що варто пам'ятати поруч із вікном для Windows вище, якому не потрібно взагалі нічого. Усе інше, що він використовує, постачається з Perl. Ключ тримається лише в пам'яті: закриття вікна його забуває, а встановлення OWX_KEY заповнює його під час запуску. Хай що він показує, сира відповідь сервера за один клік під “Server reply”.

apt install libgtk3-perl        # or: dnf install perl-Gtk3
wget https://0wx.org/clients/0wx-gtk.pl
chmod +x 0wx-gtk.pl
OWX_KEY=YOUR_KEY ./0wx-gtk.pl
Застосунок для Android

0wx-android.apk робить те саме, що й інші клієнти, з телефона: вивантаження, вставлення, скорочення, переклад і перегляд ваших файлів списком або галереєю. Поділитися в нього файлом з будь-якого іншого застосунку — вивантажити його, поділитися текстом — зберегти його як текст. Його немає в жодній крамниці застосунків, тому пристрій запитає, чи дозволити встановлення — питання, до якого взагалі варто ставитися серйозно, і причина, з якої повний вихідний код теж тут: відкрийте його в Android Studio та зберіть самі, а не довіряйте файлу. Для збирання потрібен JDK 21; BUILDING.md усередині пояснює чому.

https://0wx.org/clients/0wx-android.apk        # install it
https://0wx.org/clients/0wx-android.zip        # build it yourself
Примітки

Дії віддаленого завантаження навмисно немає. Вона змусила б сервер отримувати URL на вибір того, хто викликає, а це поверхня для підробки запитів, і скрипт здатен експлуатувати її значно жорсткіше за форму. Вивантажте файл самі.


(p) 2018 0wx.org -/- Powered by Linux and GNU. Live free or die! (root@0wx.org)