~0wx.cat~ :: Datei-Hosting und andere nützliche Tools


Hochladen Kurze URL Riesige URL Pastebin Informationen Melden Login
Deutsch ▼
English English 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 हिन्दी हिन्दी Ελληνικά Ελληνικά 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

Es gibt eine API für alle Funktionen auf 0wx.cat. Du kannst sie für Skripte oder Konsolen-Befehle verwenden.

Alles, was die Formulare dieser Seite tun, für Skripte. Jede Antwort ist JSON, auch Fehler, damit du nie raten musst, ob ein Rumpf ein Ergebnis oder eine Erklärung ist.

Eine Anfrage stellen

Sende POST an den Endpunkt, entweder mit Formularparametern oder mit einem JSON-Rumpf. Beides ist gleichwertig; nimm, was dein Werkzeug leichter macht. Der Parameter action wählt die Aktion. Nutze --data-urlencode für alles, was jemand eingetippt hat — Paste-Text, eine URL, eine Übersetzung — denn -d sendet den Wert roh und er wird beim ersten & abgeschnitten. Einfaches -d genügt für feste Werte wie action selbst. wget kennt gar kein --data-urlencode; mit wget musst du solche Werte also selbst prozentkodieren oder einen JSON-Rumpf senden, der keine Kodierung braucht.

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
Werte mit &

In einem Formularrumpf trennt & Parameter, und curl -d kodiert nicht, was du übergibst. Eine URL mit Query-String wird deshalb beim ersten & abgeschnitten, der Rest kommt als eigene Parameter an. Nimm --data-urlencode oder sende JSON. Überzählige Parameter werden abgelehnt statt ignoriert, das schlägt also laut fehl, statt einen halben Link zu speichern.

# 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
Authentifizierung

Optional. Ohne Schlüssel ist eine Anfrage anonym und verhält sich genau wie ein anonymer Besuch — das Ergebnis ist so oder so öffentlich, der Unterschied ist nur, ob es in deiner Dateiliste landet. Erzeuge einen Schlüssel auf deiner Kontoseite und sende ihn als Bearer-Token; als Parameter apikey geht auch, aber ein Schlüssel in der Adresse landet in Serverprotokollen und im Browserverlauf.

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
Aktionen
actionParameterBeschreibung
whoami—Prüft, ob ein Schlüssel funktioniert, und nennt die aktuellen Grenzen. Kostet nichts; ruf das zuerst auf.
ip—Meldet deine Adresse, ihren PTR, Land, Region und Stadt, zu denen sie geolokalisiert wird, die Koordinaten und den User-Agent, den du gesendet hast. Braucht keinen Schlüssel und antwortet mit oder ohne gleich. Bewusst schmaler als die Webseite: kein WHOIS, keine DNS-Zone, keine Sperrlisten-Abfragen, ein Aufruf kostet den Server also nur einen lokalen Datenbankzugriff.
uploadfile (wiederholbar), resize, lifetime, gallery oder g *Lädt eine oder mehrere Dateien hoch. Muss multipart/form-data sein.
tinyurlurl, lifetimeKürzt eine URL.
hugeurlurl, lifetimeVerlängert eine URL, absurd, mit Absicht.
pastecontent, lifetimeSpeichert einen Textblock und gibt einen Link darauf zurück.
translatecontent, to, fromÜbersetzt Text. to und from sind Codes aus der Aktion langs — das sind nicht immer Ländercodes: Dänisch ist da, nicht dk. from darf fehlen oder auto sein, dann erkennt das Backend die Sprache; die Angabe liefert bei kurzem Text ein besseres Ergebnis.
langsListet die Sprachen, die translate akzeptiert, als supported_langs: ein Objekt pro Sprache, Code zu Name, in der Reihenfolge, in der die Seite sie anbietet. Braucht keinen API-Schlüssel.
dyndnskey, ip, formatAktualisiert einen dynamischen DNS-Namen. Die einzige Aktion ohne API-Schlüssel: sie wird von einem Router aufgerufen, der ein Feld für eine URL hat und keinen Weg, einen Header zu senden. key ist der in deinem Konto angezeigte Aktualisierungsschlüssel des jeweiligen Namens, nicht dein API-Schlüssel. Lässt du ip weg, wird die Adresse verwendet, von der du aufrufst. Die Antwort ist das De-facto-dyndns2-Wort — good, nochg, badauth, abuse oder dnserr — als reiner Text, denn das ist, was Router auswerten; hänge format=json an für das übliche JSON.
listfiles *page, gListet deine Dateien mit allem, was das Info-Feld zeigt, plus Vorschaubild und Direktlink. g beschränkt auf eine Galerie, none auf Dateien ohne Galerie.
listpastes *pageListet deine Pastes, jeweils mit einer Vorschau von 200 Zeichen statt des ganzen Inhalts.
listurls *pageListet deine kurzen und riesigen URLs mit der Adresse, auf die jede zeigt.
otl *shareErzeugt einen Einmal-Link zu einer deiner Dateien. Jeder Aufruf prägt einen neuen, dieselbe Datei an zwei Personen zu geben ergibt also zwei Links.
listotl *pageListet deine aktiven Einmal-Links, die Datei, auf die jeder zeigt, und ob diese Datei inzwischen abgelaufen ist.
listgalleries *—Listet deine Galerien mit IDs, Namen, Dateianzahl und Veröffentlichungsstatus.
gallery *g, publishMeldet den Veröffentlichungsstatus einer Galerie und ändert ihn, wenn publish angegeben wird.
move *share (wiederholbar), gallery oder gVerschiebt Dateien in eine Galerie, per Name (wird bei Bedarf angelegt) oder per ID. Fehlen beide, wandern sie zurück in die Hauptliste.
delete *share (wiederholbar), g, otl, withfilesLöscht Dateien, Pastes, Kurz-URLs, Galerien, Einmal-Links oder eine beliebige Mischung. Ein Share wird zuerst mit deinen Dateien, dann mit deinen Pastes und Links abgeglichen, der Aufrufer muss sie also nicht nach Typ sortieren. Einmal-Links gehören getrennt in otl: das Entfernen eines Links darf nicht mit dem Löschen der Datei verwechselbar sein, auf die er zeigt.

