~0wx.eu~ :: אחסון קבצים וכלים שימושיים נוספים


העלאה TinyURL HugeURL Pastebin אודות דיווח כניסה
עברית
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 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

יש API לכל הפונקציות ב-0wx.eu. אפשר להשתמש בו לסקריפטים או לפקודות במסוף.

כל מה שהטפסים באתר הזה עושים, לסקריפטים. כל תשובה היא JSON, כולל שגיאות, כך שלעולם לא תצטרכו לנחש אם גוף הוא תוצאה או הסבר.

ביצוע בקשה

POST לנקודת הקצה עם פרמטרי טופס או עם גוף JSON. שניהם שקולים; בחרו במה שהכלים שלכם מקלים. הפרמטר action בוחר מה לעשות. השתמשו ב---data-urlencode לכל דבר שאדם הקליד — טקסט הדבקה, כתובת URL, תרגום — מפני ש--d שולח את הערך גולמי והוא ייחתך ב-& הראשון. -d רגיל מתאים לערכים קבועים כמו action עצמו. ל-wget אין --data-urlencode בכלל, אז עם wget או שתקודדו ערכים כאלה באחוזים בעצמכם או שתשלחו גוף JSON, שאינו זקוק לקידוד.

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
ערכים שמכילים &

בגוף טופס & מפריד בין פרמטרים, ו-curl -d אינו מקודד את מה שנותנים לו. כתובת URL עם מחרוזת שאילתה נחתכת לכן ב-& הראשון שלה, והשאר מגיע כפרמטרים נפרדים. השתמשו ב---data-urlencode, או שלחו JSON. פרמטרים תועים נדחים במקום להתעלם מהם, כך שזה נכשל בקול במקום לאחסן חצי קישור.

# 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
אימות

