~0wx.eu~ :: Alojamiento de archivos y otras herramientas útiles


Subir URL corta enlace enorme Pastebin Información Denunciar Iniciar sesión
Español ▼
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 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

Hay una API para todas las funciones de 0wx.eu. Puedes usarla para scripts o desde la consola.

Todo lo que hacen los formularios de este sitio, para scripts. Cada respuesta es JSON, incluidos los errores, así que nunca tienes que adivinar si un cuerpo es un resultado o una explicación.

Hacer una petición

Haz POST al endpoint con parámetros de formulario o con un cuerpo JSON. Son equivalentes; elige lo que te resulte más cómodo con tus herramientas. El parámetro action selecciona qué hacer. Usa --data-urlencode para todo lo que haya tecleado una persona — texto de un pegado, una URL, una traducción — porque -d envía el valor en bruto y se cortará en el primer &. Un -d normal basta para valores fijos como el propio action. wget no tiene --data-urlencode en absoluto, así que con wget codifica tú mismo esos valores con porcentajes o envía un cuerpo JSON, que no necesita codificación.

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
Valores que contienen &

En un cuerpo de formulario & separa parámetros, y curl -d no codifica lo que le das. Una URL con cadena de consulta se corta por tanto en su primer &, y el resto llega como parámetros sueltos. Usa --data-urlencode o envía JSON. Los parámetros extraviados se rechazan en lugar de ignorarse, así que esto falla de forma visible en lugar de guardar medio enlace.

# 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
Autenticación

Opcional. Sin clave, la petición es anónima y se comporta exactamente como un visitante anónimo — el resultado es público en cualquier caso, la única diferencia es si acaba en tu lista de archivos. Genera una clave en la página de tu cuenta y envíala como token bearer; pasarla como parámetro apikey también funciona, pero una clave en la cadena de consulta acaba en los registros del servidor y en el historial del navegador.

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
Acciones
actionParámetrosDescripción
whoami—Confirma que una clave funciona e informa de los límites actuales. No cuesta nada; llámala primero.
ip—Informa de tu dirección, su PTR, el país, la región y la ciudad en que se geolocaliza, las coordenadas y el user agent que enviaste. No necesita clave y responde igual con o sin ella. Deliberadamente más limitado que la página web: sin WHOIS, sin zona DNS y sin consultas a listas de bloqueo, así que llamarlo solo le cuesta al servidor una lectura de base de datos local.
uploadfile (repetible), resize, lifetime, gallery o g *Sube uno o más archivos. Debe ser multipart/form-data. Nombrar una galería los coloca directamente en ella y devuelve su id.
tinyurlurl, lifetimeAcorta una URL.
hugeurlurl, lifetimeAlarga una URL, de forma absurda, a propósito.
pastecontent, lifetimeGuarda un bloque de texto y devuelve un enlace a él.
translatecontent, to, fromTraduce texto. to y from son códigos de la acción langs — ten en cuenta que no siempre son códigos de país: el danés es da, no dk. from puede omitirse o darse como auto, que pide al backend que detecte el idioma; indicarlo da mejor resultado con textos cortos.
langsLista los idiomas que acepta translate, como supported_langs: un objeto por idioma, código a nombre, en el orden en que los ofrece el sitio. No necesita clave de API.
dyndnskey, ip, formatActualiza un nombre de DNS dinámico. La única acción que no necesita clave de API: la llama un router, que tiene un campo para una URL y ninguna forma de enviar una cabecera. key es la clave de actualización de cada nombre que se muestra en tu cuenta, no tu clave de API. Omite ip y se usará la dirección desde la que llamas. La respuesta es la palabra dyndns2 de facto — good, nochg, badauth, abuse o dnserr — como texto plano, porque es lo que los routers analizan; añade format=json para el JSON habitual.
listfiles *page, gLista tus archivos con todo lo que muestra el panel de información, más la miniatura y el enlace directo. g lo limita a una galería, o none a los archivos sin galería.
listpastes *pageLista tus pegados, con una vista previa de 200 caracteres de cada uno en lugar del cuerpo completo.
listurls *pageLista tus URL cortas y enormes, con la dirección a la que apunta cada una.
otl *shareCrea un enlace de un solo uso a uno de tus archivos. Cada llamada genera uno nuevo, así que dar el mismo archivo a dos personas produce dos enlaces.
listotl *pageLista tus enlaces de un solo uso activos, el archivo al que apunta cada uno y si ese archivo ha caducado desde entonces.
listgalleries *—Lista tus galerías con sus id, nombres, número de archivos y estado de publicación.
gallery *g, publishInforma del estado de publicación de una galería y lo cambia cuando se indica publish.
move *share (repetible), gallery o gMueve archivos a una galería, por nombre (se crea si es nueva) o por id. Si se omiten ambos, vuelven a la lista principal.
delete *share (repetible), g, otl, withfilesBorra archivos, pegados, URL cortas, galerías, enlaces de un solo uso o cualquier mezcla. Un share se compara primero con tus archivos y luego con tus pegados y enlaces, así que quien llama no tiene que clasificarlos por tipo. Los enlaces de un solo uso van aparte en otl: quitar un enlace no debe confundirse con borrar el archivo al que apunta.

