~0wx.cat~ :: Filhosting og andre nyttige værktøjer


Upload TinyURL HugeURL Pastebin Om Anmeld Log ind
Dansk ▼
English English Deutsch Deutsch Plattdüütsch Plattdüütsch Lëtzebuergesch Lëtzebuergesch Nederlands Nederlands 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

Der findes en API til alle funktioner på 0wx.cat. Du kan bruge den til scripts eller fra konsollen.

Alt hvad formularerne på dette websted gør, til scripts. Hvert svar er JSON, også fejl, så du skal aldrig gætte på, om en krop er et resultat eller en forklaring.

At lave en forespørgsel

POST til endpointet med enten formularparametre eller en JSON-krop. De er ligeværdige; vælg det, dine værktøjer gør nemmest. Parameteren action vælger, hvad der skal ske. Brug --data-urlencode til alt, et menneske har tastet — paste-tekst, en URL, en oversættelse — for -d sender værdien rå, og den bliver klippet ved det første &. Almindelig -d er fint til faste værdier som action selv. wget har slet ikke --data-urlencode, så med wget må du enten selv procent-kode sådanne værdier eller sende en JSON-krop, som ikke kræver nogen kodning.

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
Værdier der indeholder &

I en formularkrop adskiller & parametre, og curl -d koder ikke det, du giver den. En URL med querystring bliver derfor klippet ved sit første &, og resten ankommer som separate parametre. Brug --data-urlencode, eller send JSON. Vildfarne parametre afvises i stedet for at blive ignoreret, så dette fejler højlydt i stedet for at gemme et halvt link.

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

Valgfrit. Uden nøgle er en forespørgsel anonym og opfører sig præcis som en anonym besøgende — resultatet er offentligt under alle omstændigheder, den eneste forskel er, om det havner i din filliste. Opret en nøgle på din kontoside og send den som bearer-token; at give den som parameteren apikey virker også, men en nøgle i en querystring ender i serverlogs og browserhistorik.

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
Handlinger
actionParametreBeskrivelse
whoami—Bekræfter at en nøgle virker og oplyser de gældende grænser. Koster ikke noget; kald den først.
ip—Oplyser din adresse, dens PTR, det land, den region og den by den geolokaliseres til, koordinaterne og den user agent, du sendte. Kræver ingen nøgle og svarer ens med og uden. Bevidst smallere end websiden: ingen WHOIS, ingen DNS-zone og ingen opslag i blokeringslister, så et kald koster serveren intet andet end en lokal databaselæsning.
uploadfile (kan gentages), resize, lifetime, gallery eller g *Uploader en eller flere filer. Skal være multipart/form-data. Angives et galleri, lægges de direkte i det, og dets id returneres.
tinyurlurl, lifetimeForkorter en URL.
hugeurlurl, lifetimeForlænger en URL, absurd meget, med vilje.
pastecontent, lifetimeGemmer en tekstblok og returnerer et link til den.
translatecontent, to, fromOversætter tekst. to og from er koder fra handlingen langs — bemærk at de ikke altid er landekoder: dansk er da, ikke dk. from kan udelades eller angives som auto, hvilket beder backend'en om at genkende sproget; at angive det giver bedre resultat på kort tekst.
langsLister de sprog, translate accepterer, som supported_langs: ét objekt pr. sprog, kode til navn, i den rækkefølge webstedet tilbyder dem. Kræver ingen API-nøgle.
dyndnskey, ip, formatOpdaterer et dynamisk DNS-navn. Den eneste handling, der ikke kræver API-nøgle: den kaldes af en router, som har ét felt til en URL og ingen måde at sende en header på. key er den opdateringsnøgle pr. navn, der vises på din konto, ikke din API-nøgle. Udelad ip, så bruges den adresse, du kalder fra. Svaret er det de facto dyndns2-ord — good, nochg, badauth, abuse eller dnserr — som ren tekst, for det er det, routere parser; tilføj format=json for det sædvanlige JSON.
listfiles *page, gLister dine filer med alt, hvad info-panelet viser, plus miniature og direkte link. g begrænser til ét galleri, eller none til filer uden galleri.
listpastes *pageLister dine tekster med et 200-tegns udsnit af hver i stedet for hele kroppen.
listurls *pageLister dine korte og enorme URL'er med den adresse, hver af dem peger på.
otl *shareOpretter et engangslink til en af dine filer. Hvert kald præger et nyt, så at give den samme fil til to personer giver to links.
listotl *pageLister dine aktive engangslinks, den fil hvert af dem peger på, og om den fil siden er udløbet.
listgalleries *—Lister dine gallerier med id'er, navne, filantal og udgivelsesstatus.
gallery *g, publishOplyser et galleris udgivelsesstatus og ændrer den, når publish angives.
move *share (kan gentages), gallery eller gFlytter filer til et galleri, efter navn (oprettes hvis nyt) eller efter id. Udelades begge, flyttes de tilbage til hovedlisten.
delete *share (kan gentages), g, otl, withfilesSletter filer, tekster, korte URL'er, gallerier, engangslinks eller en hvilken som helst blanding. En share matches først mod dine filer og derefter mod dine tekster og links, så kalderen behøver ikke sortere dem efter type. Engangslinks angives særskilt i otl: at fjerne et link må ikke kunne forveksles med at slette den fil, det peger på.