אופציונלי. ללא מפתח הבקשה אנונימית ומתנהגת בדיוק כמו מבקר אנונימי — התוצאה ציבורית בכל מקרה, ההבדל היחיד הוא אם היא נוחתת ברשימת הקבצים שלכם. צרו מפתח בדף החשבון ושלחו אותו כאסימון bearer; העברתו כפרמטר apikey עובדת גם כן, אבל מפתח במחרוזת שאילתה מגיע ליומני השרת ולהיסטוריית הדפדפן.

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
פעולות
actionפרמטריםתיאור
whoamiמאשר שמפתח עובד ומדווח על המגבלות הנוכחיות. לא עולה כלום; קראו לו קודם.
ipמדווח על הכתובת שלכם, ה-PTR שלה, המדינה, המחוז והעיר שאליהם היא ממופה, הקואורדינטות, וה-user agent ששלחתם. לא דורש מפתח ועונה אותו דבר עם או בלי. במכוון צר יותר מדף האתר: ללא WHOIS, ללא אזור DNS וללא בדיקות ברשימות חסימה, כך שקריאה אליו לא עולה לשרת דבר מלבד קריאה ממסד נתונים מקומי.
uploadfile (ניתן לחזרה), resize, lifetime, gallery או g *מעלה קובץ אחד או יותר. חייב להיות multipart/form-data. ציון שם גלריה מכניס אותם ישירות אליה ומחזיר את המזהה שלה.
tinyurlurl, lifetimeמקצר כתובת URL.
hugeurlurl, lifetimeמאריך כתובת URL, באופן אבסורדי, בכוונה.
pastecontent, lifetimeמאחסן בלוק טקסט ומחזיר קישור אליו.
translatecontent, to, fromמתרגם טקסט. to ו-from הם קודים מהפעולה langs — שימו לב שאלה לא תמיד קודי מדינות: דנית היא da, לא dk. אפשר להשמיט את from או לתת auto, שמבקש מהמנוע לזהות את השפה; ציונו נותן תוצאה טובה יותר בטקסט קצר.
langsמציג את השפות ש-translate מקבל, כ-supported_langs: אובייקט אחד לכל שפה, קוד לשם, בסדר שבו האתר מציע אותן. לא דורש מפתח API.
dyndnskey, ip, formatמעדכן שם DNS דינמי. הפעולה היחידה שאינה דורשת מפתח API: היא נקראת על ידי נתב, שיש לו שדה אחד לכתובת URL ואין לו דרך לשלוח כותרת. key הוא מפתח העדכון לכל שם שמוצג בחשבון שלכם, לא מפתח ה-API שלכם. השמיטו את ip והכתובת שממנה אתם קוראים תשמש. התשובה היא מילת dyndns2 המקובלת — good, nochg, badauth, abuse או dnserr — כטקסט רגיל, מפני שזה מה שנתבים מנתחים; הוסיפו format=json ל-JSON הרגיל.
listfiles *page, gמציג את הקבצים שלכם עם כל מה שחלונית המידע מציגה, בתוספת התמונה הממוזערת והקישור הישיר. g מגביל לגלריה אחת, או none לקבצים שאינם באף גלריה.
listpastes *pageמציג את ההדבקות שלכם, עם תצוגה מקדימה של 200 תווים לכל אחת במקום הגוף כולו.
listurls *pageמציג את כתובות ה-URL הקצרות והענקיות שלכם, עם הכתובת שאליה כל אחת מצביעה.
otl *shareיוצר קישור חד-פעמי לאחד מהקבצים שלכם. כל קריאה יוצרת קישור חדש, כך שמסירת אותו קובץ לשני אנשים נותנת שני קישורים.
listotl *pageמציג את הקישורים החד-פעמיים הפעילים שלכם, את הקובץ שאליו כל אחד מצביע, ואם תוקף הקובץ הזה פג מאז.
listgalleries *מציג את הגלריות שלכם עם המזהים, השמות, מספרי הקבצים ומצב הפרסום שלהן.
gallery *g, publishמדווח על מצב הפרסום של גלריה, ומשנה אותו כשניתן publish.
move *share (ניתן לחזרה), gallery או gמעביר קבצים לגלריה, לפי שם (נוצרת אם חדשה) או לפי מזהה. השמטת שניהם מעבירה אותם חזרה לרשימה הראשית.
delete *share (ניתן לחזרה), g, otl, withfilesמוחק קבצים, הדבקות, כתובות URL קצרות, גלריות, קישורים חד-פעמיים, או כל שילוב. שיתוף מותאם קודם מול הקבצים שלכם ואז מול ההדבקות והקישורים שלכם, כך שהקורא לא צריך למיין אותם לפי סוג. קישורים חד-פעמיים הולכים ב-otl, בנפרד: הסרת קישור לא אמורה להתבלבל עם מחיקת הקובץ שאליו הוא מצביע.

* הפעולות האלה דורשות מפתח API. הן קוראות או משנות נתונים של חשבון אחד, ולכן אין להן צורה אנונימית.

כמה בבת אחת

share ו-g מקבלים שדה חוזר, מערך JSON, או רשימה מופרדת בפסיקים — מה שהכלים שלכם מקלים. כפילויות מתעלמות.

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
גלריות

בכל מקום שבו גלריה מצוינת — ב-upload או ב-move — היא ניתנת באותן שתי דרכים: g למזהה קיים, או gallery לשם, שנוצר אם הוא חדש. אם שניהם נשלחים, g מנצח. התשובה נושאת את מזהה הגלריה. שימו לב שמחיקת גלריה מסירה רק את הגלריה, ומשאירה את הקבצים שלה ברשימה הראשית — בניגוד לטופס באתר, שמוחק אותם לאחר שאלה. העבירו withfiles=true כדי למחוק גם אותם: סקריפט שמסדר את הקיבוצים שלו לא אמור לאבד את ההעלאות בטעות.

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
העלאת קבצים

העלאות לא יכולות להשתמש בגוף JSON, מפני שקובץ חייב להישלח כ-multipart. חזרו על החלק file כדי לשלוח כמה בבת אחת. כל קובץ מדווח בנפרד: התשובה נושאת רשימת files של אלה שהתקבלו ורשימת rejected של אלה שלא, כך שהצלחה חלקית היא עדיין הצלחה.

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

