~0wx.eu~ :: Hosting di file e altri strumenti utili


Carica TinyURL HugeURL Pastebin Info Segnala Accedi
Italiano ▼
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 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

Esiste un'API per tutte le funzioni di 0wx.eu. Puoi usarla per script o da console.

Tutto ciò che fanno i moduli di questo sito, per gli script. Ogni risposta è JSON, errori compresi, quindi non devi mai indovinare se un corpo è un risultato o una spiegazione.

Fare una richiesta

Fai POST all'endpoint con parametri di modulo o con un corpo JSON. Sono equivalenti; scegli ciò che i tuoi strumenti rendono più facile. Il parametro action seleziona cosa fare. Usa --data-urlencode per tutto ciò che una persona ha digitato — il testo di un paste, un URL, una traduzione — perché -d invia il valore grezzo e verrà troncato al primo &. Un semplice -d va bene per valori fissi come action stesso. wget non ha affatto --data-urlencode, quindi con wget codifica tu stesso quei valori in percent-encoding oppure invia un corpo JSON, che non richiede alcuna codifica.

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

curl -X POST https://0wx.eu/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.eu/api.cgi
Valori contenenti &

In un corpo di modulo & separa i parametri, e curl -d non codifica ciò che gli dai. Un URL con query string viene quindi troncato al suo primo &, e il resto arriva come parametri separati. Usa --data-urlencode, oppure invia JSON. I parametri estranei vengono rifiutati invece che ignorati, quindi questo fallisce in modo evidente invece di memorizzare mezzo link.

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

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

Facoltativo. Senza chiave una richiesta è anonima e si comporta esattamente come un visitatore anonimo — il risultato è comunque pubblico, l'unica differenza è se finisce nel tuo elenco di file. Genera una chiave nella pagina del tuo account e inviala come token bearer; passarla come parametro apikey funziona anche, ma una chiave nella query string finisce nei log del server e nella cronologia del browser.

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

wget -qO- --header='Authorization: Bearer YOUR_KEY' \
     --post-data 'action=whoami' https://0wx.eu/api.cgi
Azioni
actionParametriDescrizione
whoami—Conferma che una chiave funziona e riporta i limiti attuali. Non costa nulla; chiamala per prima.
ip—Riporta il tuo indirizzo, il suo PTR, il paese, la regione e la città in cui viene geolocalizzato, le coordinate e lo user agent che hai inviato. Non richiede chiave e risponde allo stesso modo con o senza. Volutamente più ristretto della pagina web: niente WHOIS, niente zona DNS e niente consultazioni di blocklist, quindi chiamarlo costa al server solo una lettura del database locale.
uploadfile (ripetibile), resize, lifetime, gallery oppure g *Carica uno o più file. Deve essere multipart/form-data. Indicare una galleria li mette direttamente al suo interno e ne restituisce l'id.
tinyurlurl, lifetimeAccorcia un URL.
hugeurlurl, lifetimeAllunga un URL, in modo assurdo, di proposito.
pastecontent, lifetimeMemorizza un blocco di testo e restituisce un link a esso.
translatecontent, to, fromTraduce testo. to e from sono codici dell'azione langs — nota che non sono sempre codici paese: il danese è da, non dk. from può essere omesso o valere auto, che chiede al backend di rilevare la lingua; indicarlo dà un risultato migliore su testi brevi.
langsElenca le lingue accettate da translate, come supported_langs: un oggetto per lingua, da codice a nome, nell'ordine in cui il sito le offre. Non richiede chiave API.
dyndnskey, ip, formatAggiorna un nome DNS dinamico. L'unica azione che non richiede una chiave API: viene chiamata da un router, che ha un campo per un URL e nessun modo di inviare un'intestazione. key è la chiave di aggiornamento per nome mostrata nel tuo account, non la tua chiave API. Ometti ip e viene usato l'indirizzo da cui chiami. La risposta è la parola dyndns2 de facto — good, nochg, badauth, abuse o dnserr — come testo semplice, perché è ciò che i router interpretano; aggiungi format=json per il solito JSON.
listfiles *page, gElenca i tuoi file con tutto ciò che mostra il pannello Info, più la miniatura e il link diretto. g lo limita a una galleria, oppure none ai file senza galleria.
listpastes *pageElenca i tuoi paste, con un'anteprima di 200 caratteri di ciascuno invece del corpo intero.
listurls *pageElenca i tuoi URL brevi ed enormi, con l'indirizzo a cui punta ciascuno.
otl *shareCrea un link monouso a uno dei tuoi file. Ogni chiamata ne conia uno nuovo, quindi dare lo stesso file a due persone produce due link.
listotl *pageElenca i tuoi link monouso attivi, il file a cui punta ciascuno e se quel file è nel frattempo scaduto.
listgalleries *—Elenca le tue gallerie con id, nomi, numero di file e stato di pubblicazione.
gallery *g, publishRiporta lo stato di pubblicazione di una galleria e lo modifica quando viene fornito publish.
move *share (ripetibile), gallery oppure gSposta file in una galleria, per nome (creata se nuova) o per id. Se entrambi sono omessi, tornano nell'elenco principale.
delete *share (ripetibile), g, otl, withfilesElimina file, paste, URL brevi, gallerie, link monouso o qualsiasi combinazione. Uno share viene confrontato prima con i tuoi file e poi con i tuoi paste e link, quindi il chiamante non deve ordinarli per tipo. I link monouso vanno a parte in otl: rimuovere un link non deve poter essere confuso con l'eliminazione del file a cui punta.