* Disse handlinger kræver en API-nøgle. De læser eller ændrer én kontos egne data, så der findes ingen anonym form af dem.

Flere ad gangen

share og g accepterer et gentaget felt, et JSON-array eller en kommasepareret liste — det, dine værktøjer gør nemmest. Dubletter ignoreres.

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
Gallerier

Hvor end et galleri angives — ved upload eller ved move — sker det på de samme to måder: g for et eksisterende id, eller gallery for et navn, som oprettes, hvis det er nyt. Sendes begge, vinder g. Svaret bærer galleri-id'et. Bemærk at sletning af et galleri kun fjerner galleriet og lader dets filer blive i hovedlisten — i modsætning til webformularen, som sletter dem efter at have spurgt. Send withfiles=true for også at slette dem: et script, der rydder op i sine grupperinger, bør ikke miste uploads ved et uheld.

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
Upload af filer

Uploads kan ikke bruge JSON-kroppen, fordi en fil skal sendes som multipart. Gentag file-delen for at sende flere på én gang. Hver fil rapporteres for sig: svaret bærer en files-liste over de accepterede og en rejected-liste over de afviste, så en delvis succes er stadig en succes.

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

Der findes ingen wget-form af denne. wget kan ikke bygge en multipart/form-data-krop — den har intet modstykke til curls -F — og uploads skal være multipart. Brug curl, eller saml selv krop og boundary og send det med --post-file.

Levetid

Valgfrit ved enhver handling, der gemmer noget. Accepterer rene sekunder eller et tal efterfulgt af m, h eller d — de samme former som webformularerne. Udelad det eller send 0 for at beholde elementet på ubestemt tid.

Svar

Hvert svar er et JSON-objekt med et ok-felt. Ved succes bærer det resultatet; ved fejl bærer det en stabil error-kode og en læsbar message. Forgren på koden, log beskeden.

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

Hvor en fil bærer dem, føjer listfiles file_tags til dens post: kunstner, titel og album, læst fra ID3, Vorbis-kommentarer eller MP4-atomer, da filen blev uploadet. Nøglen er fraværende frem for null, når der intet er at oplyse, hvilket gælder de fleste filer, så test for den, før du læser den. Enkelte felter kan også mangle — en fil kan have en titel og intet album. Intet andet fra filens metadata blottes: et iTunes-køb registrerer køberens navn og Apple-ID, og de læses med vilje aldrig.

{"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"}
]}
Fejlkoder
errorHTTPBeskrivelse
unknown_action400Der findes ingen sådan handling.
bad_json400Kroppen var ikke gyldig JSON, eller et felt indeholdt en indlejret struktur.
unexpected_parameter400Der kom en parameter, som denne handling ikke tager — typisk et ukodet & i en værdi. Beskeden nævner parametrene.
bad_key401Nøglen blev ikke genkendt. En forkert nøgle afvises i stedet for stiltiende at blive behandlet som anonym.
bad_url400URL'en er misdannet eller bruger et andet skema end http(s), ftp eller gopher.
bad_lifetime400Levetiden var hverken et tal eller et tal efterfulgt af m, h eller d.
no_content400Der blev ikke sendt noget at gemme.
url_too_long413URL'en er længere end grænsen.
paste_too_long413Teksten er større end paste-grænsen. Grænser måles i UTF-8-bytes, så ikke-latinsk tekst tæller mere, end antallet af tegn antyder.
too_many_files413Flere filer end ét kald accepterer.
no_usable_files415Alle filer blev afvist. Se listen rejected for hvorfor.
backend_unavailable502Oversættelses-backend'en svarede ikke.
internal500Noget fejlede uventet. Det er logget.
Grænser

Kald whoami for at læse de gældende værdier i stedet for at hardkode dem — de sættes af serverens operatør og kan ændre sig. Størrelser er UTF-8-bytes.

En shell-klient

