~0wx.cat~ :: Hébergement de fichiers et autres outils utiles


Télécharger URL courte URL énorme Pastebin Informations Signaler S'identifier
Français ▼
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 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

Il existe un pilotage à distance pour toutes les fonctions de 0wx.cat. Tu peux t'en servir pour des scripts et des applications.

Tout ce que font les formulaires de ce site, pour les scripts. Chaque réponse est du JSON, erreurs comprises, tu n'as donc jamais à deviner si un corps est un résultat ou une explication.

Faire une requête

Fais un POST vers le point de terminaison avec des paramètres de formulaire ou un corps JSON. Les deux sont équivalents ; prends ce que tes outils rendent le plus simple. Le paramètre action choisit quoi faire. Utilise --data-urlencode pour tout ce qu'une personne a tapé — texte d'un paste, URL, traduction — car -d envoie la valeur brute et elle sera coupée au premier &. Un simple -d suffit pour les valeurs fixes comme action lui-même. wget n'a pas de --data-urlencode du tout, donc avec wget, encode ces valeurs en pourcentage toi-même ou envoie un corps JSON, qui n'a besoin d'aucun encodage.

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
Valeurs contenant &

Dans un corps de formulaire, & sépare les paramètres, et curl -d n'encode pas ce que tu lui donnes. Une URL avec chaîne de requête est donc coupée à son premier &, et le reste arrive en paramètres séparés. Utilise --data-urlencode, ou envoie du JSON. Les paramètres parasites sont refusés plutôt qu'ignorés, cela échoue donc bruyamment au lieu de stocker un demi-lien.

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

Facultatif. Sans clé, une requête est anonyme et se comporte exactement comme un visiteur anonyme — le résultat est public de toute façon, la seule différence est de savoir s'il atterrit dans ta liste de fichiers. Génère une clé sur la page de ton compte et envoie-la comme jeton bearer ; la passer en paramètre apikey fonctionne aussi, mais une clé dans une chaîne de requête finit dans les journaux du serveur et l'historique du navigateur.

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
Actions
actionParamètresDescription
whoami—Confirme qu'une clé fonctionne et indique les limites en vigueur. Ne coûte rien ; appelle-la en premier.
ip—Indique ton adresse, son PTR, le pays, la région et la ville où elle est géolocalisée, les coordonnées et le user agent que tu as envoyé. Ne nécessite pas de clé et répond la même chose avec ou sans. Délibérément plus étroit que la page web : pas de WHOIS, pas de zone DNS et pas de consultation de listes de blocage, l'appeler ne coûte donc au serveur qu'une lecture de base de données locale.
uploadfile (répétable), resize, lifetime, gallery ou g *Envoie un ou plusieurs fichiers. Doit être en multipart/form-data. Nommer une galerie les y place directement et renvoie son id.
tinyurlurl, lifetimeRaccourcit une URL.
hugeurlurl, lifetimeAllonge une URL, absurdement, exprès.
pastecontent, lifetimeStocke un bloc de texte et renvoie un lien vers lui.
translatecontent, to, fromTraduit du texte. to et from sont des codes issus de l'action langs — note que ce ne sont pas toujours des codes pays : le danois est da, pas dk. from peut être omis ou valoir auto, ce qui demande au backend de détecter la langue ; l'indiquer donne un meilleur résultat sur un texte court.
langsListe les langues que translate accepte, dans supported_langs : un objet par langue, code vers nom, dans l'ordre où le site les propose. Ne nécessite pas de clé d'API.
dyndnskey, ip, formatMet à jour un nom DNS dynamique. La seule action qui ne nécessite pas de clé d'API : elle est appelée par un routeur, qui a un champ pour une URL et aucun moyen d'envoyer un en-tête. key est la clé de mise à jour propre au nom, affichée dans ton compte, pas ta clé d'API. Omets ip et l'adresse depuis laquelle tu appelles est utilisée. La réponse est le mot dyndns2 de facto — good, nochg, badauth, abuse ou dnserr — en texte brut, car c'est ce que les routeurs analysent ; ajoute format=json pour le JSON habituel.
listfiles *page, gListe tes fichiers avec tout ce que montre le panneau d'infos, plus la miniature et le lien direct. g limite à une galerie, ou none aux fichiers sans galerie.
listpastes *pageListe tes pastes, avec un aperçu de 200 caractères de chacun plutôt que le corps entier.
listurls *pageListe tes URL courtes et énormes, avec l'adresse vers laquelle chacune pointe.
otl *shareCrée un lien à usage unique vers l'un de tes fichiers. Chaque appel en frappe un nouveau, donner le même fichier à deux personnes donne donc deux liens.
listotl *pageListe tes liens à usage unique actifs, le fichier que chacun désigne, et si ce fichier a expiré depuis.
listgalleries *—Liste tes galeries avec leurs id, noms, nombres de fichiers et états de publication.
gallery *g, publishIndique l'état de publication d'une galerie, et le change quand publish est fourni.
move *share (répétable), gallery ou gDéplace des fichiers dans une galerie, par nom (créée si nouvelle) ou par id. Si les deux sont omis, ils reviennent dans la liste principale.
delete *share (répétable), g, otl, withfilesSupprime des fichiers, des pastes, des URL courtes, des galeries, des liens à usage unique, ou un mélange. Un share est comparé d'abord à tes fichiers puis à tes pastes et liens, l'appelant n'a donc pas à les trier par type. Les liens à usage unique vont à part dans otl : retirer un lien ne doit pas pouvoir se confondre avec la suppression du fichier qu'il désigne.