* Diese Aktionen brauchen einen API-Schlüssel. Sie lesen oder ändern die Daten eines Kontos, eine anonyme Form gibt es daher nicht.

Mehrere auf einmal

share und g akzeptieren ein wiederholtes Feld, ein JSON-Array oder eine kommagetrennte Liste — was dein Werkzeug am leichtesten macht. Duplikate werden ignoriert.

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
Galerien

Wo immer eine Galerie angegeben wird — bei upload oder bei move — geschieht das auf dieselben zwei Arten: g für eine bestehende ID oder gallery für einen Namen, der angelegt wird, wenn er neu ist. Werden beide gesendet, gewinnt g. Die Antwort enthält die Galerie-ID. Beachte, dass das Löschen einer Galerie nur die Galerie entfernt und ihre Dateien in der Hauptliste belässt — anders als das Webformular, das sie nach Rückfrage mitlöscht. Übergib withfiles=true, um sie ebenfalls zu löschen: ein Skript, das seine Gruppierungen aufräumt, sollte nicht versehentlich die Uploads verlieren.

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
Dateien hochladen

Uploads können den JSON-Rumpf nicht nutzen, weil eine Datei als multipart gesendet werden muss. Wiederhole den Teil file, um mehrere auf einmal zu senden. Jede Datei wird einzeln gemeldet: die Antwort enthält eine Liste files mit den angenommenen und eine Liste rejected mit den abgelehnten, ein Teilerfolg bleibt also ein Erfolg.

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

Hierfür gibt es keine wget-Form. wget kann keinen multipart/form-data-Rumpf bauen — es hat kein Gegenstück zu curls -F — und Uploads müssen multipart sein. Nimm curl, oder setze Rumpf und Boundary selbst zusammen und sende sie mit --post-file.

Speicherdauer

Optional bei jeder Aktion, die etwas speichert. Akzeptiert reine Sekunden oder eine Zahl gefolgt von m, h oder d — dieselben Formen wie die Webformulare. Lass es weg oder gib 0 an, um den Eintrag unbegrenzt zu behalten.

Antworten

Jede Antwort ist ein JSON-Objekt mit einem Feld ok. Bei Erfolg trägt es das Ergebnis, bei Fehlschlag einen festen Code error und eine lesbare message. Verzweige über den Code, protokolliere die Meldung.