0wx.sh pakker alt ovenstående ind. Det er ren POSIX-shell, kræver intet andet end curl og er kort nok til at læse, før du kører det — hvilket er det rigtige at gøre med et script, der skal holde din API-nøgle. Læg nøglen i OWX_KEY i stedet for at give --key, så holdes den ude af din shell-historik.

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'
En Python-klient

0wx.py gør det samme som shell-klienten, men parser svaret og udskriver, hvad felterne betyder, i stedet for at give dig rå JSON — tilføj --json, når du vil have den rå form tilbage. Kun standardbibliotek: ingen requests, intet at installere. Skriver du din egen klient, er dens funktioner send() og report() værd at læse: tilsammen viser de, hvordan forespørgslen bygges, hvordan beskeden trækkes ud af en mislykket forespørgsel, og hvad svarene indeholder.

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'
En Perl-klient

0wx.pl gør det samme som Python-klienten og udskriver det samme. Kun kernemoduler — HTTP::Tiny og JSON::PP har fulgt med Perl siden 5.14, så der er intet at installere. Værd at læse ved siden af Python-klienten, hvis du skriver din egen: de to sprog fejler forskelligt på en ødelagt forespørgsel, og begge scripts fortæller hvor.

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

0wx.ps1 er Python-klientens modstykke til Windows: samme kommandoer, samme output, og den parser svaret i stedet for at give dig rå JSON — tilføj --json for det. Den er skrevet til den Windows PowerShell, der allerede er på maskinen, så der er intet at installere, og den kører uændret på PowerShell 7. Du kan få brug for Set-ExecutionPolicy -Scope Process Bypass i det vindue, du kører den fra; det er Windows, der spørger, om du virkelig ville køre et script, du har downloadet — et rimeligt spørgsmål, og filen er kort nok til at læse først.

$env:OWX_KEY = 'YOUR_KEY'
.\0wx.ps1 listfiles
.\0wx.ps1 paste --content 'hello & world'
.\0wx.ps1 upload --file .\holiday.jpg --gallery 'Holiday 2026'
Et vindue i din browser

0wx.html er det samme sæt faner som desktop-klienten, som tre filer — en side, et stylesheet og et script — uden installation, uden framework og uden at der indlæses noget fra andre steder end dette websted. Tre i stedet for én, fordi webstedets Content-Security-Policy forbyder inline script og stil, hvilket er værd at bevare. Filer kan slippes på det. Det skal åbnes herfra frem for at blive gemt og åbnet fra din disk: API'et sender ingen cross-origin-headere, så en lokal kopi ville få hver forespørgsel afvist af din browser, før den forlod maskinen. Nøglen holdes i hukommelsen, medmindre du sætter kryds i feltet for at huske den.

https://0wx.cat/clients/0wx.html
Et vindue på Windows

0wx-gui.ps1 er det samme sæt faner som desktop-klienten, tegnet med WinForms — hvilket betyder slet intet at installere, da det allerede er en del af Windows. Læg den i samme mappe som 0wx.ps1: vinduet låner den fils forespørgselshåndtering i stedet for at bære en ekstra kopi, så begge er nødvendige. Windows vil spørge, før det kører et script, det ikke selv har skrevet, hvilket er et rimeligt spørgsmål; begge filer er korte nok til at læse, før du svarer.

powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
Et vindue på Linux med GTK

0wx-gtk.pl er et lille GTK-vindue med faner til at uploade, indsætte, forkorte og gennemse dine filer — som liste eller som galleri af miniaturer, filtreret efter galleri. Det er den eneste klient her, der kræver noget installeret — Perls GTK3-bindinger — hvilket er værd at vide ved siden af Windows-vinduet ovenfor, som slet intet kræver. Alt andet, det bruger, følger med Perl. Nøglen holdes kun i hukommelsen: at lukke vinduet glemmer den, og at sætte OWX_KEY udfylder den ved start. Uanset hvad det viser dig, er serverens rå svar ét klik væk under “Server reply”.

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
En Android-app

0wx-android.apk gør det, de andre klienter gør, fra en telefon: uploade, indsætte, forkorte, oversætte og gennemse dine filer som liste eller galleri. Deler du en fil til den fra en anden app, uploades den, og deler du tekst, gemmes den som tekst. Den er ikke i nogen app store, så din enhed vil spørge, om du tillader installationen — et spørgsmål, der generelt er værd at tage alvorligt, og grunden til at hele kildekoden også ligger her: åbn den i Android Studio og byg den selv i stedet for at stole på filen. Bygning kræver JDK 21; BUILDING.md deri fortæller hvorfor.

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

Der er med vilje ingen handling til fjernhentning. Den ville få serveren til at hente en URL efter kalderens valg, hvilket er en angrebsflade for request forgery, og et script kan drive det langt hårdere end en formular. Upload filen selv i stedet.


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