* Ces actions nécessitent une clé d'API. Elles lisent ou modifient les données propres à un compte, elles n'ont donc pas de forme anonyme.

Plusieurs à la fois

share et g acceptent un champ répété, un tableau JSON ou une liste séparée par des virgules — ce que tes outils rendent le plus simple. Les doublons sont ignorés.

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
Galeries

Partout où une galerie est nommée — sur upload ou sur move — elle se donne des deux mêmes façons : g pour un id existant, ou gallery pour un nom, créé s'il est nouveau. Si les deux sont envoyés, g l'emporte. La réponse porte l'id de la galerie. Note que supprimer une galerie ne retire que la galerie et laisse ses fichiers dans la liste principale — contrairement au formulaire web, qui les supprime après confirmation. Passe withfiles=true pour les supprimer aussi : un script qui range ses regroupements ne devrait pas perdre les envois par accident.

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
Envoyer des fichiers

Les envois ne peuvent pas utiliser le corps JSON, car un fichier doit être envoyé en multipart. Répète la partie file pour en envoyer plusieurs à la fois. Chaque fichier est signalé séparément : la réponse porte une liste files des acceptés et une liste rejected des refusés, un succès partiel reste donc un succès.

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

Il n'y a pas de forme wget pour celle-ci. wget ne sait pas construire un corps multipart/form-data — il n'a pas d'équivalent au -F de curl — et les envois doivent être en multipart. Utilise curl, ou assemble toi-même le corps et le boundary et envoie-les avec --post-file.

Durée de vie

Facultatif sur toute action qui stocke quelque chose. Accepte des secondes brutes, ou un nombre suivi de m, h ou d — les mêmes formes que les formulaires web. Omets-le ou passe 0 pour conserver l'élément indéfiniment.

Réponses

Chaque réponse est un objet JSON avec un champ ok. En cas de succès il porte le résultat ; en cas d'échec il porte un code error stable et un message lisible. Branche sur le code, journalise le message.

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

Quand un fichier en porte, listfiles ajoute file_tags à son entrée : artiste, titre et album, lus depuis ID3, les commentaires Vorbis ou les atomes MP4 à l'envoi du fichier. La clé est absente plutôt que null quand il n'y a rien à signaler, ce qui est le cas de la plupart des fichiers ; teste-la donc avant de la lire. Des champs individuels peuvent aussi manquer — un fichier peut avoir un titre et pas d'album. Rien d'autre des métadonnées du fichier n'est exposé : un achat iTunes enregistre le nom et l'identifiant Apple de l'acheteur, et ceux-là ne sont délibérément jamais lus.

{"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"}
]}
Codes d'erreur
errorHTTPDescription
unknown_action400Cette action n'existe pas.
bad_json400Le corps n'était pas du JSON valide, ou un champ contenait une structure imbriquée.
unexpected_parameter400Un paramètre que cette action ne prend pas est arrivé — en général un & non encodé dans une valeur. Le message nomme les paramètres.
bad_key401La clé n'a pas été reconnue. Une clé erronée est refusée plutôt que traitée silencieusement comme anonyme.
bad_url400L'URL est malformée, ou utilise un schéma autre que http(s), ftp ou gopher.
bad_lifetime400La durée de vie n'était ni un nombre ni un nombre suivi de m, h ou d.
no_content400Rien n'a été envoyé à stocker.
url_too_long413L'URL dépasse la limite de longueur.
paste_too_long413Le texte dépasse la limite des pastes. Les limites se mesurent en octets UTF-8, un texte non latin compte donc plus que son nombre de caractères ne le laisse penser.
too_many_files413Plus de fichiers qu'un seul appel n'en accepte.
no_usable_files415Tous les fichiers ont été refusés. Regarde la liste rejected pour savoir pourquoi.
backend_unavailable502Le backend de traduction n'a pas répondu.
internal500Quelque chose a échoué de façon inattendue. C'est consigné.
Limites

Appelle whoami pour lire les valeurs en vigueur plutôt que de les coder en dur — elles sont fixées par l'exploitant du serveur et peuvent changer. Les tailles sont en octets UTF-8.

Un client shell

0wx.sh enveloppe tout ce qui précède. C'est du shell POSIX pur qui ne nécessite rien d'autre que curl, et il est assez court pour être lu avant d'être exécuté — ce qu'il convient de faire avec un script qui détiendra ta clé d'API. Mets la clé dans OWX_KEY plutôt que de passer --key, et elle restera hors de l'historique de ton shell.

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'
Un client Python