{"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."}
Audio-Tags

Wo eine Datei sie trägt, ergänzt listfiles ihren Eintrag um file_tags: Interpret, Titel und Album, beim Hochladen aus ID3, Vorbis-Kommentaren oder MP4-Atomen gelesen. Der Schlüssel fehlt, statt null zu sein, wenn es nichts zu melden gibt, was bei den meisten Dateien der Fall ist; prüfe ihn also, bevor du ihn liest. Auch einzelne Felder können fehlen — eine Datei kann einen Titel und kein Album haben. Nichts anderes aus den Metadaten der Datei wird offengelegt: ein iTunes-Kauf enthält Name und Apple-ID des Käufers, und die werden absichtlich nie gelesen.

{"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"}
]}
Fehlercodes
errorHTTPBeschreibung
unknown_action400Diese Aktion gibt es nicht.
bad_json400Der Rumpf war kein gültiges JSON, oder ein Feld enthielt eine verschachtelte Struktur.
unexpected_parameter400Es kam ein Parameter an, den diese Aktion nicht kennt — meist ein unkodiertes & in einem Wert. Die Meldung nennt die Parameter.
bad_key401Der Schlüssel wurde nicht erkannt. Ein falscher Schlüssel wird abgelehnt und nicht stillschweigend als anonym behandelt.
bad_url400Die URL ist fehlerhaft oder nutzt ein anderes Schema als http(s), ftp oder gopher.
bad_lifetime400Die Speicherdauer war keine Zahl und keine Zahl gefolgt von m, h oder d.
no_content400Es wurde nichts zum Speichern gesendet.
url_too_long413Die URL ist länger als erlaubt.
paste_too_long413Der Text ist größer als das Paste-Limit. Grenzen zählen Bytes in UTF-8, nicht-lateinischer Text zählt also mehr, als die Zeichenzahl vermuten lässt.
too_many_files413Mehr Dateien, als ein Aufruf annimmt.
no_usable_files415Alle Dateien wurden abgelehnt. Der Grund steht in der Liste rejected.
backend_unavailable502Der Übersetzungsdienst hat nicht geantwortet.
internal500Etwas ist unerwartet fehlgeschlagen. Es wurde protokolliert.
Grenzen

Ruf whoami auf, statt die Werte fest einzubauen — sie werden vom Betreiber gesetzt und können sich ändern. Größen sind Bytes in UTF-8.

Ein Shell-Client

0wx.sh kapselt alles oben. Es ist reine POSIX-Shell, braucht nichts außer curl und ist kurz genug, um es vor dem Ausführen zu lesen — das Richtige bei einem Skript, das deinen API-Schlüssel halten wird. Lege den Schlüssel in OWX_KEY statt --key zu übergeben, dann bleibt er aus deinem Shell-Verlauf.

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'
Ein Python-Client

0wx.py tut dasselbe wie der Shell-Client, wertet aber die Antwort aus und gibt aus, was die Felder bedeuten, statt dir rohes JSON zu reichen — hänge --json an, wenn du die Rohform zurückwillst. Nur Standardbibliothek: kein requests, nichts zu installieren. Wenn du einen eigenen Client schreibst, sind seine Funktionen send() und report() die lesenswerten Teile: zusammen zeigen sie, wie die Anfrage gebaut wird, wie man die Meldung aus einer gescheiterten holt und was die Antworten enthalten.

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'
Ein Perl-Client

0wx.pl tut dasselbe wie der Python-Client und gibt dasselbe aus. Nur Core-Module — HTTP::Tiny und JSON::PP liegen Perl seit 5.14 bei, es gibt also nichts zu installieren. Lesenswert neben dem Python-Client, wenn du einen eigenen schreibst: die beiden Sprachen scheitern bei einer kaputten Anfrage unterschiedlich, und beide Skripte sagen, wo.

wget https://0wx.cat/clients/0wx.pl
chmod +x 0wx.pl
export OWX_KEY=YOUR_KEY
./0wx.pl listfiles
Ein PowerShell-Client