* Queste azioni richiedono una chiave API. Leggono o modificano i dati di un account, quindi non hanno una forma anonima.

Più elementi alla volta

share e g accettano un campo ripetuto, un array JSON o un elenco separato da virgole — ciò che i tuoi strumenti rendono più facile. I duplicati vengono ignorati.

curl -X POST https://0wx.eu/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.eu/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
     -d action=delete -d 'share=Ab3xK9pQ,Zz7yT2mN'

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

Ovunque venga indicata una galleria — su upload o su move — la si fornisce negli stessi due modi: g per un id esistente, oppure gallery per un nome, creato se nuovo. Se vengono inviati entrambi, vince g. La risposta contiene l'id della galleria. Nota che eliminare una galleria rimuove solo la galleria, lasciando i suoi file nell'elenco principale — a differenza del modulo web, che li elimina dopo aver chiesto. Passa withfiles=true per eliminare anche quelli: uno script che riordina i propri raggruppamenti non dovrebbe perdere i caricamenti per sbaglio.

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

curl -X POST https://0wx.eu/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.eu/api.cgi
Caricare file

I caricamenti non possono usare il corpo JSON, perché un file deve essere inviato come multipart. Ripeti la parte file per inviarne più d'uno alla volta. Ogni file viene riportato separatamente: la risposta contiene un elenco files di quelli accettati e un elenco rejected di quelli respinti, quindi un successo parziale è comunque un successo.

curl -X POST https://0wx.eu/api.cgi \
     -H 'Authorization: Bearer YOUR_KEY' \
     -F action=upload \
     -F file=@photo.jpg \
     -F file=@notes.txt \
     -F lifetime=7d

Non c'è una forma wget per questa. wget non può costruire un corpo multipart/form-data — non ha un equivalente di -F di curl — e i caricamenti devono essere multipart. Usa curl, oppure assembla tu stesso corpo e boundary e inviali con --post-file.

Durata

Facoltativo in ogni azione che memorizza qualcosa. Accetta secondi semplici, o un numero seguito da m, h o d — le stesse forme accettate dai moduli web. Omettilo o passa 0 per conservare l'elemento a tempo indeterminato.

Risposte

Ogni risposta è un oggetto JSON con un campo ok. In caso di successo contiene il risultato; in caso di errore contiene un codice error stabile e un message leggibile. Dirama in base al codice, registra il messaggio.

{"ok":true,"type":"paste","share":"Ab3xK9pQ",
 "url":"https://0wx.eu/p/Ab3xK9pQ","bytes":11}

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