0wx.py fait la même chose que le client shell, mais analyse la réponse et affiche ce que signifient les champs au lieu de te livrer du JSON brut — ajoute --json quand tu veux la forme brute. Bibliothèque standard uniquement : pas de requests, rien à installer. Si tu écris ton propre client, ses fonctions send() et report() sont les parties qui valent la lecture : à elles deux, elles montrent comment construire la requête, comment extraire le message d'une requête échouée et ce que contiennent les réponses.

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'
Un client Perl

0wx.pl fait la même chose que celui en Python et affiche la même sortie. Modules du cœur uniquement — HTTP::Tiny et JSON::PP sont livrés avec Perl depuis la 5.14, il n'y a donc rien à installer. À lire à côté du client Python si tu écris le tien : les deux langages échouent différemment sur une requête cassée, et les deux scripts disent où.

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

0wx.ps1 est le pendant du client Python pour Windows : mêmes commandes, même sortie, et il analyse la réponse au lieu de te livrer du JSON brut — ajoute --json pour cela. Il est écrit pour le Windows PowerShell déjà présent sur la machine, il n'y a donc rien à installer, et il tourne sans changement sous PowerShell 7. Tu auras peut-être besoin de Set-ExecutionPolicy -Scope Process Bypass dans la fenêtre d'où tu le lances, c'est Windows qui demande si tu voulais vraiment exécuter un script téléchargé — une question légitime, et le fichier est assez court pour être lu d'abord.

$env:OWX_KEY = 'YOUR_KEY'
.\0wx.ps1 listfiles
.\0wx.ps1 paste --content 'hello & world'
.\0wx.ps1 upload --file .\holiday.jpg --gallery 'Holiday 2026'
Une fenêtre dans ton navigateur

0wx.html est le même jeu d'onglets que le client de bureau, en trois fichiers — une page, une feuille de style et un script — sans installation, sans framework, et sans rien charger d'ailleurs que de ce site. Trois plutôt qu'un parce que la Content-Security-Policy du site interdit les scripts et styles en ligne, ce qui vaut d'être conservé. On peut y déposer des fichiers. Il doit être ouvert d'ici plutôt qu'enregistré et ouvert depuis ton disque : l'API n'envoie pas d'en-têtes cross-origin, une copie locale verrait donc chaque requête refusée par ton navigateur avant même de partir. La clé est gardée en mémoire sauf si tu coches la case pour la retenir.

https://0wx.cat/clients/0wx.html
Une fenêtre sous Windows

0wx-gui.ps1 est le même jeu d'onglets que le client de bureau, dessiné avec WinForms — ce qui veut dire rien du tout à installer, puisque cela fait déjà partie de Windows. Mets-le dans le même dossier que 0wx.ps1 : la fenêtre emprunte la gestion des requêtes de ce fichier plutôt que d'en porter une seconde copie, les deux sont donc nécessaires. Windows demandera avant d'exécuter un script qu'il n'a pas écrit, ce qui est légitime ; les deux fichiers sont assez courts pour être lus avant de répondre.

powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
Une fenêtre sous Linux avec GTK

0wx-gtk.pl est une petite fenêtre GTK avec des onglets pour envoyer, coller, raccourcir et parcourir tes fichiers — en liste ou en galerie de miniatures, filtrée par galerie. C'est le seul client ici qui nécessite d'installer quelque chose — les liaisons GTK3 de Perl — ce qui vaut d'être su à côté de la fenêtre Windows ci-dessus, qui ne demande rien du tout. Tout le reste de ce qu'il utilise est livré avec Perl. La clé n'est gardée qu'en mémoire : fermer la fenêtre l'oublie, et définir OWX_KEY la remplit au démarrage. Quoi qu'il te montre, la réponse brute du serveur est à un clic sous “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
Une appli Android

0wx-android.apk fait ce que font les autres clients, depuis un téléphone : envoyer, coller, raccourcir, traduire et parcourir tes fichiers en liste ou en galerie. Lui partager un fichier depuis n'importe quelle autre appli l'envoie, et partager du texte le stocke comme paste. Il n'est sur aucune boutique d'applications, ton appareil te demandera donc d'autoriser son installation — une question qui mérite d'être prise au sérieux en général, et la raison pour laquelle la source complète est aussi ici : ouvre-la dans Android Studio et compile-la toi-même plutôt que de faire confiance au fichier. La compilation nécessite JDK 21 ; le BUILDING.md inclus explique pourquoi.

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

Il n'y a délibérément pas d'action de récupération à distance. Elle ferait aller chercher au serveur une URL choisie par l'appelant, ce qui est une surface de falsification de requête, et un script peut l'exploiter bien plus fort qu'un formulaire. Envoie le fichier toi-même.


(p) 2018 0wx.cat -/- Propulsé par Linux et GNU. Vivre libre ou mourir! (root@0wx.cat)