* Estas acciones necesitan una clave de API. Leen o cambian los datos de una cuenta, así que no tienen forma anónima.

Varios a la vez

share y g aceptan un campo repetido, un array JSON o una lista separada por comas — lo que te resulte más fácil con tus herramientas. Los duplicados se ignoran.

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
Galerías

Dondequiera que se nombre una galería — en upload o en move — se indica de las mismas dos maneras: g para un id existente, o gallery para un nombre, que se crea si es nuevo. Si se envían ambos, gana g. La respuesta lleva el id de la galería. Ten en cuenta que borrar una galería solo elimina la galería y deja sus archivos en la lista principal — a diferencia del formulario web, que los borra tras preguntar. Pasa withfiles=true para borrarlos también: un script que ordena sus agrupaciones no debería perder las subidas por accidente.

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
Subir archivos

Las subidas no pueden usar el cuerpo JSON, porque un archivo tiene que enviarse como multipart. Repite la parte file para enviar varios a la vez. Cada archivo se informa por separado: la respuesta lleva una lista files con los aceptados y una lista rejected con los que no, así que un éxito parcial sigue siendo un éxito.

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

No hay forma con wget para esto. wget no puede construir un cuerpo multipart/form-data — no tiene equivalente al -F de curl — y las subidas deben ser multipart. Usa curl, o monta tú mismo el cuerpo y el boundary y envíalo con --post-file.

Duración

Opcional en toda acción que guarde algo. Acepta segundos a secas, o un número seguido de m, h o d — las mismas formas que admiten los formularios web. Omítelo o pasa 0 para conservar el elemento indefinidamente.

Respuestas

Cada respuesta es un objeto JSON con un campo ok. Si tiene éxito lleva el resultado; si falla lleva un código error estable y un message legible. Ramifica por el código, registra el mensaje.

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

Cuando un archivo las lleva, listfiles añade file_tags a su entrada: artista, título y álbum, leídos de ID3, comentarios Vorbis o átomos MP4 al subir el archivo. La clave está ausente en lugar de ser null cuando no hay nada que informar, que es la mayoría de los archivos, así que compruébala antes de leerla. También pueden faltar campos individuales — un archivo puede tener título y no álbum. No se expone nada más de los metadatos del archivo: una compra de iTunes registra el nombre y el Apple ID del comprador, y esos nunca se leen, a propósito.

{"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"}
]}
Códigos de error
errorHTTPDescripción
unknown_action400No existe esa acción.
bad_json400El cuerpo no era JSON válido, o un campo contenía una estructura anidada.
unexpected_parameter400Llegó un parámetro que esta acción no admite — normalmente un & sin codificar en un valor. El mensaje nombra los parámetros.
bad_key401No se reconoció la clave. Una clave incorrecta se rechaza en lugar de tratarse silenciosamente como anónima.
bad_url400La URL está mal formada o usa un esquema distinto de http(s), ftp o gopher.
bad_lifetime400La duración no era un número ni un número seguido de m, h o d.
no_content400No se envió nada que guardar.
url_too_long413La URL supera el límite de longitud.
paste_too_long413El texto supera el límite de pegado. Los límites se miden en bytes UTF-8, así que el texto no latino cuenta más de lo que sugiere su número de caracteres.
too_many_files413Más archivos de los que acepta una sola llamada.
no_usable_files415Se rechazaron todos los archivos. Consulta la lista rejected para saber por qué.
backend_unavailable502El backend de traducción no respondió.
internal500Algo falló inesperadamente. Se ha registrado.
Límites

Llama a whoami para leer los valores actuales en lugar de fijarlos en el código — los establece el operador del servidor y pueden cambiar. Los tamaños son bytes UTF-8.

Un cliente de shell

0wx.sh envuelve todo lo anterior. Es shell POSIX puro, no necesita nada más que curl y es lo bastante corto como para leerlo antes de ejecutarlo — que es lo correcto con un script que va a guardar tu clave de API. Pon la clave en OWX_KEY en lugar de pasar --key, y quedará fuera del historial de tu 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 cliente en Python