0wx.ps1 ist das Gegenstück zum Python-Client für Windows: dieselben Befehle, dieselbe Ausgabe, und es wertet die Antwort aus, statt dir rohes JSON zu reichen — hänge dafür --json an. Es ist für die Windows PowerShell geschrieben, die schon auf dem Rechner ist, es gibt also nichts zu installieren, und es läuft unverändert unter PowerShell 7. Eventuell brauchst du Set-ExecutionPolicy -Scope Process Bypass in dem Fenster, aus dem du es startest; das ist Windows, das fragt, ob du wirklich ein heruntergeladenes Skript ausführen willst — eine berechtigte Frage, und die Datei ist kurz genug, um sie vorher zu lesen.

$env:OWX_KEY = 'YOUR_KEY'
.\0wx.ps1 listfiles
.\0wx.ps1 paste --content 'hello & world'
.\0wx.ps1 upload --file .\holiday.jpg --gallery 'Holiday 2026'
Ein Fenster in deinem Browser

0wx.html ist derselbe Satz Reiter wie der Desktop-Client, als drei Dateien — eine Seite, ein Stylesheet und ein Skript — ohne Installation, ohne Framework und ohne dass irgendetwas von woanders als dieser Seite geladen wird. Drei statt einer, weil die Content-Security-Policy der Seite Inline-Skript und -Stil verbietet, was es beizubehalten lohnt. Dateien können darauf abgelegt werden. Es muss von hier geöffnet werden, nicht gespeichert und von deiner Platte: die API sendet keine Cross-Origin-Header, eine lokale Kopie bekäme also jede Anfrage von deinem Browser abgewiesen, bevor sie rausgeht. Der Schlüssel bleibt im Speicher, außer du hakst an, dass er gemerkt werden soll.

https://0wx.cat/clients/0wx.html
Ein Fenster unter Windows

0wx-gui.ps1 ist derselbe Satz Reiter wie der Desktop-Client, gezeichnet mit WinForms — also überhaupt nichts zu installieren, denn das ist bereits Teil von Windows. Lege es in denselben Ordner wie 0wx.ps1: das Fenster leiht sich die Anfrageverarbeitung dieser Datei, statt eine zweite Kopie mitzuschleppen, es braucht also beide. Windows fragt, bevor es ein Skript ausführt, das es nicht selbst geschrieben hat, was eine berechtigte Frage ist; beide Dateien sind kurz genug, um sie vor der Antwort zu lesen.

powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
Ein Fenster unter Linux mit GTK

0wx-gtk.pl ist ein kleines GTK-Fenster mit Reitern zum Hochladen, Einfügen, Kürzen und Durchstöbern deiner Dateien — als Liste oder als Galerie von Vorschaubildern, nach Galerie gefiltert. Es ist der einzige Client hier, der etwas Installiertes braucht — die GTK3-Anbindung von Perl — was neben dem Windows-Fenster oben erwähnenswert ist, denn das braucht gar nichts. Alles andere, was es nutzt, liegt Perl bei. Der Schlüssel wird nur im Speicher gehalten: das Schließen des Fensters vergisst ihn, und OWX_KEY füllt ihn beim Start vor. Was immer es dir zeigt, die rohe Antwort des Servers ist unter “Server reply” einen Klick entfernt.

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
Eine Android-App

0wx-android.apk tut, was die anderen Clients tun, vom Telefon aus: hochladen, einfügen, kürzen, übersetzen und deine Dateien als Liste oder Galerie durchstöbern. Eine Datei aus einer anderen App damit zu teilen lädt sie hoch, Text zu teilen speichert ihn als Paste. Sie ist in keinem App-Store, dein Gerät wird also fragen, ob du die Installation erlaubst — eine Frage, die man generell ernst nehmen sollte, und der Grund, warum der komplette Quelltext ebenfalls hier liegt: öffne ihn in Android Studio und baue selbst, statt der Datei zu vertrauen. Zum Bauen ist JDK 21 nötig; BUILDING.md darin sagt, warum.

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

Es gibt bewusst keine Aktion zum Abholen entfernter Dateien. Sie würde den Server eine URL nach Wahl des Aufrufers holen lassen, was eine Angriffsfläche für Request Forgery ist, und ein Skript kann das weit härter treiben als ein Formular. Lade die Datei stattdessen selbst hoch.


(p) 2018 0wx.cat -/- Unterstützt durch Linux und GNU. Lebe frei oder stirb! (root@0wx.cat)