Dove un file li contiene, listfiles aggiunge file_tags alla sua voce: artista, titolo e album, letti da ID3, commenti Vorbis o atomi MP4 al caricamento del file. La chiave è assente anziché null quando non c'è nulla da riportare, cioè per la maggior parte dei file, quindi verificane la presenza prima di leggerla. Anche singoli campi possono mancare — un file può avere un titolo e nessun album. Nient'altro dei metadati del file viene esposto: un acquisto iTunes registra nome e Apple ID dell'acquirente, e quelli non vengono mai letti, di proposito.

{"ok":true,"type":"files","total":2,"page":1,"pages":1,"files":[
  {"share":"Ab3xK9pQ","name":"autobahn.mp3","mime":"audio/mpeg",
   "bytes":8123456,"url":"https://0wx.eu/i/Ab3xK9pQ",
   "file_tags":{"artist":"Kraftwerk","title":"Autobahn","album":"Autobahn"}},
  {"share":"Zz7yT2mN","name":"photo.jpg","mime":"image/jpeg",
   "bytes":204800,"url":"https://0wx.eu/i/Zz7yT2mN"}
]}
Codici di errore
errorHTTPDescrizione
unknown_action400Azione inesistente.
bad_json400Il corpo non era JSON valido, oppure un campo conteneva una struttura annidata.
unexpected_parameter400È arrivato un parametro che questa azione non accetta — di solito un & non codificato in un valore. Il messaggio indica i parametri.
bad_key401La chiave non è stata riconosciuta. Una chiave errata viene rifiutata invece di essere trattata silenziosamente come anonima.
bad_url400L'URL è malformato, oppure usa uno schema diverso da http(s), ftp o gopher.
bad_lifetime400La durata non era un numero o un numero seguito da m, h o d.
no_content400Non è stato inviato nulla da memorizzare.
url_too_long413L'URL supera il limite di lunghezza.
paste_too_long413Il testo supera il limite del paste. I limiti si misurano in byte UTF-8, quindi il testo non latino conta più di quanto suggerisca il numero di caratteri.
too_many_files413Più file di quanti ne accetti una singola chiamata.
no_usable_files415Tutti i file sono stati rifiutati. Controlla l'elenco rejected per sapere perché.
backend_unavailable502Il backend di traduzione non ha risposto.
internal500Qualcosa è fallito inaspettatamente. È stato registrato.
Limiti

Chiama whoami per leggere i valori attuali invece di scriverli nel codice — li imposta il gestore del server e possono cambiare. Le dimensioni sono in byte UTF-8.

Un client shell

0wx.sh incapsula tutto quanto sopra. È shell POSIX pura, non richiede altro che curl, ed è abbastanza breve da leggerlo prima di eseguirlo — che è la cosa giusta da fare con uno script che conserverà la tua chiave API. Metti la chiave in OWX_KEY invece di passare --key, e resterà fuori dalla cronologia della tua shell.

wget https://0wx.eu/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 fa lo stesso del client shell, ma analizza la risposta e stampa il significato dei campi invece di consegnarti JSON grezzo — aggiungi --json quando vuoi la forma grezza. Solo libreria standard: niente requests, niente da installare. Se stai scrivendo un client tuo, le sue funzioni send() e report() sono le parti che vale la pena leggere: insieme mostrano come costruire la richiesta, come estrarre il messaggio da una fallita e cosa contengono le risposte.

wget https://0wx.eu/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 fa lo stesso di quello Python e stampa lo stesso output. Solo moduli core — HTTP::Tiny e JSON::PP sono distribuiti con Perl dalla 5.14, quindi non c'è nulla da installare. Vale la pena leggerlo accanto al client Python se stai scrivendo il tuo: i due linguaggi falliscono in modo diverso su una richiesta rotta, ed entrambi gli script dicono dove.

wget https://0wx.eu/clients/0wx.pl
chmod +x 0wx.pl
export OWX_KEY=YOUR_KEY
./0wx.pl listfiles
Un client PowerShell

