TG遠端遙控
運作流程
Kim 打 Telegram 指令→橋比對白名單→叫本機腳本跑→抓 pages.dev 連結→回傳手機
一句話定位:人在外面,電腦自己跑——Kim 打一句 Telegram,本機腳本就動,連結回手機。
起點:非坐在電腦前不能用
âme soeur 的訂貨、出貨、週報腳本跑在 Kim 的電腦上。這是必要的限制:Cyberbiz 後台的 session 綁 IP,雲端 IP 打過去會直接被擋,沒辦法把腳本搬到 GitHub Actions 或任何公雲跑。
但這也帶來一個很實際的問題:每次要看出貨清單或查預購數量,一定要回家開電腦、手動跑腳本,不在電腦前就沒辦法。
Kim 在外面的時候常常需要這些資訊——跟廠商對話、確認能不能先出、快速看一眼今天的狀況。每次都要等回家才能查,很不方便。
怎麼解:讓手機叫電腦去跑
不是把腳本搬走,而是讓本機電腦接受遠端指令。
Telegram Bot API 支援 long-poll(長輪詢)——本機的 Python 程式可以直接去 Telegram 的伺服器等新訊息,不需要架公開伺服器、不需要固定 IP、不需要 webhook。只要電腦開著、橋在跑,Kim 在外面打一句話,電腦就收到並執行。
這個做法同時解了兩個問題:讓 Kim 在外操作,以及執行仍留在本機(也就繼續能撈 Cyberbiz 後台資料)。
怎麼辦到的:三個核心機制
收到指令後做三件事。
telegram_bridge.py 在本機常駐,用 Telegram Bot API long-poll 等 Kim 發訊息。收到之後:
- 先確認身分:只回應白名單 chat id。第一次有人跟 bot 說話,自動把那個 chat id 寫進
.env 綁定——之後只認這個人,其他 chat id 回「私人 bot,無法服務」。 - 比對指令:用 regex 驗日期格式,把指令分派給對應腳本。白名單:出貨 →
ops_shipping_list.py、訂貨 → ops_order_list.py、週報 → weekly_report.py、列印 → ops_auto_print.py。不在清單的字串直接回說明,不執行。 - 回傳結果:從腳本的 stdout 抓
LINK: 開頭那行(pages.dev 連結)+含「|」的統計摘要,一起回給手機。
為什麼不會亂接指令:
- bot token 存在本機
.env,已 .gitignore,不會進 repo。 - 日期參數先用 regex 驗過才丟給腳本,防止任意指令注入。
- 三個腳本(出貨/訂貨/週報)全部唯讀,不改後台任何設定,所以 v1 不需要額外確認 gate。
目前指令清單(v1):出貨、訂貨(支援日期範圍)、週報、列印(指定日直接送印到印表機)。
版本歷程與踩坑
### 讀靈感匯入失敗 + 清除指令(2026-06-07)
讀靈感修好了。 Kim 原本以為是「一天只能匯入一次的扣打」——查證後否定:Gemini 2.5 Flash 免費層是 250–1500 RPD(不是一次),而且同次跑就有影片成功匯入,不是額度問題。真因是 process_inbox.py 裡兩個 bug 疊在一起:
Bug 1:模型端暫時過載,程式單次放棄。
Gemini 回「This model is currently experiencing high demand」,原程式收到這串訊息就直接停,沒有重試。修法:gemini_analyze 加指數退避重試,最多 5 次(等 3/6/12/24 秒),認 high demand、overloaded、503、429、network 等字樣就等一下再試。
Bug 2:JSON 被截斷,Gemini 思考 token 吃光輸出空間。
撞到 Unterminated string / Expecting value——原因是 2.5-flash 有「思考」流程,思考 token 把 maxOutputTokens 吃光,正文被截斷。修法:generationConfig 加 thinkingConfig.thinkingBudget=0(關掉思考節省 token),同時 maxOutputTokens 從 4096 → 8192。
結果:卡了好幾天的 4 支 inbox 影片(含 6/7 當天那支)全部成功匯入,inbox 清空。手機「讀靈感」走同一支腳本,一起修好。
新增「清除」逃生門。 Kim 要的是:萬一某支影片怎樣都上傳不了或處理不了,手機可以把收件匣清掉重來,不被卡住。
做法:telegram_bridge.py 新增 clear_inbox(),手機打「清除/清空/清掉/清靈感」→ 把 reels_inbox/ 裡還沒匯入的影片搬到 reels_inbox/cleared/ 備份夾(不刪檔,留得回),回報清了幾支、收集夾清空可重傳。
判斷邏輯排在「靈感」之前:避免「清靈感」這個字串被誤判成「讀靈感」觸發匯入。HELP 已加這行說明。
橋在 2026-06-07 15:50 重啟,連上 @Kim_amesoeur_bot,新碼上線,待 Kim 手機實打「清除」驗收。
### 失敗影片回傳(2026-06-05)
「讀靈感」功能上線後,第一次跑真實 inbox,5 支進來 1 成功、4 支失敗——3 支碰到 Gemini「exceeded quota/billing」、1 支 JSON 格式壞掉(Expecting value)。
Kim 的痛點:手機收到的失敗報告只有一串時間戳檔名,像 20260605_143022.mp4 FAILED: ...,根本認不出是哪支影片、也不知道為什麼沒過、要不要重試還是放棄。
修法:bridge.py 在「讀靈感」跑完後,把還留在 reels_inbox/ 的影片逐一用 sendVideo 傳回 Telegram——成功的才會被搬到 done/,失敗的就還在原地。每支附一段白話說明:quota 用完是「今天額度用完,明天再試」;JSON 壞掉是「Gemini 回傳格式異常,可重傳」。Kim 看縮圖就知道是哪支、看文字就知道該怎麼處理。今天那 4 支實測回傳成功。
根因:同一把免費 Gemini key 被 web app(腳本生成器)、讀靈感流程、還有本機測試三個地方共用,比預期更快撞到每日上限。Gemini 免費版不提供即時查剩餘額度的 API——回應 header 裡沒有 ratelimit 或 quota 欄位,無法直接讀官方數字——只能靠 app 端自己記次數估算。
這件事同時在腳本生成器端做了對應的修正:新增 /api/usage 端點加上 Supabase generation_usage 表計次,頁面頂常駐顯示今日已用 X / 250 筆+燈號。gemini.ts 也拆開了退模板的兩種原因:quota 真的用完(顯示「今天免費額度已用完,明天再試」)和 Google 暫時塞車(可稍後重試),不再顯示同一行「AI 額度暫時不足」讓人誤以為帳戶沒錢。
### Reels 靈感收集功能(2026-06-05,已完成,Kim 手機實測通過)
Kim 的需求很直接:自己拍得好的 Reel、或是在外面看到覺得「這個拍法不錯」的別人影片,都可以直接螢幕錄影之後丟給橋,讓它自動解析成腳本卡,存進 Reels Script Generator 的範例庫,讓生成器越用越準。
一個核心設計決定:完全不碰 IG API、不登入、不爬蟲。
Kim 最怕 IG 帳號被鎖。所以這條路的做法是:影片統一從手機螢幕錄影,經 Telegram 轉寄給橋,分析全在電腦本機完成,不走任何 IG 授權的途徑。手機只當收集箱,分析回電腦批次跑。
過程中也釐清了幾件事:腳本生成器不是「訓練模型」,而是每次生成時從資料庫撈最多 5 筆 is_recommended 的高觀看腳本當範例(RAG);本來計畫裝 Whisper 跑語音轉錄,讀了設定後發現 app 用的 Gemini 2.5 Flash 多模態本來就能直接看影片——省掉兩個安裝。
這次做了什麼:
改了 telegram_bridge.py:新增 handle_media(),收到 video/document/animation 就用 getFile 下載到 reels_inbox/,把 caption 存成 .note.txt 旁註,回英文 ack(避開先前中文 pipe 編碼坑)。主迴圈改成先過授權再分流媒體/文字。Telegram bot getFile 下載上限 20MB,超過直接擋掉並提示「錄短一點」。
新增 process_inbox.py:讀 reels_inbox/ 影片 → Gemini File API 上傳 → gemini-2.5-flash 看影片組「âme soeur 分場腳本卡」JSON(對齊 reels_script_library schema,script_type 限 hack/pain/new/knowledge/fomo/other,進庫即標 is_recommended=true)→ 寫進 Supabase → 回查確認該筆在庫 → 印 IMPORT REPORT。金鑰共用 ame-soeur-reels/.env.local。
再加碼新增「讀靈感」指令(INSPIRE_WORDS + run_inbox()),手機打「讀靈感」→ 橋在電腦跑 process_inbox.py → 把 IMPORT REPORT 回傳手機。
金鑰卡關的解法:
原本本機 .env.local 的 GEMINI_API_KEY 是佔位字(24 字、非 AIza 開頭)。Kim 從 Google AI Studio 拿到真 key(免費 tier),貼進 .env.local,實測 generateContent 回 200 OK,分析步驟通了。
端到端驗證(Kim 實測):
Kim 手機螢幕錄影一支包包 Reel(3.1MB)→ 傳給 bot → bridge 收檔存進 reels_inbox/,回「OK saved to inbox」。電腦跑 process_inbox.py:Gemini 2.5 Flash 真的「看完影片」,抓出 9 場分鏡+口白+字卡的完整過程腳本(含示範雙開口設計、側袋放洗手液、限時優惠 $981 只到週五),還產出品牌判讀、情緒設計、CTA、可複製重點、改寫成 âme soeur 版腳本、建議商品、參考價值 4★、自動標 is_recommended。
寫進 Supabase 後回查確認,IMPORT REPORT: Received 1 / Imported&verified 1 / Failed 0。腳本庫 26→27 筆。
這是這次最大突破:caption 根本抓不到影片裡的過程腳本,Gemini 多模態把口白+字卡+分鏡全都抽出來了——這正是 Kim 一直擔心「讀不到影片裡的腳本就沒用」的那塊。
Kim 手機實測打「讀靈感」→ 回「Inbox empty: 0 videos」,手機→電腦→回報這一趟通了。現在整套可全手機操作,電腦開著即可。
一個已知小瑕疵(誠實標):
rewritten_version 有時被 Gemini 回成巢狀 JSON、存成帶 \u 編碼的醜字串。已加 as_text() 用 ensure_ascii=False 轉乾淨中文,之後匯入的都乾淨。既有一筆舊卡片的該欄仍是舊醜版,待清。
bridge 重啟紀錄:
過程中重啟兩次。第一次因 bash 吃掉 $(Get-Location) 造成短暫斷線幾秒;第二次加「讀靈感」指令後需重啟才生效。最終乾淨一個 pythonw 在跑,連上 bot,開機自啟不受影響。回報一律英文(避中文 pipe 編碼坑)。
### v1 上線(2026-06-04 上午)
核心功能跑通:Kim 在外打 Telegram 指令 → 本機跑腳本 → 把 pages.dev 連結回傳到手機。
同時加了「列印」指令:Kim 打「列印 6/4」→ ops_auto_print.py 判斷當天全現貨可出的訂單 → 直接用 Chrome --kiosk-printing 靜默送印到預設印表機(不跳對話框)。Edge 版本同樣的參數卻不會真的送出列印工作,最後確認用 Chrome 才行。
### 開機自動啟動:四個坑(2026-06-04 下午)
v1 上線之後發現一個問題:有一次 Kim 在外傳了指令,但橋沒在跑,訊息消失在 Telegram 佇列裡。「電腦開著」不等於「服務在跑」——還是要手動去開腳本,就跟沒做差不多。
所以讓橋開機自動啟動。聽起來很小,踩了四個坑:
坑一:python 別名在非互動情境跑不動。
Windows Store 版的 python 其實是「應用程式執行別名」,在工作排程器或開機腳本這類非互動情境下叫不起來,直接回沒找到。
解法:改用真實路徑,直接指向 WindowsApps 資料夾裡 pythoncore-3.14-64 的 python.exe。路徑會跟著版本升級變,要記得更新。
坑二:工作排程器要管理員,被系統拒絕。
用 schtasks /create 設定「使用者登入時執行」,測試時非互動情境下提權被拒。
改成用開機啟動資料夾(shell:startup)放捷徑。這是 Windows 原生支援的機制,不需要任何額外權限。
坑三:VBScript 不能直接跑 .bat。
WScript.Shell.Run 走 CreateProcess,不認識 .bat 這種關聯格式。要用 cmd /c 包起來才行。
後來乾脆跳過 .bat 這層,改成讓 VBScript 直接呼叫 pythonw.exe(Windows 的無視窗 Python),腳本直接跑,少一層中間人。
坑四:在 Git Bash 裡測 Windows 啟動行為是假象。
在 Git Bash 裡用 cscript、wscript、Start-Process 這些東西,行為跟真實的 Windows 開機情境不一樣。測起來「壞了」,但其實是測試環境的問題,不是設定本身錯。
真正的驗證方法:直接重開機,看 bridge.log 有沒有 [boot] 那行。這樣才算真的測到了。
最終解法:
pythonw.exe(無視窗)直接跑 telegram_bridge.py,工作目錄設在 scripts。telegram_bridge.py 開頭把 sys.stdout 和 sys.stderr 都導向 bridge.log(pythonw.exe 底下 print 輸出沒有地方去,不接 log 就完全無從診斷)。- 開機資料夾放一個捷徑,電腦一開機就自動啟動橋。
### 列印佇列殭屍待清(2026-06-04 當前狀態)
開機自動啟動裝好之後,Kim 測試「列印 6/4」,連線成功、橋有回應,但印表機沒有吐紙。
懷疑是測試期間多次送印,印表機佇列卡了殭屍工作。這種狀況重開機清佇列後會恢復正常。
當前狀態:列印機制已打通(ops_auto_print.py 邏輯驗證正確,Chrome --kiosk-printing 確認能送印),最後一步「重開機清佇列」待 Kim 執行後確認。
目前整體狀態
- v1 已上線:出貨、訂貨、週報、列印、讀靈感、清除六個指令都通。
- 開機自動啟動:裝好,pythonw 常駐,電腦開機橋就跑(2026-06-07 Kim 確認開機自啟沒問題)。
- 列印指令:三坑已修(還原泡泡、圖片卡、印表機亂跳),Kim 確認沒問題(吐紙、張數對、每張一份)。
- Reels 靈感收集(2026-06-05 完成):手機螢幕錄影 → 傳 bot → 打「讀靈感」→ Gemini 看影片拆分鏡/口白/字卡 → 腳本卡進 Supabase,Kim 實測通過,腳本庫 26→27 筆。
- 失敗影片回傳(2026-06-05 完成):讀靈感失敗時,bridge 自動把失敗影片 sendVideo 傳回手機附白話原因,4 支實測回傳成功。
- 讀靈感 bug 修復(2026-06-07 完成):
process_inbox.py 修兩個疊在一起的 bug(模型過載沒有重試 → 加指數退避;JSON 被截斷因思考 token 吃光 → 關 thinkingBudget+加大 maxOutputTokens)。卡多天的 4 支影片全部成功匯入,inbox 清空。 - 清除指令(2026-06-07 完成):手機打「清除/清空/清掉/清靈感」→ 收件匣影片搬到 cleared/ 備份,不刪檔。待 Kim 手機驗收。
v2 方向
接 Claude API,讓 TG遠端遙控變成「手機上的我」,可以自然對話、看圖、想 Reels 腳本,不用背指令格式。技術上 v1 已做的 long-poll 架構完全可以繼承,只需要多串一層 Claude 對話。
它的實際產出(示意)
實際跑出來的成果樣子,數字已換成示範值。
示意 · 實際指令互動
aKim_amesoeur_botbot · 線上
出貨清單好了
區間訂單 8|全現貨可出 3
amesoeur-ops-report.pages.dev ↗14:33
規格小檔 狀態:v1 全功能上線(出貨/訂貨/週報/列印/讀靈感+失敗回傳+清除,Kim 實測通過)|純本機工具,無公開伺服器|工具:Python、Telegram Bot API、requests、Gemini File API、Supabase、.env|最後更新:2026-06-07