~0wx.org~ :: File hosting și alte instrumente utile


Încărcați URL scurtă URL uriașă Pastebin Despre Raportează Logare
Română ▼
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 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

Există un API pentru toate funcțiile de pe 0wx.org. Îl poți folosi în scripturi sau din consolă.

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.

Efectuarea unei cereri

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.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
Valori care conțin &

Î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.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
Autentificare

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.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
Acțiuni
actionParametriDescriere
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.
uploadfile (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.
tinyurlurl, lifetimeScurtează un URL.
hugeurlurl, lifetimeLungește un URL, absurd, dinadins.
pastecontent, lifetimeStochează un bloc de text și întoarce un link către el.
translatecontent, to, fromTraduce 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.
langsListează 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.
dyndnskey, ip, formatActualizează 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, gListează 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 *pageListează paste-urile tale, cu o previzualizare de 200 de caractere a fiecăruia în locul întregului corp.
listurls *pageListează URL-urile tale scurte și uriașe, cu adresa spre care indică fiecare.
otl *shareCreează 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 *pageListează 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, publishRaportează starea de publicare a unei galerii și o schimbă când este dat publish.
move *share (repetabil), gallery sau gMută 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ă.

Mai multe deodată

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.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
Galerii

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.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
Încărcarea fișierelor

Î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.org/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.

Durată

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.

Răspunsuri

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

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

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.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"}
]}
Coduri de eroare
errorHTTPDescriere
unknown_action400Nu există o astfel de acțiune.
bad_json400Corpul nu era JSON valid, sau un câmp conținea o structură imbricată.
unexpected_parameter400A sosit un parametru pe care această acțiune nu-l acceptă — de obicei un & necodificat într-o valoare. Mesajul numește parametrii.
bad_key401Cheia nu a fost recunoscută. O cheie greșită este refuzată în loc să fie tratată în tăcere ca anonimă.
bad_url400URL-ul este malformat sau folosește o altă schemă decât http(s), ftp sau gopher.
bad_lifetime400Durata nu era un număr sau un număr urmat de m, h sau d.
no_content400Nu a fost trimis nimic de stocat.
url_too_long413URL-ul depășește limita de lungime.
paste_too_long413Textul 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_files413Mai multe fișiere decât acceptă un singur apel.
no_usable_files415Toate fișierele au fost respinse. Vezi lista rejected pentru motive.
backend_unavailable502Backend-ul de traducere nu a răspuns.
internal500Ceva a eșuat pe neașteptate. A fost consemnat.
Limite

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.

Un client shell

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.org/clients/0wx.sh
chmod +x 0wx.sh
export OWX_KEY=YOUR_KEY
./0wx.sh help
./0wx.sh paste --content 'hello & world'
Un client Python

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.org/clients/0wx.py
chmod +x 0wx.py
export OWX_KEY=YOUR_KEY
./0wx.py listfiles
./0wx.py listfiles --json | jq '.files[].url'
Un client Perl

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.org/clients/0wx.pl
chmod +x 0wx.pl
export OWX_KEY=YOUR_KEY
./0wx.pl listfiles
Un client PowerShell

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'
O fereastră în browserul tău

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.org/clients/0wx.html
O fereastră pe Windows

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
O fereastră pe Linux cu GTK

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.org/clients/0wx-gtk.pl
chmod +x 0wx-gtk.pl
OWX_KEY=YOUR_KEY ./0wx-gtk.pl
O aplicație Android

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

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.


(p) 2018 0wx.org - / - Susținut de Linux și GNU. Traieste liber sau mori! (root@0wx.org)