אין צורת wget לזה. wget אינו יכול לבנות גוף multipart/form-data — אין לו מקבילה ל--F של curl — והעלאות חייבות להיות multipart. השתמשו ב-curl, או הרכיבו את הגוף וה-boundary בעצמכם ושלחו אותו עם --post-file.

משך חיים

אופציונלי בכל פעולה שמאחסנת משהו. מקבל שניות בלבד, או מספר ואחריו m, h או d — אותן צורות שהטפסים באתר מקבלים. השמיטו או העבירו 0 כדי לשמור את הפריט ללא הגבלת זמן.

תשובות

כל תשובה היא אובייקט JSON עם שדה ok. בהצלחה הוא נושא את התוצאה; בכישלון הוא נושא קוד error יציב ו-message קריא לבני אדם. הסתעפו לפי הקוד, רשמו את ההודעה ביומן.

{"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."}
תגי שמע

כשקובץ נושא אותם, 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.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"}
]}
קודי שגיאה
errorHTTPתיאור
unknown_action400אין פעולה כזאת.
bad_json400הגוף לא היה JSON תקין, או ששדה הכיל מבנה מקונן.
unexpected_parameter400הגיע פרמטר שהפעולה הזאת אינה מקבלת — בדרך כלל & לא מקודד בערך. ההודעה מציינת את הפרמטרים.
bad_key401המפתח לא זוהה. מפתח שגוי נדחה במקום להיחשב בשקט לאנונימי.
bad_url400כתובת ה-URL פגומה, או משתמשת בסכמה שאינה http(s), ftp או gopher.
bad_lifetime400משך החיים לא היה מספר או מספר ואחריו m, h או d.
no_content400לא נשלח דבר לאחסון.
url_too_long413כתובת ה-URL ארוכה מהמגבלה.
paste_too_long413הטקסט גדול ממגבלת ההדבקה. המגבלות נמדדות בבייטים של UTF-8, ולכן טקסט לא-לטיני נספר יותר ממה שמספר התווים שלו מרמז.
too_many_files413יותר קבצים ממה שקריאה אחת מקבלת.
no_usable_files415כל הקבצים נדחו. בדקו ברשימת rejected מדוע.
backend_unavailable502מנוע התרגום לא ענה.
internal500משהו נכשל באופן בלתי צפוי. הדבר נרשם ביומן.
מגבלות

קראו ל-whoami כדי לקרוא את הערכים הנוכחיים במקום לקבע אותם בקוד — הם נקבעים על ידי מפעיל השרת ויכולים להשתנות. גדלים הם בייטים של UTF-8.

לקוח shell

0wx.sh עוטף את כל האמור לעיל. זה POSIX shell פשוט שאינו זקוק לדבר מלבד curl, והוא קצר מספיק כדי לקרוא לפני שמריצים — וזה הדבר הנכון לעשות עם סקריפט שיחזיק את מפתח ה-API שלכם. שימו את המפתח ב-OWX_KEY במקום להעביר --key, והוא יישאר מחוץ להיסטוריית המעטפת שלכם.

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'
לקוח Python

0wx.py עושה את אותו הדבר כמו לקוח ה-shell, אבל מנתח את התשובה ומדפיס מה השדות אומרים במקום למסור לכם JSON גולמי — הוסיפו --json כשתרצו את הצורה הגולמית. ספרייה סטנדרטית בלבד: ללא requests, אין מה להתקין. אם אתם כותבים לקוח משלכם, הפונקציות send() ו-report() שלו הן החלקים ששווה לקרוא: יחד הן מראות איך לבנות את הבקשה, איך להוציא את ההודעה מבקשה שנכשלה, ומה התשובות מכילות.

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'
לקוח Perl

0wx.pl עושה את אותו הדבר כמו זה של Python ומדפיס את אותו הפלט. מודולי ליבה בלבד — HTTP::Tiny ו-JSON::PP מגיעים עם Perl מאז 5.14, כך שאין מה להתקין. שווה לקרוא לצד לקוח ה-Python אם אתם כותבים לקוח משלכם: שתי השפות נכשלות באופן שונה בבקשה שבורה, ושני הסקריפטים אומרים היכן.

