化工作流)
1. “superpowers”到底指什么先別急著下載先想清楚你要解決什么問(wèn)題最近這個(gè)詞頻繁出現(xiàn)在我的搜索記錄里。搜“superpowers”跳出來(lái)的結(jié)果五花八門(mén)電影里的超級(jí)英雄能力解說(shuō)、游戲里的技能樹(shù)還有一個(gè)熱搜詞特別顯眼——“想要安裝superpowers”。這個(gè)“安裝”用法很有意思它暗示很多人把superpowers當(dāng)成一個(gè)可以直接裝進(jìn)電腦、裝進(jìn)腦子然后人就變強(qiáng)的軟件。我能理解這種期待。就像我們下載一個(gè)工具就覺(jué)得自己掌握了新技能一樣“安裝”從心理上帶來(lái)一種確定感。但作為折騰過(guò)很多自動(dòng)化項(xiàng)目的人我得坦白說(shuō)superpowers如果指代某一個(gè)具體軟件那它大概率解決不了你想要的那種“變強(qiáng)”。真正的超能力是把自己重復(fù)做的事情拆掉把那些機(jī)器能干的、有規(guī)則的部分交出去讓流程自己跑起來(lái)。這個(gè)系統(tǒng)才是可以“安裝”的——只不過(guò)安裝的不是一個(gè)程序而是一套思維方式和幾個(gè)小工具的組合。這篇文章適合誰(shuí)看適合那些已經(jīng)試過(guò)用各種效率工具、自動(dòng)化腳本給自己減負(fù)但最后發(fā)現(xiàn)工具裝了一堆、流程沒(méi)串起來(lái)的人。也適合剛接觸個(gè)人效率系統(tǒng)、想從零搭建但又不想一上來(lái)就搞復(fù)雜框架的新手。我會(huì)把我在實(shí)踐“superpowers”過(guò)程中的理解、架構(gòu)、可以直接抄的配置以及翻車(chē)記錄都攤開(kāi)來(lái)講。先說(shuō)明我的基本立場(chǎng)我講的“superpowers”不是某一個(gè)商業(yè)產(chǎn)品而是把個(gè)人工作流自動(dòng)化的一個(gè)落地實(shí)踐。你可以把它理解成“給自己造一套超能力管線”——把輸入的信息自動(dòng)處理成輸出把重復(fù)勞動(dòng)交給腳本把決策留給人。這個(gè)思路放在誰(shuí)身上都成立不挑工具不挑行業(yè)。那“安裝”的真實(shí)含義是什么是把幾個(gè)選型簡(jiǎn)單、維護(hù)成本低的組件拼起來(lái)讓它們之間產(chǎn)生化學(xué)反應(yīng)。我在后面會(huì)給你看具體怎么做以及哪些地方特別容易踩坑。2. 核心架構(gòu)輸入、處理、輸出三層一個(gè)管道串起整個(gè)系統(tǒng)我見(jiàn)過(guò)太多人做自動(dòng)化失敗不是因?yàn)閼卸且驗(yàn)橐簧蟻?lái)就想要一個(gè)“大而全”的東西。比如買(mǎi)個(gè) NAS、裝一堆 Docker、配置半天儀表盤(pán)最后發(fā)現(xiàn)每天還是要手動(dòng)整理文件。問(wèn)題的根源在于他們把注意力放在工具數(shù)量上而不是放在“數(shù)據(jù)怎么流動(dòng)”上。所以我做這套系統(tǒng)時(shí)給自己定了一個(gè)非常簡(jiǎn)單的心法超級(jí)能力的本質(zhì)是管道不是倉(cāng)庫(kù)。信息從一個(gè)端口進(jìn)來(lái)經(jīng)過(guò)處理從另一個(gè)端口出去。你能把多少事情接上這個(gè)管道你就有多少超能力。2.1 輸入層你的系統(tǒng)從哪里“聽(tīng)到”世界的信號(hào)輸入層是我先考慮的部分。它決定了系統(tǒng)運(yùn)行起來(lái)的觸發(fā)方式。常用的輸入信號(hào)源有下面這幾類(lèi)定時(shí)器觸發(fā)比如每天 9 點(diǎn)從任務(wù)清單里讀取今天的待辦生成一張?zhí)嵝芽āN募兓|發(fā)監(jiān)控某個(gè)下載目錄、指定文件夾一旦有新文件落地就觸發(fā)后續(xù)動(dòng)作。剪貼板觸發(fā)復(fù)制一段文字后自動(dòng)格式化、歸檔我用的最多。規(guī)則匹配觸發(fā)比如收到包含特定關(guān)鍵詞的通知自動(dòng)分類(lèi)。在選輸入層的時(shí)候我的建議是先挑一個(gè)你每天都會(huì)做、而且做了很多次的事把它的觸發(fā)條件定義清楚。一開(kāi)始不要貪多一個(gè)輸入源跑通了再往上一路追加。我自己的選擇是從剪貼板開(kāi)始的理由很簡(jiǎn)單它是最頻繁、最無(wú)意識(shí)的動(dòng)作。每天從網(wǎng)頁(yè)、文檔、聊天記錄里復(fù)制大量文本復(fù)制完就丟很浪費(fèi)。如果把復(fù)制這個(gè)動(dòng)作變成一個(gè)輸入信號(hào)后面能做很多事。2.2 處理層規(guī)則比代碼重要模板比智商重要處理層是整個(gè)管道的核心。我的原則是能用配置文件解決的絕不用復(fù)雜代碼解決能用一個(gè)函數(shù)的絕不寫(xiě)一個(gè)類(lèi)。處理層里放什么放的是“轉(zhuǎn)化規(guī)則”。它接收輸入層的原始數(shù)據(jù)然后做三件事清洗去掉多余的空行、格式混亂、廣告尾巴。結(jié)構(gòu)化把散亂的文本提取成標(biāo)題、鏈接、內(nèi)容摘要。映射根據(jù)關(guān)鍵詞把內(nèi)容歸入不同的歸檔路徑。我當(dāng)初犯過(guò)一個(gè)典型錯(cuò)誤在處理層寫(xiě)了一套非常復(fù)雜的分類(lèi)算法試圖讓系統(tǒng)“智能”識(shí)別所有內(nèi)容結(jié)果是識(shí)別率感人維護(hù)成本爆炸。后來(lái)我換成了簡(jiǎn)單方案——只處理輸入源里最常見(jiàn)的三種格式剩下的一律進(jìn)默認(rèn)歸檔。這一改動(dòng)反而讓系統(tǒng)穩(wěn)定了很多因?yàn)?80% 的輸入本來(lái)就只有少數(shù)幾種形態(tài)。下面是我剪貼板處理層的核心邏輯用 Python 寫(xiě)不算復(fù)雜import re import time from pathlib import Path def clean_clipboard_text(raw: str) - str: # 去掉開(kāi)頭結(jié)尾多余空白 text raw.strip() # 合并連續(xù)換行 text re.sub(r\n{3,}, \n\n, text) # 去掉微信/網(wǎng)頁(yè)復(fù)制留下的來(lái)源尾巴 text re.sub(r——.*分享.*, , text) return text def classify_clipboard(text: str) - str: # 按關(guān)鍵詞決定歸檔路徑 if any(k in text for k in [bug, error, 報(bào)錯(cuò)]): return debug_log if text.startswith(http://) or text.startswith(https://): return link_box if len(text) 200: return quick_note return long_read def save_note(category: str, cleaned: str): base Path.home() / superpowers / notes / category base.mkdir(parentsTrue, exist_okTrue) filename f{time.strftime(%Y%m%d_%H%M%S)}.md (base / filename).write_text(cleaned, encodingutf-8)看到?jīng)]有處理層真正做的事情非常樸素清洗、分類(lèi)、落盤(pán)。它不智能但它可靠。2.3 輸出層讓處理結(jié)果出現(xiàn)在它該出現(xiàn)的地方輸出層決定了這個(gè)系統(tǒng)怎么回報(bào)你。我經(jīng)歷過(guò)一種狀態(tài)自動(dòng)化腳本跑得很歡但是結(jié)果藏在某個(gè)日志文件里沒(méi)人看那等于沒(méi)有輸出。輸出層要有存在感。我的輸出方式分成三種通知發(fā)到手機(jī)或桌面通知讓人一眼看到處理結(jié)果。歸檔寫(xiě)進(jìn)日志、Markdown 文件、筆記庫(kù)供后續(xù)檢索。執(zhí)行如果處理結(jié)果滿(mǎn)足條件直接觸發(fā)下一個(gè)動(dòng)作比如發(fā)送郵件、創(chuàng)建待辦。輸出層很重要的一點(diǎn)是“可溯源”。我在每個(gè)輸出文件開(kāi)頭都保留一行元數(shù)據(jù)記錄它由什么輸入、什么時(shí)候、經(jīng)過(guò)哪條規(guī)則產(chǎn)生。這個(gè)習(xí)慣幫我省了很多排查問(wèn)題的力氣。2.4 為什么三層足夠用再加層就復(fù)雜了你可能見(jiàn)過(guò)一些流程圖把系統(tǒng)拆成五六層接入層、解析層、增強(qiáng)層、調(diào)度層、存儲(chǔ)層、展示層。很專(zhuān)業(yè)但那是企業(yè)級(jí)方案的思路。個(gè)人項(xiàng)目用這么深的棧大部分時(shí)間是給自己找麻煩。三層結(jié)構(gòu)的最大優(yōu)點(diǎn)是每一層可以獨(dú)立更換。輸入層切掉剪貼板換成監(jiān)聽(tīng)郵箱不影響處理層處理層把規(guī)則改掉不影響輸出層。我的經(jīng)驗(yàn)是個(gè)人項(xiàng)目里面臨的環(huán)境變化很快比如公司換協(xié)作軟件、你換編輯器這種結(jié)構(gòu)能讓你優(yōu)雅地改配置而不是重寫(xiě)系統(tǒng)。表格總結(jié)一下這三層方便你對(duì)照自己的場(chǎng)景層級(jí)常見(jiàn)組件典型動(dòng)作輸出產(chǎn)物輸入層剪貼板監(jiān)聽(tīng)、定時(shí)任務(wù)、文件夾監(jiān)控捕獲信號(hào)原始數(shù)據(jù)處理層規(guī)則引擎、腳本函數(shù)、模板清洗/分類(lèi)/提取結(jié)構(gòu)化數(shù)據(jù)輸出層通知服務(wù)、文件寫(xiě)入、API 調(diào)用落盤(pán)/提醒/觸發(fā)可用結(jié)果3. 從零搭建的三個(gè)自動(dòng)化場(chǎng)景都是可以直接抄的配置講完架構(gòu)我來(lái)給三個(gè)我已經(jīng)跑了一段時(shí)間、沒(méi)有刪掉的實(shí)戰(zhàn)場(chǎng)景。每個(gè)場(chǎng)景都是“輸入—處理—輸出”的完整鏈路代碼和配置我會(huì)盡量貼全你拿過(guò)去就能改著用。3.1 剪貼板一鍵歸檔把復(fù)制的內(nèi)容變成可檢索的筆記這個(gè)場(chǎng)景是我整個(gè) superpowers 系統(tǒng)的入口。目標(biāo)很簡(jiǎn)單你復(fù)制一段文字系統(tǒng)在后臺(tái)自動(dòng)清洗格式、按規(guī)則歸檔幾秒后手機(jī)上收到一條“已歸檔到 long_read/xxx.md”的通知。我用 Python 腳本監(jiān)聽(tīng)剪貼板配合 pyperclip 庫(kù)。核心邏輯如下import pyperclip import threading import time last_clip bounce_until 0 def watch_clipboard(pause1.0): global last_clip, bounce_until while True: try: current pyperclip.paste() except Exception: time.sleep(pause) continue if current ! last_clip and current.strip(): now time.time() # 防抖30秒內(nèi)同一內(nèi)容只處理一次 if now bounce_until: cleaned clean_clipboard_text(current) category classify_clipboard(cleaned) save_note(category, cleaned) # 觸發(fā)通知腳本雙端都要寫(xiě)見(jiàn)下方 notify(category) bounce_until now 30 last_clip current time.sleep(pause) if __name__ __main__: watch_clipboard()這里有三個(gè)細(xì)節(jié)值得你注意。第一防抖邏輯。剪貼板監(jiān)聽(tīng)最常見(jiàn)的坑是同一個(gè)內(nèi)容觸發(fā)好幾次特別是你在某些編輯器里復(fù)制時(shí)系統(tǒng)會(huì)自動(dòng)改寫(xiě)剪貼板。我用bounce_until做一個(gè)簡(jiǎn)單的時(shí)間窗口30 秒內(nèi)不處理重復(fù)內(nèi)容問(wèn)題就沒(méi)了。第二異常處理。剪貼板在不同系統(tǒng)上權(quán)限策略不一樣。我在try/except里選擇了靜默跳過(guò)而不是彈錯(cuò)誤因?yàn)檫@類(lèi)監(jiān)聽(tīng)腳本應(yīng)該像背景空氣一樣存在而不是動(dòng)不動(dòng)跳出來(lái)打擾人。第三通知腳本。為了讓結(jié)果即時(shí)可見(jiàn)我在 macOS 上用osascript彈通知在 Linux 上用了notify-send#!/bin/bash # 通知腳本 notify.sh # 用法: notify.sh 內(nèi)容已歸檔 → long_read if [[ $OSTYPE darwin* ]]; then osascript -e display notification \$1\ with title \Superpowers\ else notify-send Superpowers $1 fi整個(gè)流程跑起來(lái)之后體驗(yàn)真的是“身上帶了一個(gè)隱形助理”。復(fù)制一段長(zhǎng)文切回編輯器想找地方貼的時(shí)候提示就來(lái)了已經(jīng)幫你存好了。很多人第一次看到這個(gè)反應(yīng)是“哇”但實(shí)際原理就是一次很簡(jiǎn)單的文件寫(xiě)入。3.2 下載目錄自動(dòng)歸檔治愈“下載文件夾一團(tuán)亂”的重度患者第二個(gè)場(chǎng)景處理的是下載目錄。我承認(rèn)我在這方面做過(guò)很久的“數(shù)字囤積癥患者”下載文件夾里什么都有PDF、安裝包、截圖、壓縮包混在一起找一個(gè)文件翻半天。于是我用文件監(jiān)控加規(guī)則歸檔解決了這個(gè)問(wèn)題。考慮到移動(dòng)端和桌面端同步我選擇的監(jiān)控目錄是~/Downloads目標(biāo)是所有新文件在 10 分鐘內(nèi)自動(dòng)按擴(kuò)展名和文件名關(guān)鍵詞移動(dòng)到對(duì)應(yīng)子目錄。#!/bin/bash # dispatch_new_files.sh # 在 ~/Downloads 下新建文件時(shí)觸發(fā)按類(lèi)型分揀 WATCH_DIR$HOME/Downloads # 文檔類(lèi) if [[ $1 ~ \.(pdf|docx?|xlsx?|pptx?)(\.part)?$ ]]; then mkdir -p $WATCH_DIR/文檔 mv $1 $WATCH_DIR/文檔/ exit 0 fi # 壓縮包 if [[ $1 ~ \.(zip|rar|7z|tar\.gz)$ ]]; then mkdir -p $WATCH_DIR/壓縮包 mv $1 $WATCH_DIR/壓縮包/ exit 0 fi # 圖片 if [[ $1 ~ \.(png|jpe?g|gif|webp)$ ]]; then mkdir -p $WATCH_DIR/圖片 mv $1 $WATCH_DIR/圖片/ exit 0 fi # 安裝包 if [[ $1 ~ \.(dmg|pkg|exe|msi|AppImage)$ ]]; then mkdir -p $WATCH_DIR/安裝包 mv $1 $WATCH_DIR/安裝包/ exit 0 fi # 其他 mkdir -p $WATCH_DIR/未分類(lèi) mv $1 $WATCH_DIR/未分類(lèi)/觸發(fā)方式我用的是最簡(jiǎn)單的輪詢(xún)每 60 秒看一眼目錄里的新文件。一開(kāi)始我想用inotifywait做實(shí)時(shí)觸發(fā)但后來(lái)發(fā)現(xiàn)對(duì)于個(gè)人電腦來(lái)說(shuō)輪詢(xún)足夠而且穩(wěn)定得多。實(shí)時(shí)觸發(fā)意味著你要常駐一個(gè)守護(hù)進(jìn)程處理各種文件被占用、寫(xiě)入未完成的問(wèn)題而輪詢(xún)天然避開(kāi)了這些坑。這個(gè)腳本是讓我第一次真正感受到“數(shù)字空間是可控的”的東西。每次下載完過(guò)一會(huì)兒去下載目錄文件已經(jīng)自己站好隊(duì)了。你不需要任何意志力去整理它系統(tǒng)替你干了。3.3 每日待辦摘要早上打開(kāi)手機(jī)就知道今天要做什么第三個(gè)場(chǎng)景比較輕量但收益非常直接。它是每天早上 8 點(diǎn)從我的任務(wù)清單文件里提取當(dāng)天待辦整理成一段摘要推送到手機(jī)上。任務(wù)清單我維護(hù)在一個(gè)純文本文件里格式極簡(jiǎn)# 2025-01-15 - [ ] 完成項(xiàng)目上線前檢查 - [ ] 寫(xiě)季度復(fù)盤(pán) - [ ] 確認(rèn)下周排期 # 2025-01-16 - [ ] 準(zhǔn)備分享用的 PPT每天早上腳本讀取文件、匹配當(dāng)天的日期標(biāo)題然后把未完成事項(xiàng)拼成一條信息發(fā)出去。代碼如下#!/usr/bin/env python3 from pathlib import Path import datetime, subprocess task_file Path.home() / superpowers / tasks.md today datetime.date.today().isoformat() lines task_file.read_text(encodingutf-8).splitlines() today_heading f# {today} in_today False todos [] for line in lines: if line.startswith(# ): in_today (line.strip() today_heading) elif in_today and line.strip().startswith(- [ ]): todos.append(line.strip().lstrip(- [ ] ).strip()) if todos: msg 今日待辦\n \n.join(f{i1}. {t} for i, t in enumerate(todos)) subprocess.run([bash, notify.sh, msg]) else: subprocess.run([bash, notify.sh, 今天沒(méi)有待辦享受空白])這個(gè)腳本讓我形成了一種確定性每天早上都有一個(gè)外部提醒而不是靠腦子記憶。我做這個(gè)場(chǎng)景的初衷是大腦應(yīng)該用來(lái)做判斷不應(yīng)該用來(lái)做存儲(chǔ)。哪怕只是讀一遍清單這個(gè)動(dòng)作交給腳本也比自己翻文件更省力。4. 安裝和配置時(shí)最容易翻車(chē)的四個(gè)細(xì)節(jié)我全踩了一遍說(shuō)實(shí)話上面這些腳本單看都不復(fù)雜任何一個(gè)有點(diǎn)編程經(jīng)驗(yàn)的人都能在半小時(shí)內(nèi)寫(xiě)出來(lái)。但真正讓這類(lèi)系統(tǒng)“要么好用要么吃灰”的是那些不起眼的細(xì)節(jié)。我把這些年踩過(guò)的坑挑幾個(gè)典型的講一下。4.1 路徑問(wèn)題中文目錄、空格和權(quán)限是三大殺手第一個(gè)大坑是文件的路徑。很多人一開(kāi)始把腳本放在中文名字的目錄里或者在處理過(guò)程中移動(dòng)文件到包含空格和特殊字符的路徑腳本里如果直接寫(xiě)死路徑很容易出問(wèn)題。我踩過(guò)一次特別狼狽的因?yàn)樗谟脩?hù)目錄帶中文一個(gè)文件名中包含中文和空格腳本在移動(dòng)文件時(shí)把路徑當(dāng)成了多個(gè)參數(shù)結(jié)果文件被橫切成了幾個(gè)碎片。從那之后我給自己的項(xiàng)目定了三條鐵則所有路徑用英文命名中間不用空格統(tǒng)一用下劃線。腳本里所有文件路徑用Path對(duì)象拼接不手寫(xiě)字符串。在處理用戶(hù)輸入路徑時(shí)一律用shlex.quote()或者subprocess傳參數(shù)列表不用shellTrue拼串。# 錯(cuò)誤的寫(xiě)法很容易在路徑帶空格時(shí)爆炸 subprocess.run(fmv {src} {dest}, shellTrue) # 正確的寫(xiě)法 subprocess.run([mv, str(src), str(dest)])這個(gè)細(xì)節(jié)可能不會(huì)讓你立刻翻車(chē)但只要你跑幾個(gè)月自動(dòng)化總會(huì)遇到一次。4.2 觸發(fā)器的防抖同一個(gè)文件反復(fù)被處理三次第二個(gè)坑是重復(fù)處理。我在剪貼板監(jiān)聽(tīng)那里用了簡(jiǎn)單的防抖同樣的問(wèn)題也出現(xiàn)在文件監(jiān)控里。下載一個(gè)大文件時(shí)瀏覽器可能會(huì)先創(chuàng)建一個(gè).part文件下載完成后才變成最終文件某些工具寫(xiě)入文件時(shí)會(huì)先寫(xiě)臨時(shí)文件再重命名監(jiān)控腳本可能會(huì)在寫(xiě)了一半的時(shí)候觸發(fā)更常見(jiàn)的是云盤(pán)同步目錄會(huì)產(chǎn)生大量事件每個(gè)文件觸發(fā)好多次。如果不加防抖你的歸檔腳本可能會(huì)把一個(gè)文件移動(dòng)兩次第二次找不到文件直接報(bào)錯(cuò)或者更隱蔽的——部分文件被錯(cuò)誤地處理因?yàn)槟阕サ降氖菍?xiě)入過(guò)程中的不完整狀態(tài)。我給文件輪詢(xún)加了一個(gè)簡(jiǎn)單的緩存機(jī)制在內(nèi)存里記錄最近處理過(guò)的文件名和時(shí)間戳60 秒內(nèi)不重復(fù)處理。對(duì)于個(gè)人使用來(lái)說(shuō)這比引入復(fù)雜的文件事件隊(duì)列要?jiǎng)澦愕枚?。import collections, time recent collections.deque(maxlen200) def should_process(path): sig (path, time.time() // 60) if sig in recent: return False recent.append(sig) return True這種按分鐘粗粒度去重的方式比精確到秒的去重更符合文件歸檔的場(chǎng)景。因?yàn)槟阍?60 秒內(nèi)根本不需要處理同一個(gè)文件兩次。4.3 日志一定要單獨(dú)留否則排錯(cuò)就像大海撈針第三個(gè)坑是我感觸最深的腳本不寫(xiě)日志。前幾個(gè)版本我偷懶覺(jué)得輸出到終端就行了。后來(lái)系統(tǒng)跑了兩周某一天突然發(fā)現(xiàn)某個(gè)歸檔目錄里多了很多不該出現(xiàn)的文件但我完全想不起來(lái)是哪個(gè)環(huán)節(jié)出了問(wèn)題。從那之后我把日志當(dāng)成了系統(tǒng)的必要條件。日志不是給機(jī)器看的是給未來(lái)的自己看的。我保留了stdout同時(shí)把日志寫(xiě)到文件里按天滾動(dòng)。import logging from logging.handlers import TimedRotatingFileHandler logger logging.getLogger(superpowers) handler TimedRotatingFileHandler( /home/you/superpowers/logs/app.log, whenmidnight, backupCount14, ) logger.addHandler(handler) logger.setLevel(logging.INFO) # 每次執(zhí)行關(guān)鍵動(dòng)作時(shí)記錄 logger.info(move file: %s - %s, src, dst)有日志之后排錯(cuò)的成本降低了至少十倍。比如發(fā)現(xiàn)文件被移錯(cuò)了目錄翻一下日志立刻能看到是哪條規(guī)則匹配的發(fā)現(xiàn)剪貼板監(jiān)聽(tīng)沒(méi)反應(yīng)看看日志就知道是權(quán)限問(wèn)題還是剪貼板內(nèi)容為空。4.4 環(huán)境隔離別把全局環(huán)境搞得一團(tuán)糟不然你換臺(tái)電腦就廢了第四個(gè)坑不是功能問(wèn)題而是工程問(wèn)題依賴(lài)管理。我最早寫(xiě)腳本時(shí)直接系統(tǒng) Pythonpip install 裝了一堆庫(kù)。幾個(gè)月后有些事情做不明白了去排查發(fā)現(xiàn)全局環(huán)境里裝了很多相互沖突的包版本還亂。更糟糕的是如果換一臺(tái)新電腦完全沒(méi)有可復(fù)現(xiàn)性所有配置都要手動(dòng)重來(lái)一遍。后來(lái)我把項(xiàng)目從結(jié)構(gòu)上規(guī)范了一下superpowers/ ├── scripts/ │ ├── clipboard_watch.py │ ├── dispatch_downloads.py │ └── daily_digest.py ├── configs/ │ └── rules.yaml ├── logs/ ├── venv/ └── requirements.txt每次在新的機(jī)器上部署只需要三步python3 -m venv venv source venv/bin/activate pip install -r requirements.txt還有一點(diǎn)敏感配置比如從環(huán)境變量讀取通知 ID、把 API token 放進(jìn).env文件永遠(yuǎn)不要寫(xiě)進(jìn)代碼里。我見(jiàn)過(guò)有人的腳本里直接寫(xiě)了自己的郵箱密碼這種習(xí)慣非常基礎(chǔ)但確實(shí)有人漏掉。我把這些坑壓在前面講是因?yàn)樗鼈儾攀且粋€(gè)“superpowers 系統(tǒng)”能不能長(zhǎng)期活下來(lái)的核心。功能代碼寫(xiě)得快環(huán)境因素和管理因素是慢慢消磨系統(tǒng)生命力的。5. 判斷這套“超能力”值不值得維護(hù)我自己的取舍標(biāo)準(zhǔn)搭建系統(tǒng)只是第一步更關(guān)鍵的問(wèn)題是它到底值不值得繼續(xù)跑下去在我自己實(shí)踐的過(guò)程中有一套很簡(jiǎn)單的判斷標(biāo)準(zhǔn)。不是“這個(gè)功能很酷所以我留著”而是用數(shù)據(jù)來(lái)算賬。先說(shuō)“省時(shí)”的算法。我會(huì)粗略估算一個(gè)自動(dòng)化任務(wù)每次省掉我多少時(shí)間乘以每天/每周觸發(fā)的次數(shù)得出一個(gè)每周節(jié)省時(shí)間。比如下載目錄自動(dòng)歸檔我以前的整理習(xí)慣是每周手動(dòng)整理一次一次大約 20 分鐘。自動(dòng)歸檔幫我省掉這 20 分鐘同時(shí)讓我隨時(shí)可以快速找到文件視覺(jué)壓力也小了。這個(gè)收益是實(shí)打?qū)嵉摹T倏础熬S護(hù)成本”。腳本出問(wèn)題不是“會(huì)不會(huì)”而是“什么時(shí)候”。我用的記賬方式是每次為某個(gè)腳本花超過(guò) 30 分鐘排查問(wèn)題就在對(duì)應(yīng)腳本旁邊記一筆。幾個(gè)月下來(lái)我會(huì)發(fā)現(xiàn)哪一個(gè)腳本在持續(xù)消耗我的注意力。我自己最后保留的規(guī)矩是一個(gè)自動(dòng)化腳本如果每個(gè)月能省我至少 1 小時(shí)維護(hù)它的時(shí)間低于 15 分鐘就留著如果壓力值超過(guò)了收益值砍掉。用這個(gè)標(biāo)準(zhǔn)我后來(lái)真的砍掉過(guò)兩個(gè)項(xiàng)目。一個(gè)是“自動(dòng)給文件打標(biāo)簽”的腳本。它看起來(lái)很有意思——監(jiān)控所有文檔、自動(dòng)提取關(guān)鍵詞、生成標(biāo)簽。跑了兩周后我發(fā)現(xiàn)打出來(lái)的標(biāo)簽我自己從來(lái)不看因?yàn)槲覍?duì)自己的文件命名習(xí)慣已經(jīng)很熟悉了。還有一個(gè)是“自動(dòng)生成周報(bào)”的腳本。聽(tīng)起來(lái)很高效但我寫(xiě)的周報(bào)需要大量上下文判斷腳本生成的版本反而要花更多時(shí)間修改。這兩個(gè)項(xiàng)目都沒(méi)有達(dá)到“每月省 1 小時(shí)”的門(mén)檻于是刪了。我建議你也給自己的每個(gè)自動(dòng)化腳本建一個(gè)“性?xún)r(jià)比賬本”。不要因?yàn)閷?xiě)了它覺(jué)得浪費(fèi)就硬留著也不要因?yàn)槭且徊讲酱钇饋?lái)的有感情就舍不得刪。工具是為你服務(wù)的不是讓你反過(guò)來(lái)照顧工具的?,F(xiàn)在我的系統(tǒng)里長(zhǎng)期保留的就是剪貼板快速歸檔、下載目錄自動(dòng)分揀、每日待辦摘要這三條。它們都不復(fù)雜但每一天都在給我省時(shí)間。6. 最后聊點(diǎn)實(shí)在的這套系統(tǒng)為什么能帶來(lái)“超能力感”如果只說(shuō)技術(shù)細(xì)節(jié)這篇文章和普通教程沒(méi)有區(qū)別。我想補(bǔ)充一個(gè)自己的觀察當(dāng)這套自動(dòng)化系統(tǒng)跑到第三周之后我感受到了一種很微妙的心理變化。以前每天打開(kāi)電腦第一件事是想“今天要做什么”現(xiàn)在打開(kāi)電腦很多小事已經(jīng)有人替我做完了——下載的文件分類(lèi)好了昨晚復(fù)制的文章已經(jīng)躺進(jìn)筆記庫(kù)早上待辦清單已經(jīng)推送到我眼前。我不是變強(qiáng)了而是我不用再把注意力消耗在那些機(jī)械性的小事上。這種“注意力被解放”的感覺(jué)才是我說(shuō)的“superpowers”。不過(guò)我也要提醒一句不要一開(kāi)始就想搭建一個(gè)包羅萬(wàn)象的系統(tǒng)。我的親身經(jīng)歷是凡是那種“我要把所有流程全自動(dòng)一鍵搞定工作生活”的計(jì)劃幾乎都以失敗告終。原因很簡(jiǎn)單你對(duì)業(yè)務(wù)的理解還不夠深你對(duì)自己習(xí)慣的觀察還不夠細(xì)強(qiáng)行自動(dòng)化只是在把混亂固化下來(lái)。正確的路徑是反過(guò)來(lái)從一件讓你最厭煩的小事開(kāi)始用手動(dòng)方式記錄你處理它的步驟再把這個(gè)步驟翻譯成腳本跑起來(lái)。跑順了再找下一件事。這個(gè)系統(tǒng)還會(huì)隨著你的使用習(xí)慣不斷演化——比如我最早只有剪貼板一個(gè)場(chǎng)景后來(lái)才慢慢加上下載分類(lèi)、每日摘要。最后分享一個(gè)小技巧我每次給腳本加新功能都會(huì)先在手動(dòng)模式下跑幾遍確認(rèn)處理結(jié)果的格式符合預(yù)期再接入自動(dòng)觸發(fā)。這個(gè)習(xí)慣讓我避免了很多因?yàn)橐?guī)則考慮不周而造成的蝴蝶效應(yīng)。如果你現(xiàn)在正在為“想要安裝 superpowers”這件事糾結(jié)我的建議就是別找那個(gè)完美的軟件了從你的剪貼板和下載文件夾開(kāi)始動(dòng)手搭第一條管道。真正的超能力不是某一個(gè)工具而是你逐漸建立起來(lái)的、對(duì)重復(fù)勞動(dòng)的掌控感。