0wx.ps1 è la controparte del client Python per Windows: stessi comandi, stesso output, e analizza la risposta invece di consegnarti JSON grezzo — aggiungi --json per quello. È scritto per la Windows PowerShell già presente sulla macchina, quindi non c'è nulla da installare, e gira invariato su PowerShell 7. Potresti aver bisogno di Set-ExecutionPolicy -Scope Process Bypass nella finestra da cui lo esegui, che è Windows che chiede se intendevi davvero eseguire uno script scaricato — una domanda legittima, e il file è abbastanza breve da leggerlo prima.

$env:OWX_KEY = 'YOUR_KEY'
.\0wx.ps1 listfiles
.\0wx.ps1 paste --content 'hello & world'
.\0wx.ps1 upload --file .\holiday.jpg --gallery 'Holiday 2026'
Una finestra nel tuo browser

0wx.html è lo stesso insieme di schede del client desktop, in tre file — una pagina, un foglio di stile e uno script — senza installazione, senza framework, e senza caricare nulla da nessuna parte se non da questo sito. Tre invece di uno perché la Content-Security-Policy del sito vieta script e stile inline, cosa che vale la pena mantenere. Ci si possono trascinare file. Va aperto da qui invece che salvato e aperto dal tuo disco: l'API non invia intestazioni cross-origin, quindi a una copia locale il browser rifiuterebbe ogni richiesta prima ancora che parta. La chiave resta in memoria a meno che tu non spunti la casella per ricordarla.

https://0wx.eu/clients/0wx.html
Una finestra su Windows

0wx-gui.ps1 è lo stesso insieme di schede del client desktop, disegnato con WinForms — il che significa nulla da installare, dato che fa già parte di Windows. Mettilo nella stessa cartella di 0wx.ps1: la finestra prende in prestito la gestione delle richieste di quel file invece di portarsi dietro una seconda copia, quindi servono entrambi. Windows chiederà prima di eseguire uno script che non ha scritto lui, il che è legittimo; entrambi i file sono abbastanza brevi da leggerli prima di rispondere.

powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
Una finestra su Linux con GTK

0wx-gtk.pl è una piccola finestra GTK con schede per caricare, incollare, accorciare e sfogliare i tuoi file — come elenco o come galleria di miniature, filtrata per galleria. È l'unico client qui che richiede qualcosa di installato — i binding GTK3 di Perl — il che vale la pena sapere accanto alla finestra Windows qui sopra, che non richiede nulla. Tutto il resto che usa è distribuito con Perl. La chiave è conservata solo in memoria: chiudere la finestra la dimentica, e impostare OWX_KEY la precompila all'avvio. Qualunque cosa ti mostri, la risposta grezza del server è a un clic sotto “Server reply”.

apt install libgtk3-perl        # or: dnf install perl-Gtk3
wget https://0wx.eu/clients/0wx-gtk.pl
chmod +x 0wx-gtk.pl
OWX_KEY=YOUR_KEY ./0wx-gtk.pl
Un'app Android

0wx-android.apk fa ciò che fanno gli altri client, da un telefono: caricare, incollare, accorciare, tradurre e sfogliare i tuoi file come elenco o galleria. Condividere un file con l'app da qualsiasi altra app lo carica, e condividere testo lo memorizza come paste. Non è su nessuno store, quindi il tuo dispositivo chiederà se consentirne l'installazione — una domanda che vale la pena prendere sul serio in generale, e il motivo per cui l'intero sorgente è anche qui: aprilo in Android Studio e compilalo tu stesso invece di fidarti del file. La compilazione richiede JDK 21; il BUILDING.md incluso spiega perché.

https://0wx.eu/clients/0wx-android.apk        # install it
https://0wx.eu/clients/0wx-android.zip        # build it yourself
Note

Non c'è, di proposito, un'azione di recupero remoto. Farebbe recuperare al server un URL scelto dal chiamante, il che è una superficie di request forgery, e uno script può sfruttarla molto più di un modulo. Carica il file tu stesso.


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