~0wx.es~ :: Hosting plików i inne przydatne narzędzia


Wyślij TinyURL HugeURL Pastebin O serwisie Zgłoś Zaloguj się
Polski ▼
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 हिन्दी हिन्दी Ελληνικά Ελληνικά Čeština Čeština Українська Українська Русский Русский Türkçe Türkçe العربية العربية עברית עברית Kiswahili Kiswahili ʻŌlelo Hawaiʻi ʻŌlelo Hawaiʻi tlhIngan Hol tlhIngan Hol Quenya Quenya

Dla wszystkich funkcji serwisu 0wx.es dostępne jest API. Można go używać w skryptach lub z konsoli.

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.

Wysyłanie żądania

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.es/api.cgi \
     -d action=paste --data-urlencode 'content=hello & world'

curl -X POST https://0wx.es/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.es/api.cgi
Wartości zawierające &

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.es/api.cgi \
     -d action=tinyurl -d 'url=https://example.com/?a=1&b=2'

# right
curl -X POST https://0wx.es/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.es/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.es/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.es/api.cgi
Uwierzytelnianie

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.es/api.cgi \
     -H 'Authorization: Bearer YOUR_KEY' \
     -d action=whoami

wget -qO- --header='Authorization: Bearer YOUR_KEY' \
     --post-data 'action=whoami' https://0wx.es/api.cgi
Akcje
actionParametryOpis
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.
uploadfile (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.
tinyurlurl, lifetimeSkraca URL.
hugeurlurl, lifetimeWydłuża URL, absurdalnie, celowo.
pastecontent, lifetimeZapisuje blok tekstu i zwraca odnośnik do niego.
translatecontent, to, fromTł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.
langsWypisuje 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.
dyndnskey, ip, formatAktualizuje 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, gWypisuje 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 *pageWypisuje twoje teksty, każdy z podglądem 200 znaków zamiast całej treści.
listurls *pageWypisuje twoje krótkie i ogromne URL-e z adresem, na który każdy wskazuje.
otl *shareTworzy 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 *pageWypisuje 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, publishPodaje stan publikacji galerii i zmienia go, gdy podano publish.
move *share (powtarzalne), gallery lub gPrzenosi 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, withfilesUsuwa 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.

Kilka naraz

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.es/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.es/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
     -d action=delete -d 'share=Ab3xK9pQ,Zz7yT2mN'

curl -X POST https://0wx.es/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.es/api.cgi
Galerie

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.es/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
     -F action=upload -F file=@photo.jpg --form-string 'gallery=Holiday 2026'

curl -X POST https://0wx.es/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.es/api.cgi
Wysyłanie plików

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.es/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.

Czas życia

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.

Odpowiedzi

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.es/p/Ab3xK9pQ","bytes":11}

{"ok":false,"error":"url_too_long",
 "message":"URL exceeds the maximum length."}
Tagi audio

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.es/i/Ab3xK9pQ",
   "file_tags":{"artist":"Kraftwerk","title":"Autobahn","album":"Autobahn"}},
  {"share":"Zz7yT2mN","name":"photo.jpg","mime":"image/jpeg",
   "bytes":204800,"url":"https://0wx.es/i/Zz7yT2mN"}
]}
Kody błędów
errorHTTPOpis
unknown_action400Nie ma takiej akcji.
bad_json400Treść nie była poprawnym JSON-em lub pole zawierało zagnieżdżoną strukturę.
unexpected_parameter400Przyszedł parametr, którego ta akcja nie przyjmuje — zwykle niezakodowany & w wartości. Komunikat wymienia parametry.
bad_key401Klucz nie został rozpoznany. Błędny klucz jest odrzucany, zamiast być po cichu traktowanym jako anonimowy.
bad_url400URL jest zniekształcony lub używa schematu innego niż http(s), ftp lub gopher.
bad_lifetime400Czas życia nie był liczbą ani liczbą z m, h lub d na końcu.
no_content400Nie wysłano nic do zapisania.
url_too_long413URL jest dłuższy niż limit.
paste_too_long413Tekst 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_files413Więcej plików, niż przyjmuje jedno wywołanie.
no_usable_files415Wszystkie pliki odrzucono. Powód znajdziesz na liście rejected.
backend_unavailable502Backend tłumaczeń nie odpowiedział.
internal500Coś niespodziewanie zawiodło. Zostało to zarejestrowane.
Limity

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.

Klient powłoki

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.es/clients/0wx.sh
chmod +x 0wx.sh
export OWX_KEY=YOUR_KEY
./0wx.sh help
./0wx.sh paste --content 'hello & world'
Klient w Pythonie

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.es/clients/0wx.py
chmod +x 0wx.py
export OWX_KEY=YOUR_KEY
./0wx.py listfiles
./0wx.py listfiles --json | jq '.files[].url'
Klient w Perlu

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.es/clients/0wx.pl
chmod +x 0wx.pl
export OWX_KEY=YOUR_KEY
./0wx.pl listfiles
Klient w PowerShellu

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'
Okno w twojej przeglądarce

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.es/clients/0wx.html
Okno na Windows

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
Okno na Linuksie z GTK

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.es/clients/0wx-gtk.pl
chmod +x 0wx-gtk.pl
OWX_KEY=YOUR_KEY ./0wx-gtk.pl
Aplikacja na Androida

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.es/clients/0wx-android.apk        # install it
https://0wx.es/clients/0wx-android.zip        # build it yourself
Uwagi

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.


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