▼
English
Deutsch
Plattdüütsch
Lëtzebuergesch
Nederlands
Dansk
Svenska
Bokmål
Nynorsk
Íslenska
Føroyskt
Español
Català
Galego
Português
Français
Italiano
Latina
Română
Rumantsch
Gaeilge
Suomi
Magyar
Euskara
Esperanto
日本語
简体中文
繁體中文(台灣)
繁體中文(香港)
粵語
Tiếng Việt
ไทย
Bahasa Indonesia
Bahasa Melayu
हिन्दी
Ελληνικά
Polski
Čeština
Українська
Русский
Türkçe
العربية
עברית
Kiswahili
ʻŌlelo Hawaiʻi
tlhIngan Hol
Quenya
이 사이트의 양식이 하는 모든 일을 스크립트용으로 제공합니다. 오류를 포함해 모든 응답이 JSON이므로 본문이 결과인지 설명인지 짐작할 필요가 없습니다.
엔드포인트에 양식 매개변수나 JSON 본문으로 POST 합니다. 둘은 동등하니 쓰시는 도구에 편한 쪽을 고르십시오. action 매개변수가 할 일을 정합니다. 사람이 입력한 것 — 붙여넣기 텍스트, URL, 번역문 — 에는 --data-urlencode를 쓰십시오. -d는 값을 그대로 보내므로 첫 &에서 잘립니다. action 자체 같은 고정값에는 그냥 -d면 됩니다. wget에는 --data-urlencode가 아예 없으니, wget에서는 그런 값을 직접 퍼센트 인코딩하거나 인코딩이 필요 없는 JSON 본문을 보내십시오.
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
양식 본문에서 &는 매개변수를 구분하고, curl -d는 넘긴 값을 인코딩하지 않습니다. 따라서 쿼리 문자열이 있는 URL은 첫 &에서 잘리고 나머지는 별도 매개변수로 도착합니다. --data-urlencode를 쓰거나 JSON을 보내십시오. 엉뚱한 매개변수는 무시하지 않고 거부하므로, 링크가 반만 저장되는 대신 확실하게 실패합니다.
# 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
선택 사항입니다. 키가 없으면 요청은 익명이며 익명 방문자와 똑같이 동작합니다 — 결과는 어차피 공개이고, 차이는 회원님의 파일 목록에 들어가느냐뿐입니다. 계정 페이지에서 키를 만들어 bearer 토큰으로 보내십시오. apikey 매개변수로 넘겨도 되지만, 쿼리 문자열에 든 키는 서버 로그와 브라우저 기록에 남습니다.
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
| action | 매개변수 | 설명 |
|---|---|---|
whoami | — | 키가 동작하는지 확인하고 현재 한도를 알려 줍니다. 비용이 들지 않으니 먼저 호출하십시오. |
ip | — | 회원님의 주소, 그 PTR, 위치 추정 결과인 국가·지역·도시, 좌표, 보내신 user agent를 알려 줍니다. 키가 필요 없고 키가 있든 없든 같은 답을 합니다. 일부러 웹 페이지보다 좁게 만들었습니다. WHOIS도, DNS 존도, 차단 목록 조회도 없으므로 호출해도 서버 부담은 로컬 데이터베이스 읽기 한 번뿐입니다. |
upload | file (반복 가능), resize, lifetime, gallery 또는 g * | 파일을 하나 이상 올립니다. multipart/form-data여야 합니다. 갤러리를 지정하면 바로 그 안에 넣고 갤러리 id를 돌려줍니다. |
tinyurl | url, lifetime | URL을 줄입니다. |
hugeurl | url, lifetime | URL을 일부러 터무니없이 길게 만듭니다. |
paste | content, lifetime | 텍스트 블록을 저장하고 그 링크를 돌려줍니다. |
translate | content, to, from | 텍스트를 번역합니다. to와 from은 langs 동작이 돌려주는 코드입니다 — 항상 국가 코드는 아니라는 점에 유의하십시오. 덴마크어는 dk가 아니라 da입니다. from은 생략하거나 auto로 줄 수 있으며, 그러면 백엔드가 언어를 감지합니다. 짧은 텍스트에서는 지정하는 편이 결과가 더 좋습니다. |
langs | translate가 받는 언어를 supported_langs로 나열합니다. 언어마다 객체 하나로 코드와 이름을, 사이트가 제공하는 순서대로 돌려줍니다. API 키가 필요 없습니다. | |
dyndns | key, ip, format | 동적 DNS 이름을 갱신합니다. API 키가 필요 없는 유일한 동작입니다. 공유기가 호출하는데, 공유기에는 URL 칸 하나뿐이고 헤더를 보낼 방법이 없기 때문입니다. key는 계정에 표시되는 이름별 갱신 키이지 API 키가 아닙니다. ip를 생략하면 호출한 주소가 쓰입니다. 응답은 사실상 표준인 dyndns2 단어 — good, nochg, badauth, abuse, dnserr — 를 일반 텍스트로 돌려줍니다. 공유기가 해석하는 것이 그것이기 때문입니다. 평소의 JSON을 원하시면 format=json을 붙이십시오. |
listfiles * | page, g | 정보 패널에 보이는 모든 것에 섬네일과 직접 링크를 더해 파일을 나열합니다. g로 갤러리 하나로, none으로 어느 갤러리에도 없는 파일로 좁힙니다. |
listpastes * | page | 텍스트를 나열합니다. 본문 전체 대신 각각 200자 미리보기를 붙입니다. |
listurls * | page | 짧은 URL과 거대 URL을 각각이 가리키는 주소와 함께 나열합니다. |
otl * | share | 회원님의 파일 하나에 일회용 링크를 만듭니다. 호출할 때마다 새 링크가 발급되므로 같은 파일을 두 사람에게 주면 링크가 두 개가 됩니다. |
listotl * | page | 활성 일회용 링크를, 각각이 가리키는 파일과 그 파일이 그 뒤로 만료되었는지와 함께 나열합니다. |
listgalleries * | — | 갤러리를 id, 이름, 파일 수, 공개 상태와 함께 나열합니다. |
gallery * | g, publish | 갤러리의 공개 상태를 알려 주고, publish가 주어지면 바꿉니다. |
move * | share (반복 가능), gallery 또는 g | 파일을 갤러리로 옮깁니다. 이름(새 이름이면 생성) 또는 id로 지정합니다. 둘 다 생략하면 기본 목록으로 되돌립니다. |
delete * | share (반복 가능), g, otl, withfiles | 파일, 텍스트, 짧은 URL, 갤러리, 일회용 링크 또는 이들의 조합을 지웁니다. share는 먼저 파일과, 그다음 텍스트와 링크와 대조하므로 호출자가 종류별로 나눌 필요가 없습니다. 일회용 링크는 otl에 따로 넣습니다. 링크를 지우는 일이 그 링크가 가리키는 파일을 지우는 일과 헷갈려서는 안 되기 때문입니다. |
* 이 동작들은 API 키가 필요합니다. 한 계정의 데이터를 읽거나 바꾸는 것이므로 익명 형태가 없습니다.
share와 g는 반복 필드, JSON 배열, 쉼표로 구분한 목록을 모두 받습니다 — 쓰시는 도구에 가장 편한 것을 고르십시오. 중복은 무시됩니다.
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
갤러리를 지정하는 곳 — upload든 move든 — 어디서나 같은 두 방식으로 지정합니다. 기존 id는 g, 이름은 gallery이며 새 이름이면 생성됩니다. 둘 다 보내면 g가 우선합니다. 응답에 갤러리 id가 담깁니다. 갤러리를 지우면 갤러리만 없어지고 파일은 기본 목록에 남는다는 점에 유의하십시오 — 확인 후 파일까지 지우는 웹 양식과는 다릅니다. 파일도 지우려면 withfiles=true를 넘기십시오. 묶음을 정리하는 스크립트가 실수로 업로드를 잃어서는 안 되기 때문입니다.
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
업로드는 JSON 본문을 쓸 수 없습니다. 파일은 multipart로 보내야 하기 때문입니다. 여러 개를 한 번에 보내려면 file 부분을 반복하십시오. 파일마다 따로 보고됩니다. 응답에는 받아들인 파일의 files 목록과 거부한 파일의 rejected 목록이 있으므로 일부만 성공해도 성공입니다.
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
이 동작에는 wget 형태가 없습니다. wget은 multipart/form-data 본문을 만들 수 없고 — curl의 -F에 해당하는 것이 없습니다 — 업로드는 multipart여야 하기 때문입니다. curl을 쓰거나, 본문과 경계를 직접 조립해 --post-file로 보내십시오.
무언가를 저장하는 모든 동작에서 선택 사항입니다. 초 단위 숫자만 쓰거나, 숫자 뒤에 m, h, d를 붙입니다 — 웹 양식과 같은 형식입니다. 생략하거나 0을 넘기면 무기한 보관합니다.
모든 응답은 ok 필드가 있는 JSON 객체입니다. 성공하면 결과를, 실패하면 고정된 error 코드와 사람이 읽을 수 있는 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."}
파일에 태그가 있으면 listfiles가 항목에 file_tags를 더합니다. 아티스트, 제목, 앨범이며, 업로드할 때 ID3, Vorbis 주석, MP4 아톰에서 읽습니다. 알릴 것이 없으면 — 대부분의 파일이 그렇습니다 — 키는 null이 아니라 없으므로 읽기 전에 있는지 확인하십시오. 개별 필드도 빠질 수 있습니다 — 제목은 있고 앨범은 없을 수 있습니다. 파일 메타데이터의 다른 것은 아무것도 드러내지 않습니다. iTunes 구매 파일에는 구매자의 이름과 Apple ID가 기록되는데, 이는 일부러 절대 읽지 않습니다.
{"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"}
]}
| error | HTTP | 설명 |
|---|---|---|
unknown_action | 400 | 그런 동작은 없습니다. |
bad_json | 400 | 본문이 올바른 JSON이 아니거나, 어떤 필드에 중첩된 구조가 들어 있습니다. |
unexpected_parameter | 400 | 이 동작이 받지 않는 매개변수가 왔습니다 — 보통 값 안에 인코딩되지 않은 &가 있는 경우입니다. 메시지에 매개변수 이름이 나옵니다. |
bad_key | 401 | 키를 인식하지 못했습니다. 잘못된 키는 조용히 익명으로 처리하지 않고 거부합니다. |
bad_url | 400 | URL 형식이 잘못되었거나 http(s), ftp, gopher 이외의 스킴을 사용합니다. |
bad_lifetime | 400 | 보관 기간이 숫자이거나 숫자 뒤에 m, h, d가 붙은 형식이 아닙니다. |
no_content | 400 | 저장할 내용이 전송되지 않았습니다. |
url_too_long | 413 | URL이 한도보다 깁니다. |
paste_too_long | 413 | 텍스트가 붙여넣기 한도보다 큽니다. 한도는 UTF-8 바이트로 재므로 비라틴 문자 텍스트는 글자 수보다 더 많이 계산됩니다. |
too_many_files | 413 | 한 번의 호출이 받는 것보다 파일이 많습니다. |
no_usable_files | 415 | 모든 파일이 거부되었습니다. 이유는 rejected 목록을 확인하십시오. |
backend_unavailable | 502 | 번역 백엔드가 응답하지 않았습니다. |
internal | 500 | 예기치 않게 실패했습니다. 기록해 두었습니다. |
현재 값은 하드코딩하지 말고 whoami를 호출해 읽으십시오 — 서버 운영자가 정하는 값이며 바뀔 수 있습니다. 크기는 UTF-8 바이트입니다.
0wx.sh는 위의 모든 것을 감쌉니다. 순수 POSIX 셸이라 curl 외에는 아무것도 필요 없고, 실행 전에 읽어 볼 수 있을 만큼 짧습니다 — API 키를 맡길 스크립트라면 그렇게 하는 것이 맞습니다. 키는 --key로 넘기지 말고 OWX_KEY에 두십시오. 그러면 셸 기록에 남지 않습니다.
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'
0wx.py는 셸 클라이언트와 같은 일을 하지만, 날것의 JSON을 건네는 대신 응답을 해석해 각 필드의 뜻을 출력합니다 — 날것을 원하시면 --json을 붙이십시오. 표준 라이브러리만 씁니다. requests도 없고 설치할 것도 없습니다. 직접 클라이언트를 쓰신다면 send()와 report() 함수가 읽어 볼 만한 부분입니다. 둘을 합치면 요청을 어떻게 만드는지, 실패한 요청에서 메시지를 어떻게 꺼내는지, 응답에 무엇이 들어 있는지 알 수 있습니다.
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'
0wx.pl은 Python 것과 같은 일을 하고 같은 출력을 냅니다. 핵심 모듈만 씁니다 — HTTP::Tiny와 JSON::PP는 5.14부터 Perl에 들어 있으므로 설치할 것이 없습니다. 직접 쓰신다면 Python 클라이언트와 나란히 읽어 볼 만합니다. 두 언어는 깨진 요청에서 다르게 실패하며, 두 스크립트 모두 어디서 그런지 알려 줍니다.
wget https://0wx.cat/clients/0wx.pl chmod +x 0wx.pl export OWX_KEY=YOUR_KEY ./0wx.pl listfiles
0wx.ps1은 Python 클라이언트의 Windows 판입니다. 같은 명령, 같은 출력이며 날것의 JSON을 건네는 대신 응답을 해석합니다 — 날것은 --json을 붙이십시오. 기기에 이미 있는 Windows PowerShell용으로 쓰여 설치할 것이 없고, PowerShell 7에서도 그대로 동작합니다. 실행하는 창에서 Set-ExecutionPolicy -Scope Process Bypass가 필요할 수 있습니다. 내려받은 스크립트를 정말 실행할 것인지 Windows가 묻는 것입니다 — 타당한 질문이며, 파일은 먼저 읽어 볼 수 있을 만큼 짧습니다.
$env:OWX_KEY = 'YOUR_KEY' .\0wx.ps1 listfiles .\0wx.ps1 paste --content 'hello & world' .\0wx.ps1 upload --file .\holiday.jpg --gallery 'Holiday 2026'
0wx.html은 데스크톱 클라이언트와 같은 탭 구성을 파일 세 개 — 페이지, 스타일시트, 스크립트 — 로 만든 것으로, 설치도 프레임워크도 없고 이 사이트 외에는 아무것도 불러오지 않습니다. 하나가 아니라 셋인 이유는 사이트의 Content-Security-Policy가 인라인 스크립트와 스타일을 금지하기 때문이며, 이는 지킬 만한 가치가 있습니다. 파일을 끌어다 놓을 수 있습니다. 저장해서 디스크에서 여는 대신 여기서 열어야 합니다. API가 cross-origin 헤더를 보내지 않으므로 로컬 사본은 모든 요청이 나가기도 전에 브라우저에서 거부되기 때문입니다. 기억하기 상자를 체크하지 않는 한 키는 메모리에만 있습니다.
https://0wx.cat/clients/0wx.html
0wx-gui.ps1은 데스크톱 클라이언트와 같은 탭 구성을 WinForms로 그린 것입니다 — 이미 Windows의 일부이므로 설치할 것이 전혀 없다는 뜻입니다. 0wx.ps1과 같은 폴더에 두십시오. 창은 사본을 따로 갖지 않고 그 파일의 요청 처리를 빌려 쓰므로 둘 다 필요합니다. Windows는 자기가 쓰지 않은 스크립트를 실행하기 전에 묻는데, 타당한 질문입니다. 두 파일 모두 답하기 전에 읽어 볼 수 있을 만큼 짧습니다.
powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
0wx-gtk.pl은 업로드, 붙여넣기, 줄이기, 파일 둘러보기 탭이 있는 작은 GTK 창입니다 — 목록이나 섬네일 갤러리로 보고 갤러리별로 거를 수 있습니다. 여기 있는 클라이언트 중 유일하게 설치가 필요한 것이 있는데 — Perl의 GTK3 바인딩입니다 — 아무것도 필요 없는 위의 Windows 창과 견주어 알아 둘 만합니다. 그 밖에 쓰는 것은 모두 Perl에 들어 있습니다. 키는 메모리에만 있습니다. 창을 닫으면 잊고, OWX_KEY를 설정하면 시작할 때 채워집니다. 무엇을 보여 주든 서버의 날것 응답은 “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
0wx-android.apk는 다른 클라이언트가 하는 일을 휴대전화에서 합니다. 업로드, 붙여넣기, 줄이기, 번역, 그리고 목록이나 갤러리로 파일 둘러보기입니다. 다른 앱에서 파일을 공유하면 올라가고, 텍스트를 공유하면 텍스트로 저장됩니다. 어느 앱 스토어에도 없으므로 기기가 설치를 허용할지 묻습니다 — 일반적으로 진지하게 받아들여야 할 질문이며, 전체 소스를 여기에도 둔 이유입니다. 파일을 믿는 대신 Android Studio에서 열어 직접 빌드하십시오. 빌드에는 JDK 21이 필요하며, 그 이유는 안에 든 BUILDING.md에 있습니다.
https://0wx.cat/clients/0wx-android.apk # install it https://0wx.cat/clients/0wx-android.zip # build it yourself
원격 가져오기 동작은 일부러 두지 않았습니다. 호출자가 고른 URL을 서버가 가져오게 되어 요청 위조의 공격면이 되며, 스크립트는 양식보다 훨씬 세게 두드릴 수 있기 때문입니다. 대신 파일을 직접 올리십시오.