wget https://0wx.eu/clients/0wx.pl
chmod +x 0wx.pl
export OWX_KEY=YOUR_KEY
./0wx.pl listfiles
לקוח PowerShell

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 הוא אותה קבוצת לשוניות כמו לקוח שולחן העבודה, כשלושה קבצים — דף, גיליון סגנון וסקריפט — ללא התקנה, ללא framework, ובלי לטעון דבר משום מקום מלבד האתר הזה. שלושה במקום אחד מפני ש-Content-Security-Policy של האתר אוסר על סקריפט וסגנון מוטבעים, מה ששווה לשמור. אפשר לגרור אליו קבצים. יש לפתוח אותו מכאן ולא לשמור ולפתוח מהדיסק שלכם: ה-API אינו שולח כותרות cross-origin, ולכן הדפדפן שלכם ידחה כל בקשה מעותק מקומי עוד לפני שתצא. המפתח נשמר בזיכרון אלא אם תסמנו את התיבה לזכור אותו.

https://0wx.eu/clients/0wx.html
חלון ב-Windows

0wx-gui.ps1 הוא אותה קבוצת לשוניות כמו לקוח שולחן העבודה, מצוירת עם WinForms — כלומר אין מה להתקין בכלל, מפני שזה כבר חלק מ-Windows. שימו אותו באותה תיקייה עם 0wx.ps1: החלון שואל את טיפול הבקשות של הקובץ ההוא במקום לשאת עותק שני, ולכן שניהם נדרשים. Windows ישאל לפני הרצת סקריפט שהוא לא כתב, וזו שאלה הוגנת; שני הקבצים קצרים מספיק כדי לקרוא לפני שעונים.

powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
חלון ב-Linux עם GTK

0wx-gtk.pl הוא חלון GTK קטן עם לשוניות להעלאה, הדבקה, קיצור ועיון בקבצים שלכם — כרשימה או כגלריה של תמונות ממוזערות, מסוננת לפי גלריה. זה הלקוח היחיד כאן שצריך משהו מותקן — כריכות GTK3 של Perl — מה ששווה לדעת לצד חלון ה-Windows למעלה, שאינו זקוק לדבר. כל השאר שהוא משתמש בו מגיע עם Perl. המפתח מוחזק בזיכרון בלבד: סגירת החלון שוכחת אותו, והגדרת OWX_KEY ממלאת אותו בהפעלה. מה שלא יציג לכם, התשובה הגולמית של השרת נמצאת במרחק לחיצה אחת תחת “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
אפליקציית Android

0wx-android.apk עושה את מה שהלקוחות האחרים עושים, מהטלפון: העלאה, הדבקה, קיצור, תרגום ועיון בקבצים שלכם כרשימה או כגלריה. שיתוף קובץ אליו מכל אפליקציה אחרת מעלה אותו, ושיתוף טקסט מאחסן אותו כהדבקה. הוא לא נמצא בשום חנות אפליקציות, ולכן המכשיר שלכם יבקש לאשר את ההתקנה — שאלה ששווה להתייחס אליה ברצינות באופן כללי, והסיבה שכל קוד המקור נמצא גם כאן: פתחו אותו ב-Android Studio ובנו אותו בעצמכם במקום לבטוח בקובץ. הבנייה דורשת JDK 21; BUILDING.md שבפנים מסביר מדוע.

https://0wx.eu/clients/0wx-android.apk        # install it
https://0wx.eu/clients/0wx-android.zip        # build it yourself
הערות

בכוונה אין פעולת הבאה מרחוק. היא הייתה גורמת לשרת להביא כתובת URL לפי בחירת הקורא, שהוא משטח תקיפה לזיוף בקשות, וסקריפט יכול לנצל את זה הרבה יותר מטופס. במקום זאת העלו את הקובץ בעצמכם.


(p) 2018 0wx.eu -/- מופעל על ידי Linux ו-GNU. Live free or die! (root@0wx.eu)