2026 旅遊照片自動化實測:Python + Claude Vision 把命名時間從 20 分縮到 2 分|我的 AI 工作流
27 張旅遊照片手動改名要 20 分鐘,改用 Python 加 Claude Vision 實測 2 分鐘跑完。五支腳本完整拆解:看圖自動命名、WebP 壓縮、EXIF 轉正、整批上傳 Ghost,附四張實作截圖與費用試算。
更新時間:2026.09.12(改版:補 TL;DR 摘要框、重寫目錄 anchor、指令鏈對回腳本、覆核 API 定價)
旅行回來最想做的是寫遊記,最不想做的是整理照片。
從相機或手機倒出來的那一刻,資料夾裡躺著一堆 IMG_4020.JPG、473015497_10161369894758207_....jpg,每一張都要點開來看才知道是高山老街還是白川鄉合掌村。27 張照片一張一張改名、一張一張壓縮、再一張一張拖進圖床,扎扎實實 20 分鐘就沒了,而且改到第 15 張開始眼花,編號還會跳號。
後來把這件事整包交給 Python 腳本,中間只讓 AI 做一件事:看圖,然後說出這是什麼。同一批 27 張,2 分鐘跑完,檔名整齊到可以直接拿去當 alt text 的骨架。
這篇把整條流程拆開講,包含五支腳本各自負責什麼、AI 在哪一步介入、100 張照片大概要花多少錢,還有幾個實際踩過的雷。
💡 快速摘要(TL;DR|2026.04 實測)
- 這是什麼工具:五支 Python 腳本(量尺寸、看圖改名、壓縮轉正、上傳、舊版對照表)串成一條旅遊照片產線,只有改名那步接 Claude Vision 辨識內容。
- 怎麼用:把原始照片丟進資料夾,依序跑
check_image_sizes.py→vision_rename.py→optimize_photos.py→ghost_upload.py,最後拿到一張upload-result.csv。 - 省下的時間:高山 27 張命名從手動 20 分鐘縮到約 2 分鐘,白川鄉 16 張約 1.5 分鐘,兩批都是全數成功。
- 花多少:只有改名那步呼叫 API,100 張約 30 萬 input token,依腳本預設模型換算約 1.5 美元(2026.09.12 查 Anthropic 官方定價)。
✍️ 真人實測宣告
本文根據作者 2026 年 4 月實際跑過的兩批旅遊照片(2025 年 1 月拍的高山 27 張與白川鄉 16 張)與腳本輸出畫面撰寫,時間、壓縮率與成功率皆為真實執行紀錄。
📖 本篇目錄
- 🎯 先講結論:20 分鐘變 2 分鐘,數字拆給你看
- 🛄 把照片當行李托運:這條產線在做什麼
- 👥 五個角色,各自只做一件事
- 🛠️ 工具總覽:五支腳本各做什麼
- 🔧 六個步驟,實際怎麼跑
- 1️⃣ 量尺寸:先知道直的橫的各幾張
- 2️⃣ 看圖改名:唯一讓 AI 出手的一步
- 3️⃣ 壓縮轉檔:WebP 縮掉約九成
- 4️⃣ 整批上傳:每張換一個永久網址
- 5️⃣ 拿清單:upload-result.csv
- 6️⃣ 丟給 Claude 排版:CSV 變 Ghost 區塊
- ❓ 三個最常見的誤會
- ⚠️ 開始前要知道的邊界
- 💡 結語:把判斷留給自己,重複的交出去
🎯 先講結論:20 分鐘變 2 分鐘,數字拆給你看
同一批 2025 年 1 月拍的高山與白川鄉照片,兩種做法的差別:
| 項目 | 手動整理 | 這條產線 |
|---|---|---|
| 命名 27 張 | 約 20 分鐘(要逐張開圖確認) | 約 2 分鐘(腳本跑完就好) |
| 上傳 27 張 | 約 8 到 10 分鐘(一張張拖、一個個複製網址) | 併在同一條指令裡,不另外計時 |
| 壓縮容量 | 通常懶得做 | 高山那批縮 88.8%、白川鄉那批縮 92.4% |
| 直拍照片方向 | 上傳後才發現躺著,回頭重轉 | 壓縮時順手轉正 |
| 產出 | 一堆檔名 | 一張 upload-result.csv,貼給 AI 就能排版 |
| 成本 | 0 元,但花的是你的眼睛 | 100 張約 1.5 美元 |
以上為 2026.04 高山(27 張)與白川鄉(16 張)兩批照片的實跑結果,成功率分別是 27/27 與 16/16。 這是實際跑出來的數字,不是保證值;照片內容越明確(建築、招牌、地標)辨識越穩,糊掉的夜景或高度相似的連拍還是會取到接近的名字,需要自己再掃一眼。
費用那格是換算值:一張照片送進 Vision 前會先縮到寬 1200,大約算 2,500 到 3,000 個 input token,100 張約 30 萬 token;腳本 CONFIG 預設的 Claude Opus 4.8 輸入價是每百萬 token 5 美元(2026.09.12 查 Anthropic 官網),換算約 1.5 美元。想壓成本就把 CONFIG["model"] 換成 Haiku 4.5(每百萬 token 1 美元,同樣 100 張約 0.3 美元)。定價與模型都會調整,實際以官網為準。
🛄 把照片當行李托運:這條產線在做什麼
整理旅遊照片這件事,本質上很像在機場托運行李。
以前的做法是自己站在櫃檯前,把每一件行李拿起來看一眼,手寫一張行李條貼上去,再自己搬去輸送帶。27 件行李就是 27 次「看一眼、寫一張、貼上去」。
現在的做法是請一位 Python 地勤代勞。地勤自己不會看圖(程式只看得到檔案大小和像素),所以他身邊配了一雙會看圖的眼睛(Claude Vision):地勤把行李舉起來問一句「這是什麼」,眼睛回答「高山老街」,地勤就把標籤寫好、另外複製一份貼上去,接著打包(壓縮成 WebP)、送進倉庫(Ghost 圖床),最後把整批行李的清單列印給你(upload-result.csv)。
關鍵在於:眼睛只在貼標籤這一步出現,而且一張照片只問一次。 其他量尺寸、壓縮、上傳、排版全是程式在做,不花 AI 的錢,也不會有「AI 改壞我的照片」這種事發生。
👥 五個角色,各自只做一件事
| 角色 | 身分比喻 | 負責什麼 | 不負責什麼 |
|---|---|---|---|
| 原始照片 | 貼著亂碼標籤的行李 | 被處理的對象 | 全程不會被改動,連檔名都不會 |
| Python 地勤 | 櫃檯地勤(五支腳本) | 量尺寸、改名、壓縮、上傳 | 看不懂照片內容 |
| Claude Vision | 會看圖的眼睛 | 說出照片裡是什麼 | 不修圖、不改檔案、不排版 |
| Ghost 圖床 | 行李倉庫 | 保管照片,每張換一個永久網址 | 不幫你命名 |
| Claude 寫手 | 拿清單的排版員 | 把 CSV 變成 Ghost HTML 區塊 | 沒看過照片本人 |
流程串起來是這樣:
output/ 裡就地換檔,中繼的 .jpg 會被清掉,原始照片在上一層不受影響。值得注意的是最後一棒:Claude 寫手拿到的只是一張 CSV(檔名加網址),它沒看過照片本人。所以第 2 步取的名字準不準,會一路影響到文章排版的品質,這也是為什麼那一步要先跑 --dry-run。
🛠️ 工具總覽:五支腳本各做什麼
| 腳本 | 功能 | 版本 | 花錢嗎 |
|---|---|---|---|
check_image_sizes.py | 列出每張照片的寬高、比例與直橫方向,幫忙決定哪幾張可以並排 | v1.1.0 | 否 |
vision_rename.py | Claude Vision 看圖辨識,複製到 output/ 並套上新檔名 | v1.0.0 | 是 |
optimize_photos.py | 壓縮轉 WebP,同時修正 EXIF 旋轉 | v1.1.0 | 否 |
ghost_upload.py | 批次上傳 Ghost,產出網址清單 | v1.6.0 | 否 |
rename_photos.py | 舊版流程,靠手寫對照表改名(v2 之後用不到,保留備查) | v1 | 否 |
五支裡真正天天在用的是前四支。rename_photos.py 是 v1 時代的做法:自己維護一張 RENAME_MAP 對照表,把檔案編號對到語意化檔名。
RENAME_MAP = {
"506485499": "202506-towada-museum-exterior-01",
"507540773": "202506-towada-museum-exterior-02",
"506490633": "202506-towada-museum-exhibit-01",
}
能用,但每篇文章都要重建一次表,等於把「看圖判斷」這件苦工原封不動留給自己,只是換個地方做。v2 把這一步交給 Vision 之後,對照表就退休了。
🔧 六個步驟,實際怎麼跑
先把環境裝好,這兩件事只做一次:
pip install anthropic Pillow requests
set ANTHROPIC_API_KEY=sk-ant-xxx
(Windows 用 set,macOS 與 Linux 用 export。上傳那步另外需要 Ghost Admin API Key,見〈開始前要知道的邊界〉。)
以下指令都假設原始照片放在 ./photos,換成你自己的資料夾路徑即可。
1️⃣ 量尺寸:先知道直的橫的各幾張
python check_image_sizes.py ".\photos"
這支腳本只做一件事:掃過資料夾,列出每張照片的寬高、比例(高除以寬)與直橫方向。
為什麼要先跑這一步?因為手機直拍的照片在排版時很吃版面,一整排三張直式照會把文章拉得很長;先知道手上有幾張直的、幾張橫的,後面決定哪幾張並排、哪幾張單張置中會快很多。這步不花任何 API 費用。
順帶一提,畫面最上面那兩張 202501-takayama-beef-02.webp 和 202501-takayama-street-02.webp 是前一輪已經處理過的成品,副檔名已經是 .webp。記住這件事,第 3 步的數字會用到。
2️⃣ 看圖改名:唯一讓 AI 出手的一步
python vision_rename.py ".\photos" --prefix 202501-takayama --dry-run
確認結果沒問題之後,把 --dry-run 拿掉正式執行:
python vision_rename.py ".\photos" --prefix 202501-takayama
這是整條產線唯一呼叫 AI 的地方。腳本把每張照片送給 Claude Vision,問「這張是什麼」,拿回一段 2 到 4 個英文單字的描述,再組成檔名。
命名格式固定是 「年月-城市-內容-編號」:
| 原始檔名 | AI 辨識 slug | 輸出檔名 |
|---|---|---|
IMG_3981.JPG | wagyu-yakiniku-platter | 202501-takayama-wagyu-yakiniku-platter-1.jpg |
IMG_4020.JPG | takayama-old-street | 202501-takayama-takayama-old-street-1.jpg |
IMG_4046.JPG | sake-vending-machine-interior | 202501-takayama-sake-vending-machine-interior-1.jpg |
熟成飛騨牛焼肉GYU-SUKE.JPG | gyusuke-yakiniku-entrance | 202501-takayama-gyusuke-yakiniku-entrance-1.jpg |
這裡有兩件事要講清楚。
第一,年月和城市是你自己指定的,AI 只填中間那一段。 --prefix 202501-takayama 這個參數就是年月加城市,AI 拿不到你的行程表,也不需要知道;它只負責看圖說出「這是和牛拼盤」。這個分工是整條產線最漂亮的地方:把 AI 一定做不好的事(猜日期、猜城市)留給人,把人做起來最煩的事(看 27 張圖想 27 個名字)交出去。少了 --prefix,跑出來的檔名會變成 wagyu-yakiniku-platter-1.jpg,年月城市全部消失。
第二,原檔完全不會被動到。 腳本是用複製的:所有新檔名的照片會寫進 .\photos\output\,原資料夾裡的 IMG_3981.JPG 連檔名都不會改。同時它會在原資料夾產出一張 rename_log.csv 對照表(不是在 output 裡),方便事後回查哪張變成哪張。
這個命名格式不是隨便挑的。年月放最前面,資料夾排序自動照時間排;城市當第二段,之後要找「白川鄉那批」直接搜關鍵字;內容在中間,寫 alt text 時可以直接改寫;編號墊底,避免同場景連拍撞名。
一定要先加 --dry-run。 加了之後腳本只會把「舊檔名 → 新檔名」印出來給你看,不會真的複製任何檔案。掃過一遍確認沒有離譜的辨識,再拿掉 --dry-run 正式執行。這 30 秒的檢查,比事後發現 27 張名字全歪了要值得。
上面那張表裡的 202501-takayama-takayama-old-street-1.jpg 就是要在這關抓掉的:AI 自己也說了「takayama」,跟 prefix 的城市名撞在一起變成疊字。不影響功能,但看起來很蠢,dry-run 時順手改掉最省事。
3️⃣ 壓縮轉檔:WebP 縮掉約九成
python optimize_photos.py ".\photos\output"
注意路徑:這步跑的是上一步產出的 output 資料夾,不是原始照片資料夾。跑錯的話你會壓縮到一批沒改名的原圖。
為什麼畫面上是 25 張和 15 張,不是 27 張和 16 張? 因為腳本只處理 .jpg、.jpeg、.png,已經是 .webp 的檔案會直接跳過,避免二次壓縮把畫質磨掉。高山那批 27 張裡有 2 張在第 1 步就看到是 .webp(前一輪處理過的成品),跳過之後剩 25 張;白川鄉 16 張同理,跳過 1 張剩 15 張。辨識是 27 張和 16 張,壓縮是 25 張和 15 張,兩組數字都對,只是統計的對象不同。
除了壓縮,它還會順手做一件小事:把直拍照片轉正。手機直拍的照片其實是橫的,靠一個 EXIF 旋轉標記告訴看圖軟體「請轉 90 度」,很多圖床不吃這個標記,上傳後照片就躺著了。這支腳本直接把像素轉正、標記歸零,之後不管在哪看都是正的。
有一件事要先知道:轉完 WebP 之後,output 裡的中繼 .jpg 會被自動刪掉(腳本 CONFIG["delete_original"] 預設是 True),所以 output 裡最後只會留下 .webp。你的原始照片在上一層資料夾裡,一根寒毛都沒動到,所以這個刪除是安全的;真的想留著中繼檔,把那個設定改成 False 再重跑即可。
4️⃣ 整批上傳:每張換一個永久網址
python ghost_upload.py ".\photos\output"
把 output 裡的照片整批送上 Ghost 圖床,每一張換回一個永久網址。
這步取代的是「開後台 → 拖一張 → 等上傳 → 複製網址 → 貼進文件 → 回去拖下一張」這個循環。27 張手動大概要 8 到 10 分鐘,而且很容易貼錯順序。
5️⃣ 拿清單:upload-result.csv
上傳跑完,腳本會在同一個 output 資料夾裡產出三份清單:upload-result.csv、upload-result.json、upload-result.html。
平常用 CSV 那份就好,內容是「新檔名、原始檔名、Ghost 網址」這幾欄。HTML 那份可以直接開來預覽,確認每張圖都上對了。
這張 CSV 就是整條產線的交付物。照片本體已經在雲端了,接下來要用到的只有這張清單。
6️⃣ 丟給 Claude 排版:CSV 變 Ghost 區塊
最後一步回到對話視窗:把 upload-result.csv 整份貼給 Claude,請它依照片順序產出 Ghost 的圖片區塊 HTML(單圖或 gallery 並排都可以指定)。
因為檔名本身已經帶了「年月-城市-內容」,Claude 光看檔名就知道這張是老街、那張是和牛拼盤,alt text 有骨架可以寫,不需要再看圖一次。第 2 步把名字取好,回報在這裡。
第 1 步量的尺寸也在這裡派上用場:告訴 Claude 哪兩張比例接近、要並排成 gallery,哪幾張是直式、要單張置中,它就不會排出一整排高矮不一的圖。
❓ 三個最常見的誤會
誤會一:AI 會不會順便幫我修圖?
不會,而且刻意不讓它做。Claude Vision 在這條產線裡的職務只有一項:看圖,然後說出這是什麼。它不調亮度、不套濾鏡、不裁切,連檔案都碰不到(複製和改名都是 Python 做的)。修圖是另一件事,想做的話要另外開工具。
💡 延伸閱讀: 如果想找的是「請 AI 幫忙修掉照片裡的雜物」那種需求,可以參考另一篇實測:
👉 【問 AI 就對了!】合照被風吹亂的髮絲毀了?Gemini AI 照片修圖 3 步驟
誤會二:跑 AI 是不是很貴?
看圖辨識這種任務的單張成本很低。腳本送圖之前會先把大圖縮到寬 1200 再送,一張大約算 2,500 到 3,000 個 input token,100 張約 30 萬 token;用腳本預設的 Claude Opus 4.8(2026.09.12 查官網,輸入每百萬 token 5 美元)換算約 1.5 美元,換成 Haiku 4.5 約 0.3 美元。一趟旅行的照片整理成本,大概就是一杯手搖飲。而且整條產線只有第 2 步呼叫 API,量尺寸、壓縮、上傳都是本機運算,不計費。
誤會三:跑壞了我的原始照片怎麼辦?
原檔不會動。改名那步是把照片複製到 output/ 再套新檔名,原資料夾裡的原始檔連檔名都不會被碰;壓縮那步是在 output/ 裡面做,被刪掉的只有它自己產生的中繼 .jpg。最壞的情況是刪掉整個 output/ 重跑一次,原始照片一張都不會少。
⚠️ 開始前要知道的邊界
這套流程好用,但有幾個前提和已知限制,先講清楚比較不會卡住。
兩把金鑰,別漏了第二把。 vision_rename.py 要 ANTHROPIC_API_KEY(Anthropic API 需另外儲值,與 Claude 訂閱方案分開計費);ghost_upload.py 要 Ghost 的 Admin API Key,腳本是從同資料夾的 .env 讀 GHOST_ADMIN_API_KEY,沒設的話會直接報錯退出。
金鑰不要上公開 repo。 如果這些腳本有推到 GitHub,金鑰務必走環境變數或 .env(並且把 .env 寫進 .gitignore),不要直接寫死在程式碼裡。金鑰外洩是會被拿去刷帳單的。
路徑要跟著走。 第 1 步跑原始資料夾,第 3、4 步都要跑 output 那一層。這是照抄指令最容易出錯的地方,四行指令的路徑不是同一個。
同檔名重傳,Ghost 會自己加 -1。 同一批照片不小心跑了兩次上傳,Ghost 不會覆蓋舊檔,而是產生 xxx-1.webp 這種新檔案,於是圖床裡多一份重複的圖、CSV 裡的網址也跟文章裡已經貼好的不一樣。重跑前先確認一下。
AI 有時會把城市名講兩次。 像 202501-takayama-takayama-old-street-1.jpg 這種疊字,是因為 prefix 已經有城市、AI 自己又講了一次。--dry-run 那一關順手改掉就好。
成功率數字是實測不是保證。 27/27 與 16/16 是 2026.04 那兩批照片的實際結果,內容明確的地標、建築、招牌辨識很穩;但同一個場景的連拍、糊掉的夜景、或是純粹的天空海景,取出來的名字可能高度相似或偏籠統。--dry-run 那一關就是為了這種情況存在的。
💡 結語:把判斷留給自己,重複的交出去
這條產線真正改變的不是「AI 幫我整理照片」,而是把一件事拆成「需要判斷的」和「純粹重複的」兩堆,只把後面那堆交出去。
看圖說出這是什麼,是 AI 的強項,一張照片問一次就夠。量尺寸、改檔名、壓縮、轉正、上傳、收網址,這些是程式的強項,寫一次可以跑一輩子。而哪幾張照片要放進文章、哪一張當封面、故事要怎麼說,那是只有去過的人才做得出來的判斷,也是整篇文章唯一有價值的部分。
20 分鐘縮到 2 分鐘省下來的那 18 分鐘,剛好夠寫一段像樣的開頭。
💡 延伸閱讀: 這條產線是怎麼從「5 小時的苦工」一路砍到 35 分鐘的,完整的心路歷程寫在這篇:
👉 35 分鐘還清旅遊債:用 AI 自動化整理旅遊照片|我的 AI 工作流
作者署名:Pinkjhs-curate your way
💡 更多內容持續更新中