▼
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
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
Tot ce fac formularele de pe acest site, pentru scripturi. Fiecare răspuns este JSON, inclusiv erorile, așa că nu trebuie niciodată să ghicești dacă un corp este un rezultat sau o explicație.
Trimite POST către endpoint fie cu parametri de formular, fie cu un corp JSON. Sunt echivalente; alege ce îți vine mai ușor cu uneltele tale. Parametrul action alege ce se face. Folosește --data-urlencode pentru orice a tastat o persoană — textul unui paste, un URL, o traducere — pentru că -d trimite valoarea brută și va fi tăiată la primul &. Un -d simplu e suficient pentru valori fixe precum action însuși. wget nu are deloc --data-urlencode, așa că, cu wget, fie codifici tu procentual astfel de valori, fie trimiți un corp JSON, care nu are nevoie de codificare.
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
Într-un corp de formular & separă parametrii, iar curl -d nu codifică ce îi dai. Un URL cu șir de interogare este așadar tăiat la primul său &, iar restul ajunge ca parametri separați. Folosește --data-urlencode sau trimite JSON. Parametrii rătăciți sunt refuzați, nu ignorați, așa că asta eșuează vizibil în loc să stocheze jumătate de link.
# 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
Opțional. Fără cheie, o cerere este anonimă și se comportă exact ca un vizitator anonim — rezultatul este oricum public, singura diferență este dacă ajunge în lista ta de fișiere. Generează o cheie în pagina contului tău și trimite-o ca token bearer; transmiterea ei ca parametru apikey funcționează și ea, dar o cheie în șirul de interogare ajunge în jurnalele serverului și în istoricul browserului.
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
| action | Parametri | Descriere |
|---|---|---|
whoami | — | Confirmă că o cheie funcționează și raportează limitele curente. Nu costă nimic; apeleaz-o prima. |
ip | — | Raportează adresa ta, PTR-ul ei, țara, regiunea și orașul în care este geolocalizată, coordonatele și user agent-ul pe care l-ai trimis. Nu are nevoie de cheie și răspunde la fel cu sau fără. Intenționat mai restrâns decât pagina web: fără WHOIS, fără zonă DNS și fără căutări în liste de blocare, așa că apelarea lui nu costă serverul decât o citire locală din baza de date. |
upload | file (repetabil), resize, lifetime, gallery sau g * | Încarcă unul sau mai multe fișiere. Trebuie să fie multipart/form-data. Numirea unei galerii le pune direct în ea și întoarce id-ul ei. |
tinyurl | url, lifetime | Scurtează un URL. |
hugeurl | url, lifetime | Lungește un URL, absurd, dinadins. |
paste | content, lifetime | Stochează un bloc de text și întoarce un link către el. |
translate | content, to, from | Traduce text. to și from sunt coduri din acțiunea langs — reține că nu sunt întotdeauna coduri de țară: daneza este da, nu dk. from poate fi omis sau dat ca auto, ceea ce cere backend-ului să detecteze limba; indicarea lui dă un rezultat mai bun pe text scurt. |
langs | Listează limbile pe care le acceptă translate, ca supported_langs: un obiect pe limbă, cod către nume, în ordinea în care le oferă site-ul. Nu are nevoie de cheie API. | |
dyndns | key, ip, format | Actualizează un nume DNS dinamic. Singura acțiune care nu are nevoie de cheie API: este apelată de un router, care are un câmp pentru un URL și nicio cale de a trimite un antet. key este cheia de actualizare a fiecărui nume, afișată în contul tău, nu cheia ta API. Omite ip și se folosește adresa de la care apelezi. Răspunsul este cuvântul dyndns2 de facto — good, nochg, badauth, abuse sau dnserr — ca text simplu, pentru că asta interpretează routerele; adaugă format=json pentru JSON-ul obișnuit. |
listfiles * | page, g | Listează fișierele tale cu tot ce arată panoul Info, plus miniatura și linkul direct. g îl limitează la o galerie, sau none la fișierele din nicio galerie. |
listpastes * | page | Listează paste-urile tale, cu o previzualizare de 200 de caractere a fiecăruia în locul întregului corp. |
listurls * | page | Listează URL-urile tale scurte și uriașe, cu adresa spre care indică fiecare. |
otl * | share | Creează un link de unică folosință către unul dintre fișierele tale. Fiecare apel generează unul nou, așa că a da același fișier la două persoane produce două linkuri. |
listotl * | page | Listează linkurile tale de unică folosință active, fișierul spre care indică fiecare și dacă acel fișier a expirat între timp. |
listgalleries * | — | Listează galeriile tale cu id-urile, numele, numărul de fișiere și starea de publicare. |
gallery * | g, publish | Raportează starea de publicare a unei galerii și o schimbă când este dat publish. |
move * | share (repetabil), gallery sau g | Mută fișiere într-o galerie, după nume (creată dacă e nouă) sau după id. Dacă ambele lipsesc, le mută înapoi în lista principală. |
delete * | share (repetabil), g, otl, withfiles | Șterge fișiere, paste-uri, URL-uri scurte, galerii, linkuri de unică folosință sau orice combinație. Un share este potrivit mai întâi cu fișierele tale, apoi cu paste-urile și linkurile tale, așa că apelantul nu trebuie să le sorteze după tip. Linkurile de unică folosință merg separat, în otl: eliminarea unui link nu trebuie să poată fi confundată cu ștergerea fișierului spre care indică. |
* Aceste acțiuni au nevoie de o cheie API. Ele citesc sau modifică datele unui singur cont, așa că nu au formă anonimă.
share și g acceptă un câmp repetat, un array JSON sau o listă separată prin virgule — ce îți vine mai ușor cu uneltele tale. Duplicatele sunt ignorate.
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
Oriunde este numită o galerie — la upload sau la move — este dată în aceleași două feluri: g pentru un id existent, sau gallery pentru un nume, creat dacă este nou. Dacă sunt trimise ambele, câștigă g. Răspunsul conține id-ul galeriei. Reține că ștergerea unei galerii elimină doar galeria, lăsându-i fișierele în lista principală — spre deosebire de formularul web, care le șterge după ce întreabă. Transmite withfiles=true ca să le ștergi și pe ele: un script care își ordonează grupările nu ar trebui să piardă încărcările din greșeală.
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
Încărcările nu pot folosi corpul JSON, pentru că un fișier trebuie trimis ca multipart. Repetă partea file ca să trimiți mai multe deodată. Fiecare fișier este raportat separat: răspunsul conține o listă files cu cele acceptate și o listă rejected cu cele respinse, așa că un succes parțial este tot un succes.
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
Nu există formă wget pentru aceasta. wget nu poate construi un corp multipart/form-data — nu are echivalent pentru -F din curl — iar încărcările trebuie să fie multipart. Folosește curl, sau asamblează tu corpul și boundary-ul și trimite-le cu --post-file.
Opțional la fiecare acțiune care stochează ceva. Acceptă secunde simple, sau un număr urmat de m, h sau d — aceleași forme pe care le acceptă formularele web. Omite-l sau transmite 0 pentru a păstra elementul pe termen nelimitat.
Fiecare răspuns este un obiect JSON cu un câmp ok. La succes conține rezultatul; la eșec conține un cod error stabil și un message lizibil. Ramifică după cod, consemnează mesajul.
{"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."}
Acolo unde un fișier le are, listfiles adaugă file_tags la intrarea lui: artist, titlu și album, citite din ID3, comentarii Vorbis sau atomi MP4 la încărcarea fișierului. Cheia este absentă, nu null, când nu e nimic de raportat, ceea ce e cazul la majoritatea fișierelor, așa că verifică-i existența înainte s-o citești. Și câmpurile individuale pot lipsi — un fișier poate avea titlu și niciun album. Nimic altceva din metadatele fișierului nu este expus: o achiziție iTunes înregistrează numele și Apple ID-ul cumpărătorului, iar acestea nu sunt niciodată citite, intenționat.
{"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"}
]}
| error | HTTP | Descriere |
|---|---|---|
unknown_action | 400 | Nu există o astfel de acțiune. |
bad_json | 400 | Corpul nu era JSON valid, sau un câmp conținea o structură imbricată. |
unexpected_parameter | 400 | A sosit un parametru pe care această acțiune nu-l acceptă — de obicei un & necodificat într-o valoare. Mesajul numește parametrii. |
bad_key | 401 | Cheia nu a fost recunoscută. O cheie greșită este refuzată în loc să fie tratată în tăcere ca anonimă. |
bad_url | 400 | URL-ul este malformat sau folosește o altă schemă decât http(s), ftp sau gopher. |
bad_lifetime | 400 | Durata nu era un număr sau un număr urmat de m, h sau d. |
no_content | 400 | Nu a fost trimis nimic de stocat. |
url_too_long | 413 | URL-ul depășește limita de lungime. |
paste_too_long | 413 | Textul depășește limita pentru paste. Limitele se măsoară în octeți UTF-8, așa că textul nelatin contează mai mult decât sugerează numărul de caractere. |
too_many_files | 413 | Mai multe fișiere decât acceptă un singur apel. |
no_usable_files | 415 | Toate fișierele au fost respinse. Vezi lista rejected pentru motive. |
backend_unavailable | 502 | Backend-ul de traducere nu a răspuns. |
internal | 500 | Ceva a eșuat pe neașteptate. A fost consemnat. |
Apelează whoami ca să citești valorile curente în loc să le fixezi în cod — sunt stabilite de operatorul serverului și se pot schimba. Dimensiunile sunt în octeți UTF-8.
0wx.sh împachetează tot ce e mai sus. Este shell POSIX pur, nu are nevoie de nimic altceva decât curl și este destul de scurt ca să-l citești înainte să-l rulezi — ceea ce este lucrul corect de făcut cu un script care va ține cheia ta API. Pune cheia în OWX_KEY în loc să transmiți --key, și rămâne în afara istoricului shell-ului tău.
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'
0wx.py face același lucru ca clientul shell, dar analizează răspunsul și afișează ce înseamnă câmpurile în loc să-ți dea JSON brut — adaugă --json când vrei forma brută înapoi. Doar biblioteca standard: fără requests, nimic de instalat. Dacă îți scrii propriul client, funcțiile lui send() și report() sunt părțile care merită citite: împreună arată cum se construiește cererea, cum se extrage mesajul dintr-una eșuată și ce conțin răspunsurile.
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'
0wx.pl face același lucru ca cel Python și afișează aceeași ieșire. Doar module de bază — HTTP::Tiny și JSON::PP vin cu Perl de la 5.14, așa că nu e nimic de instalat. Merită citit alături de clientul Python dacă îl scrii pe al tău: cele două limbaje eșuează diferit la o cerere stricată, iar ambele scripturi spun unde.
wget https://0wx.es/clients/0wx.pl chmod +x 0wx.pl export OWX_KEY=YOUR_KEY ./0wx.pl listfiles
0wx.ps1 este corespondentul clientului Python pentru Windows: aceleași comenzi, aceeași ieșire, și analizează răspunsul în loc să-ți dea JSON brut — adaugă --json pentru asta. Este scris pentru Windows PowerShell care există deja pe mașină, așa că nu e nimic de instalat, și rulează neschimbat pe PowerShell 7. S-ar putea să ai nevoie de Set-ExecutionPolicy -Scope Process Bypass în fereastra din care îl rulezi, adică Windows întrebând dacă ai vrut cu adevărat să rulezi un script descărcat — o întrebare corectă, iar fișierul este destul de scurt ca să-l citești mai întâi.
$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 este același set de file ca clientul desktop, ca trei fișiere — o pagină, o foaie de stil și un script — fără instalare, fără framework și fără să încarce nimic de altundeva decât de pe acest site. Trei în loc de unul pentru că politica Content-Security-Policy a site-ului interzice scripturile și stilurile inline, lucru care merită păstrat. Poți trage fișiere pe el. Trebuie deschis de aici, nu salvat și deschis de pe discul tău: API-ul nu trimite anteturi cross-origin, așa că unei copii locale browserul i-ar refuza fiecare cerere înainte să plece. Cheia este ținută în memorie dacă nu bifezi căsuța ca să fie reținută.
https://0wx.es/clients/0wx.html
0wx-gui.ps1 este același set de file ca clientul desktop, desenat cu WinForms — ceea ce înseamnă nimic de instalat, fiindcă face deja parte din Windows. Pune-l în același dosar cu 0wx.ps1: fereastra împrumută gestionarea cererilor din acel fișier în loc să care o a doua copie, așa că e nevoie de ambele. Windows va întreba înainte să ruleze un script pe care nu l-a scris el, ceea ce este corect; ambele fișiere sunt destul de scurte ca să le citești înainte să răspunzi.
powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
0wx-gtk.pl este o fereastră GTK mică, cu file pentru încărcare, lipire, scurtare și răsfoirea fișierelor tale — ca listă sau ca galerie de miniaturi, filtrată după galerie. Este singurul client de aici care are nevoie de ceva instalat — binding-urile GTK3 pentru Perl — lucru bun de știut pe lângă fereastra Windows de mai sus, care nu are nevoie de nimic. Tot restul folosit vine cu Perl. Cheia este ținută doar în memorie: închiderea ferestrei o uită, iar setarea OWX_KEY o completează la pornire. Orice ți-ar arăta, răspunsul brut al serverului este la un clic distanță, sub “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
0wx-android.apk face ce fac și ceilalți clienți, de pe telefon: încărcare, lipire, scurtare, traducere și răsfoirea fișierelor tale ca listă sau galerie. Partajarea unui fișier către ea din orice altă aplicație îl încarcă, iar partajarea unui text îl stochează ca paste. Nu este în niciun magazin de aplicații, așa că dispozitivul tău îți va cere să permiți instalarea — o întrebare care merită luată în serios în general, și motivul pentru care întregul cod sursă este și aici: deschide-l în Android Studio și compilează-l tu în loc să te încrezi în fișier. Compilarea are nevoie de JDK 21; BUILDING.md dinăuntru spune de ce.
https://0wx.es/clients/0wx-android.apk # install it https://0wx.es/clients/0wx-android.zip # build it yourself
Nu există, intenționat, o acțiune de preluare de la distanță. Ar face serverul să preia un URL ales de apelant, ceea ce este o suprafață de atac de tip request forgery, iar un script o poate exploata mult mai intens decât un formular. Încarcă fișierul tu însuți.