▼
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
हिन्दी
Ελληνικά
Čeština
Українська
Русский
Türkçe
العربية
עברית
Kiswahili
ʻŌlelo Hawaiʻi
tlhIngan Hol
Quenya
Wszystko, co robią formularze na tej stronie, dla skryptów. Każda odpowiedź to JSON, łącznie z błędami, więc nigdy nie musisz zgadywać, czy treść to wynik, czy wyjaśnienie.
Wyślij POST na punkt końcowy z parametrami formularza albo z treścią JSON. Oba sposoby są równoważne; wybierz ten, który twoje narzędzia ułatwiają. Parametr action wybiera, co ma się stać. Dla wszystkiego, co wpisał człowiek — tekstu wklejki, URL-a, tłumaczenia — używaj --data-urlencode, bo -d wysyła wartość surową i zostanie ona ucięta na pierwszym &. Zwykłe -d wystarczy dla stałych wartości jak samo action. wget w ogóle nie ma --data-urlencode, więc z wgetem albo zakoduj takie wartości procentowo samodzielnie, albo wyślij treść JSON, która nie wymaga kodowania.
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
W treści formularza & rozdziela parametry, a curl -d nie koduje tego, co mu podasz. URL z ciągiem zapytania zostaje więc ucięty na pierwszym &, a reszta dociera jako osobne parametry. Użyj --data-urlencode albo wyślij JSON. Zabłąkane parametry są odrzucane, a nie ignorowane, więc kończy się to głośnym błędem zamiast zapisania połowy odnośnika.
# 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
Opcjonalne. Bez klucza żądanie jest anonimowe i zachowuje się dokładnie jak anonimowy gość — wynik i tak jest publiczny, jedyna różnica to czy trafi na twoją listę plików. Wygeneruj klucz na stronie konta i wysyłaj go jako token bearer; przekazanie parametrem apikey też działa, ale klucz w ciągu zapytania ląduje w logach serwera i historii przeglądarki.
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 | Parametry | Opis |
|---|---|---|
whoami | — | Potwierdza, że klucz działa, i podaje bieżące limity. Nic nie kosztuje; wywołaj ją jako pierwszą. |
ip | — | Podaje twój adres, jego PTR, kraj, region i miasto, do których jest geolokalizowany, współrzędne oraz wysłany user agent. Nie wymaga klucza i odpowiada tak samo z nim i bez niego. Celowo węższa niż strona: bez WHOIS, bez strefy DNS i bez zapytań do list blokujących, więc wywołanie kosztuje serwer tylko jeden odczyt z lokalnej bazy. |
upload | file (powtarzalne), resize, lifetime, gallery lub g * | Wysyła jeden lub więcej plików. Musi być multipart/form-data. Podanie galerii umieszcza je od razu w niej i zwraca jej id. |
tinyurl | url, lifetime | Skraca URL. |
hugeurl | url, lifetime | Wydłuża URL, absurdalnie, celowo. |
paste | content, lifetime | Zapisuje blok tekstu i zwraca odnośnik do niego. |
translate | content, to, from | Tłumaczy tekst. to i from to kody z akcji langs — uwaga, nie zawsze są to kody krajów: duński to da, nie dk. from można pominąć lub podać jako auto, co każe backendowi wykryć język; podanie go daje lepszy wynik przy krótkim tekście. |
langs | Wypisuje języki przyjmowane przez translate jako supported_langs: jeden obiekt na język, kod do nazwy, w kolejności, w jakiej oferuje je strona. Nie wymaga klucza API. | |
dyndns | key, ip, format | Aktualizuje dynamiczną nazwę DNS. Jedyna akcja, która nie wymaga klucza API: wywołuje ją router, który ma jedno pole na URL i nie może wysłać nagłówka. key to klucz aktualizacji danej nazwy pokazany na twoim koncie, nie klucz API. Pomiń ip, a użyty zostanie adres, z którego wywołujesz. Odpowiedź to faktyczne słowo dyndns2 — good, nochg, badauth, abuse lub dnserr — jako zwykły tekst, bo to parsują routery; dodaj format=json, by dostać zwykły JSON. |
listfiles * | page, g | Wypisuje twoje pliki ze wszystkim, co pokazuje panel Info, plus miniaturę i odnośnik bezpośredni. g ogranicza do jednej galerii, a none do plików bez galerii. |
listpastes * | page | Wypisuje twoje teksty, każdy z podglądem 200 znaków zamiast całej treści. |
listurls * | page | Wypisuje twoje krótkie i ogromne URL-e z adresem, na który każdy wskazuje. |
otl * | share | Tworzy odnośnik jednorazowy do jednego z twoich plików. Każde wywołanie bije nowy, więc danie tego samego pliku dwóm osobom daje dwa odnośniki. |
listotl * | page | Wypisuje twoje aktywne odnośniki jednorazowe, plik, na który każdy wskazuje, i czy ten plik od tego czasu wygasł. |
listgalleries * | — | Wypisuje twoje galerie z ich id, nazwami, liczbą plików i stanem publikacji. |
gallery * | g, publish | Podaje stan publikacji galerii i zmienia go, gdy podano publish. |
move * | share (powtarzalne), gallery lub g | Przenosi pliki do galerii po nazwie (tworzonej, jeśli nowa) lub po id. Gdy pominiesz oba, wracają na listę główną. |
delete * | share (powtarzalne), g, otl, withfiles | Usuwa pliki, teksty, krótkie URL-e, galerie, odnośniki jednorazowe lub dowolną ich mieszankę. Share dopasowywane jest najpierw do twoich plików, potem do tekstów i odnośników, więc wywołujący nie musi sortować ich po typie. Odnośniki jednorazowe idą osobno w otl: usunięcia odnośnika nie wolno pomylić z usunięciem pliku, na który wskazuje. |
* Te akcje wymagają klucza API. Czytają lub zmieniają dane jednego konta, więc nie mają postaci anonimowej.
share i g przyjmują powtórzone pole, tablicę JSON lub listę rozdzieloną przecinkami — co twoje narzędzia ułatwiają najbardziej. Duplikaty są ignorowane.
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
Gdziekolwiek podaje się galerię — w upload czy w move — robi się to na te same dwa sposoby: g dla istniejącego id lub gallery dla nazwy, tworzonej, jeśli jest nowa. Gdy wyślesz oba, wygrywa g. Odpowiedź niesie id galerii. Uwaga: usunięcie galerii usuwa tylko galerię, a jej pliki zostawia na liście głównej — inaczej niż formularz na stronie, który po zapytaniu usuwa je również. Przekaż withfiles=true, by usunąć i je: skrypt porządkujący swoje grupy nie powinien przez przypadek stracić wysłanych plików.
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
Wysyłanie plików nie może używać treści JSON, bo plik musi być wysłany jako multipart. Powtórz część file, by wysłać kilka naraz. Każdy plik jest raportowany osobno: odpowiedź niesie listę files z przyjętymi i listę rejected z odrzuconymi, więc częściowy sukces to nadal sukces.
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
Nie ma tego w wersji dla wget. wget nie potrafi zbudować treści multipart/form-data — nie ma odpowiednika curlowego -F — a wysyłanie plików musi być multipart. Użyj curl albo złóż treść i boundary samodzielnie i wyślij przez --post-file.
Opcjonalne w każdej akcji, która coś zapisuje. Przyjmuje same sekundy albo liczbę z m, h lub d na końcu — te same formy, co formularze na stronie. Pomiń albo podaj 0, by zachować element bezterminowo.
Każda odpowiedź to obiekt JSON z polem ok. Przy powodzeniu niesie wynik; przy niepowodzeniu stabilny kod error i czytelny message. Rozgałęziaj po kodzie, komunikat loguj.
{"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."}
Gdy plik je niesie, listfiles dodaje do jego wpisu file_tags: wykonawcę, tytuł i album, odczytane z ID3, komentarzy Vorbis lub atomów MP4 przy wysyłaniu pliku. Gdy nie ma nic do zgłoszenia, co dotyczy większości plików, klucza brakuje, zamiast być null, więc przed odczytem sprawdź jego obecność. Brakować mogą też pojedyncze pola — plik może mieć tytuł i nie mieć albumu. Nic więcej z metadanych pliku nie jest ujawniane: zakup z iTunes zapisuje imię i Apple ID kupującego, a te celowo nigdy nie są odczytywane.
{"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 | Opis |
|---|---|---|
unknown_action | 400 | Nie ma takiej akcji. |
bad_json | 400 | Treść nie była poprawnym JSON-em lub pole zawierało zagnieżdżoną strukturę. |
unexpected_parameter | 400 | Przyszedł parametr, którego ta akcja nie przyjmuje — zwykle niezakodowany & w wartości. Komunikat wymienia parametry. |
bad_key | 401 | Klucz nie został rozpoznany. Błędny klucz jest odrzucany, zamiast być po cichu traktowanym jako anonimowy. |
bad_url | 400 | URL jest zniekształcony lub używa schematu innego niż http(s), ftp lub gopher. |
bad_lifetime | 400 | Czas życia nie był liczbą ani liczbą z m, h lub d na końcu. |
no_content | 400 | Nie wysłano nic do zapisania. |
url_too_long | 413 | URL jest dłuższy niż limit. |
paste_too_long | 413 | Tekst przekracza limit wklejek. Limity mierzy się w bajtach UTF-8, więc tekst niełaciński liczy się bardziej, niż sugeruje liczba znaków. |
too_many_files | 413 | Więcej plików, niż przyjmuje jedno wywołanie. |
no_usable_files | 415 | Wszystkie pliki odrzucono. Powód znajdziesz na liście rejected. |
backend_unavailable | 502 | Backend tłumaczeń nie odpowiedział. |
internal | 500 | Coś niespodziewanie zawiodło. Zostało to zarejestrowane. |
Bieżące wartości odczytuj wywołaniem whoami, zamiast wpisywać je na sztywno — ustala je operator serwera i mogą się zmienić. Rozmiary to bajty UTF-8.
0wx.sh opakowuje wszystko powyżej. To czysty shell POSIX, nie potrzebuje niczego poza curl i jest na tyle krótki, by przeczytać go przed uruchomieniem — co jest właściwym podejściem do skryptu, który będzie trzymał twój klucz API. Umieść klucz w OWX_KEY zamiast przekazywać --key, a nie trafi do historii powłoki.
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 robi to samo, co klient powłoki, ale parsuje odpowiedź i wypisuje, co znaczą pola, zamiast wręczać surowy JSON — dodaj --json, gdy chcesz surową postać. Tylko biblioteka standardowa: bez requests, nic do instalowania. Jeśli piszesz własnego klienta, warto przeczytać jego funkcje send() i report(): razem pokazują, jak zbudować żądanie, jak wyciągnąć komunikat z nieudanego i co zawierają odpowiedzi.
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 robi to samo, co klient w Pythonie, i wypisuje to samo. Tylko moduły podstawowe — HTTP::Tiny i JSON::PP są dostarczane z Perlem od 5.14, więc nie ma nic do instalowania. Warto czytać obok klienta w Pythonie, jeśli piszesz własnego: oba języki zawodzą inaczej przy zepsutym żądaniu, a oba skrypty mówią, gdzie.
wget https://0wx.cat/clients/0wx.pl chmod +x 0wx.pl export OWX_KEY=YOUR_KEY ./0wx.pl listfiles
0wx.ps1 to odpowiednik klienta w Pythonie dla Windows: te same polecenia, to samo wyjście, i parsuje odpowiedź, zamiast wręczać surowy JSON — do tego dodaj --json. Jest napisany dla Windows PowerShell, który już jest na maszynie, więc nie ma nic do instalowania, i działa bez zmian na PowerShellu 7. W oknie, z którego go uruchamiasz, może być potrzebne Set-ExecutionPolicy -Scope Process Bypass; to Windows pyta, czy naprawdę chcesz uruchomić pobrany skrypt — słuszne pytanie, a plik jest na tyle krótki, by najpierw go przeczytać.
$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 to ten sam zestaw kart, co klient desktopowy, w trzech plikach — strona, arkusz stylów i skrypt — bez instalacji, bez frameworka i bez ładowania czegokolwiek skądkolwiek poza tą stroną. Trzy zamiast jednego, bo Content-Security-Policy strony zabrania skryptów i stylów inline, co warto zachować. Można na niego upuszczać pliki. Trzeba go otworzyć stąd, a nie zapisać i otworzyć z dysku: API nie wysyła nagłówków cross-origin, więc lokalnej kopii przeglądarka odrzuciłaby każde żądanie, zanim by wyszło. Klucz trzymany jest w pamięci, chyba że zaznaczysz pole, by go zapamiętać.
https://0wx.cat/clients/0wx.html
0wx-gui.ps1 to ten sam zestaw kart, co klient desktopowy, rysowany przez WinForms — czyli nic do instalowania, bo to już część Windows. Umieść go w tym samym folderze co 0wx.ps1: okno pożycza obsługę żądań z tamtego pliku, zamiast nosić drugą kopię, więc potrzebne są oba. Windows zapyta przed uruchomieniem skryptu, którego sam nie napisał, co jest słusznym pytaniem; oba pliki są na tyle krótkie, by przeczytać je przed odpowiedzią.
powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
0wx-gtk.pl to małe okno GTK z kartami do wysyłania, wklejania, skracania i przeglądania twoich plików — jako listy lub galerii miniatur, filtrowanej po galerii. To jedyny klient tutaj, który wymaga czegoś zainstalowanego — wiązań GTK3 dla Perla — co warto wiedzieć obok okna dla Windows powyżej, które nie wymaga niczego. Cała reszta, z której korzysta, jest dostarczana z Perlem. Klucz trzymany jest tylko w pamięci: zamknięcie okna go zapomina, a ustawienie OWX_KEY wypełnia go przy starcie. Cokolwiek pokazuje, surowa odpowiedź serwera jest o jedno kliknięcie pod “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 robi to, co pozostałe klienty, z telefonu: wysyłanie, wklejanie, skracanie, tłumaczenie i przeglądanie twoich plików jako listy lub galerii. Udostępnienie mu pliku z dowolnej innej aplikacji wysyła go, a udostępnienie tekstu zapisuje go jako tekst. Nie ma go w żadnym sklepie z aplikacjami, więc urządzenie zapyta, czy zezwolić na instalację — pytanie, które ogólnie warto traktować poważnie, i powód, dla którego całe źródła są również tutaj: otwórz je w Android Studio i zbuduj samodzielnie, zamiast ufać plikowi. Budowanie wymaga JDK 21; BUILDING.md w środku wyjaśnia dlaczego.
https://0wx.cat/clients/0wx-android.apk # install it https://0wx.cat/clients/0wx-android.zip # build it yourself
Celowo nie ma akcji zdalnego pobierania. Kazałaby serwerowi pobrać URL wybrany przez wywołującego, co jest powierzchnią ataku typu request forgery, a skrypt potrafi to napędzać znacznie mocniej niż formularz. Zamiast tego wyślij plik samodzielnie.