0wx.py hace lo mismo que el cliente de shell, pero analiza la respuesta e imprime lo que significan los campos en lugar de darte JSON en bruto — añade --json cuando quieras la forma en bruto. Solo biblioteca estándar: sin requests, nada que instalar. Si escribes tu propio cliente, sus funciones send() y report() son las partes que merece la pena leer: entre ambas muestran cómo construir la petición, cómo sacar el mensaje de una fallida y qué contienen las respuestas.

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 cliente en Perl

0wx.pl hace lo mismo que el de Python e imprime la misma salida. Solo módulos del núcleo — HTTP::Tiny y JSON::PP vienen con Perl desde 5.14, así que no hay nada que instalar. Merece la pena leerlo junto al cliente de Python si escribes el tuyo: los dos lenguajes fallan de forma distinta ante una petición rota, y ambos scripts dicen dónde.

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

0wx.ps1 es el equivalente del cliente de Python para Windows: los mismos comandos, la misma salida, y analiza la respuesta en lugar de darte JSON en bruto — añade --json para eso. Está escrito para la Windows PowerShell que ya viene en la máquina, así que no hay nada que instalar, y funciona sin cambios en PowerShell 7. Puede que necesites Set-ExecutionPolicy -Scope Process Bypass en la ventana desde la que lo ejecutes, que es Windows preguntando si de verdad quieres ejecutar un script descargado — una pregunta razonable, y el archivo es lo bastante corto como para leerlo antes.

$env:OWX_KEY = 'YOUR_KEY'
.\0wx.ps1 listfiles
.\0wx.ps1 paste --content 'hello & world'
.\0wx.ps1 upload --file .\holiday.jpg --gallery 'Holiday 2026'
Una ventana en tu navegador

0wx.html es el mismo conjunto de pestañas que el cliente de escritorio, en tres archivos — una página, una hoja de estilos y un script — sin instalación, sin framework y sin cargar nada de ningún sitio que no sea este. Tres en lugar de uno porque la Content-Security-Policy del sitio prohíbe script y estilo en línea, lo que conviene mantener. Se pueden soltar archivos sobre él. Hay que abrirlo desde aquí y no guardarlo y abrirlo desde tu disco: la API no envía cabeceras cross-origin, así que a una copia local tu navegador le rechazaría cada petición antes de salir. La clave se guarda en memoria a menos que marques la casilla para recordarla.

https://0wx.eu/clients/0wx.html
Una ventana en Windows

0wx-gui.ps1 es el mismo conjunto de pestañas que el cliente de escritorio, dibujado con WinForms — lo que significa que no hay nada que instalar, porque ya forma parte de Windows. Ponlo en la misma carpeta que 0wx.ps1: la ventana toma prestado el manejo de peticiones de ese archivo en lugar de llevar una segunda copia, así que hacen falta los dos. Windows preguntará antes de ejecutar un script que no ha escrito él, lo cual es razonable; ambos archivos son lo bastante cortos como para leerlos antes de responder.

powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
Una ventana en Linux con GTK

0wx-gtk.pl es una pequeña ventana GTK con pestañas para subir, pegar, acortar y explorar tus archivos — como lista o como galería de miniaturas, filtrada por galería. Es el único cliente de aquí que necesita instalar algo — los enlaces GTK3 de Perl — lo que conviene saber junto a la ventana de Windows de arriba, que no necesita nada en absoluto. Todo lo demás que usa viene con Perl. La clave solo se guarda en memoria: cerrar la ventana la olvida, y definir OWX_KEY la rellena al arrancar. Muestre lo que muestre, la respuesta en bruto del servidor está a un clic bajo “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
Una app para Android

0wx-android.apk hace lo que hacen los demás clientes, desde el móvil: subir, pegar, acortar, traducir y explorar tus archivos como lista o galería. Compartir un archivo con ella desde cualquier otra app lo sube, y compartir texto lo guarda como pegado. No está en ninguna tienda de aplicaciones, así que tu dispositivo te pedirá permiso para instalarla — una pregunta que conviene tomarse en serio en general, y la razón por la que todo el código fuente está también aquí: ábrelo en Android Studio y compílalo tú mismo en lugar de fiarte del archivo. Compilar requiere JDK 21; el BUILDING.md incluido explica por qué.

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

Deliberadamente no hay acción de descarga remota. Haría que el servidor recuperase una URL elegida por quien llama, lo que es una superficie de falsificación de peticiones, y un script puede explotarlo mucho más que un formulario. Sube el archivo tú mismo.


(p) 2018 0wx.eu -/- Respaldado por Linux y GNU. ¡Vive libre o muere! (root@0wx.eu)