iT邦幫忙

2026 iThome 鐵人賽

DAY 20
0
Claude AI

一個人的機房:用 Claude 建置 AI 機房系列 第 20

Day20 請個小秘 - 2 : Telegram 串接

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20260828/20181284XwpDBS5oER.png

上一篇底座蓋好了:一台機器、一個小秘、八個頁面、兩條每天在響的提醒。它還不會講話,也聽不到我講話。所有東西都要開網頁、點表單,這樣的小秘跟一個表格沒有差別。這一篇把嘴巴接上去。先接 Telegram,再接 LINE,順序是刻意的。規則:新東西先接最容易的那條線,接通了再去搞那個麻煩的。

先要一個 Telegram 帳號

第一步跟程式沒有關係:要有一個 Telegram 帳號。手機裝 Telegram,用手機號碼註冊,桌機再裝一份同步,因為後面截圖、貼 key 都在桌機比較順手。本來就有帳號的人這一步跳過。一個常被跳過的事:bot 不是帳號,bot 是掛在你帳號底下的東西,帳號沒了 bot 就沒了。所以拿來養小秘的帳號要是自己長期在用的那個,不要為了測試另外辦一個。

開始,先到 TG,找 BotFather,
在 BotFather:打一個斜線,它列出所有指令,建新 bot、管理 bot、拿 token 都在這裡

https://ithelp.ithome.com.tw/upload/images/20260828/20181284uEEndz2kB7.png

Telegram 裡負責發 bot 的,本身就是一個 bot,叫 BotFather。在搜尋列打 BotFather,認清楚是有藍色勾勾的那一個,同名的不只一個。點進去按開始,打一個斜線,它會列出所有指令:建一個新的 bot、管理已經有的 bot、拿授權 token。整個過程就是跟它聊天,它問一句、你答一句。規則:官方的東西認勾勾,不認頭像與名字。

問 claude 怎麼建第一個 bot

我要把小秘接上 Telegram,但我從來沒建過 Telegram bot。
一步一步教我:去哪裡找 BotFather、要下什麼指令、名字有什麼規則、最後會拿到什麼、拿到之後放哪裡。
⛔ 這一步只要拿到 bot 的 key,不要動任何程式碼,也不要幫我把接線一起做掉。

從來沒建過 bot,所以先問 claude 怎麼做,不要自己在 BotFather 裡面亂按。claude 回的是四步:找 BotFather、下建新 bot 的指令、取兩個名字、把最後那串 key 收好。兩個名字:一個是顯示名,隨便取,可以中文;一個是帳號名,要英文、不能重複、結尾一定要是 bot,不然 BotFather 不收。帳號名取錯了不能改,只能刪掉重建,所以先想好再打。規則:不熟的流程先問一次,再動手;問的時候講清楚「這一步只要拿到 key,先不要動程式」,不然它會把整套接線一起做給你。

拿到一把 key:token

BotFather:下了建新 bot 的指令之後,它先問名字;回完兩個名字,下一則就是 token

https://ithelp.ithome.com.tw/upload/images/20260828/20181284nwcrMIbRio.png

BotFather 收到兩個名字之後,回一段話,裡面有一串 token,冒號前面是這個 bot 的編號,後面是一長串亂碼。這串 token 就是 bot 的密碼:誰拿到它,誰就可以操控這個 bot。所以它不能出現在截圖裡、不能貼進對話、不能寫進文章。這一篇所有的圖都刻意避開那一則訊息。如果不小心貼出去了,回 BotFather 用撤銷指令重發一把,舊的立刻作廢,不用刪 bot。規則:token 露出來的第一個動作不是刪截圖,是換 token。

https://ithelp.ithome.com.tw/upload/images/20260828/201812841ZkPpcWIBO.png

token 跟 id 放進檔案

token 放進機器上的 .env 檔,變數名叫 TELEGRAM_BOT_TOKEN,檔案權限只有自己能讀,而且這個檔不進 git。這是底座那篇立的規則:所有 token、token、密碼一律從 .env 讀,程式碼裡不能有,缺了就停下來問,不能自己編一個假的先跑。
另外還要一個數字:你自己的 chat id。這個小秘只認你一個人,用數字 id,不能用帳號名,帳號名可以改,數字不會變。
在 Telegram 搜尋列搜尋 @userinfobot 或 @raw_data_bot,點擊進入對話並按下 Start(或隨便傳送一則訊息)。Bot 會立即回傳包含你帳號資訊的 JSON 或文字:找到 Id: 或 "id": 後方的一串純數字(例如 123456789)。

https://ithelp.ithome.com.tw/upload/images/20260828/20181284zciGQ5cP7U.png

https://ithelp.ithome.com.tw/upload/images/20260828/201812849uDMLTYzh3.png

好了,有 TG token 及 ID,可以叫小秘開工了:

token 及 id 在 .env 裡了,接下來一段 prompt 叫 claude 把聊天核心接上這個 bot。

把聊天核心接上 Telegram。bot 的 token 我已經放在 .env,變數名 TELEGRAM_BOT_TOKEN;
我的 chat id 也在 .env,變數名 TELEGRAM_OWNER_CHAT_ID。
🔴 這兩個值 ⛔ 不可以寫進程式碼、不可以印在 log、不可以進 git;缺了就停下來問我,⛔ 不可以自己編一個假的先跑。

一、連線方式用 long polling,由聊天核心主動去 Telegram 拿訊息。
    ⛔ 不用 webhook、不對外開任何 port,這台對外還是只有小秘那一頁。
    🔴 同一把 key 同一時間只能有一個程式在拿訊息,兩個一起拿 Telegram 會回 Conflict,兩邊都收不到。
       啟動前先確認舊的聊天核心已經停乾淨。

二、只認我一個人:不是 TELEGRAM_OWNER_CHAT_ID 傳來的訊息一律不回、不記、不進模型。
    ⚠️ 白名單用數字 id,⛔ 不可以用 @帳號名,帳號名會改,數字不會。

三、收到訊息先回一句「收到,處理中…」,再去跑模型與工具,答案出來再回第二句。
    本地模型加工具呼叫要幾秒鐘,⛔ 不可以讓我對著空白等。

四、對話走路由器到本地那台語言模型,⛔ 不可以直連。
    待辦、行事曆、提醒、發票是小秘的工具,天氣是另外一個小工具,模型只負責聽懂與呼叫。
    🔴 查資料一定要先呼叫工具再回答;沒呼叫工具 ⛔ 不准宣稱「已經幫你設定」。
    刪除類的動作,回話要帶被刪的那一筆是什麼,⛔ 不可以只回「已取消」。

五、提醒的發送管道維持 LINE,這一篇 Telegram 只做輸入,⛔ 不要動發送那一段。
    小秘排程到點若要主動推 Telegram,直接打送訊息的 API,那是推送不佔 polling;⛔ 不要再開第二條拿訊息的連線。

六、留一個 /restart 指令,只重啟聊天核心自己,⛔ 不重啟小秘與路由器。

規則:每做完一步就 commit;先在容器裡用一句「你是誰」測通,再放給我用。

幾個決定是事先想好的,不是它自己決定的:
連線方式用 long polling,由聊天核心主動去 Telegram 拿訊息,不用 webhook,不對外開 port,這台機器對外還是只有小秘那一頁。
只認我一個人,不是我的訊息不回、不記、不進模型。
收到訊息先回一句「收到,處理中…」,再去跑模型與工具,答案出來再回第二句。因為我們的 Qwen 3.6 比較慢一點,會要想一下.... 呼叫要幾秒鐘,對著空白等幾秒鐘的人會以為它死了,所以先送「收到,處理中…」。
對話走路由器到本地那台語言模型,不可以直連。待辦、行事曆、提醒、發票是工具,模型只負責聽懂與呼叫;查資料一定要先呼叫工具再回答,沒呼叫工具不准宣稱「已經幫你設定」。這條是被騙過才加的:它曾經憑空回「已經歸檔了」,但其實什麼都沒有做。
規則:連線方式、誰能講話、先回什麼、走哪條路,這四件事寫在 prompt 裡,不留給模型猜。

第一句話

第一句話:問天氣先回「收到,處理中…」再回答;問提醒事項,回的是底座那篇設的兩筆,連 cron 一起列

https://ithelp.ithome.com.tw/upload/images/20260828/201812845wcCwrTLd6.png

接好之後先問天氣。在 Telegram 打:高雄市。它先回「收到,處理中…」,再回今天的天氣與建議帶傘。再問「目前的提醒事項?」,它回兩筆:每天早上 11:00 提醒發文 iron30,每天晚上 21:00 Iron30 發文檢查,連 cron 表達式一起列出來,還問要不要新增、修改或刪除。這兩筆就是底座那篇設在頁面上的,現在用講的問得到。頁面上的資料與 Telegram 裡的回答是同一份。

問它是什麼模型,它回的是它是誰、負責哪些事;模型是哪一個是路由器的事

https://ithelp.ithome.com.tw/upload/images/20260828/20181284CObx7E5Xnp.png

再問:hello,你是甚麼模型。它沒有回答是什麼模型,回的是它是誰:我的個人助理 agent,負責日曆、待辦、提醒、知識庫、發票對獎、天氣查詢、文章撰寫。這個答案比我問的好。模型是哪一個是路由器的事,小秘不需要知道,也不應該對外講。規則:第一個測試不是問它會什麼,是問它「你知道我已經有什麼」。

用講的加一條提醒

接下來測寫入。小秘的提醒頁先看一眼,清單兩筆,都是 iron30。

接之前的提醒頁:清單兩筆,都是 iron30

https://ithelp.ithome.com.tw/upload/images/20260828/20181284ro3vILW7f4.png

在 Telegram 打:14:10,提醒我:時間到。它回:已設定 14:10 的提醒,時間到會透過 LINE 通知你。

Telegram:14:10,提醒我:時間到。它回已設定,時間到會透過 LINE 通知

https://ithelp.ithome.com.tw/upload/images/20260828/20181284xSetIzYHXb.png

回頭看提醒頁,清單變三筆,多了一條「時間到。」,時間 2026-08-28 14:10,跟我講的一樣。這一步真正在驗的不是它會不會回話,是它回的話跟頁面上的資料對不對得上。回話可以是模型編的,頁面不會。規則:每一句「已設定」都要回頁面看一次,看到那一列才算數。

提醒頁變三筆:多了「時間到。」,2026-08-28 14:10,跟講的一樣

https://ithelp.ithome.com.tw/upload/images/20260828/20181284yHoEOV9PBP.png

整點報時

再測重複的。在 Telegram 打:每個整點,報時給我。它回:已設定每小時整點透過 LINE 報時。

Telegram:每個整點,報時給我。它回已設定每小時整點透過 LINE 報時

https://ithelp.ithome.com.tw/upload/images/20260828/20181284tzDopOw2lT.png

提醒頁變四筆,多了「報時:現在是整點」,標成重複,排程表達式是每小時 0 分。

提醒頁變四筆:「報時:現在是整點」標成重複,排程表達式是每小時 0 分

https://ithelp.ithome.com.tw/upload/images/20260828/201812842otc9v2R7w.png

14:00 手機的 LINE 群組真的響了:報時:現在是整點。同一個群組上面還有 11:00 那一則:提醒:每天早上 11:00 記得發文 iron30。底座那篇設的提醒,在寫這一篇的當天早上正常響了。

手機的 LINE:11:00 底座那篇設的發文提醒響了,14:00 報時也響了

https://ithelp.ithome.com.tw/upload/images/20260828/20181284GsKnSmxNHY.jpg

規則:重複的提醒一定要等它真的響一次,頁面上有一列不等於排程器裡有一個工作。

取消

在 Telegram 打:取消整點報時。它回:已取消整點報時,還把原提醒的名字複述一次:報時:現在是整點。

Telegram:取消整點報時。它回已取消,並把原提醒的名字複述一次

https://ithelp.ithome.com.tw/upload/images/20260828/20181284PUPJQ3O2rh.png

提醒頁回到三筆。

提醒頁回到三筆

https://ithelp.ithome.com.tw/upload/images/20260828/20181284ooLAXrYhMo.png

複述原提醒的名字這件事是有用的:清單裡有四筆,「取消整點報時」這句話要對到哪一筆是模型判斷的,它把判斷結果講出來,我才知道它刪對了。規則:刪除類的動作,回話裡要帶被刪的那一筆是什麼,不能只回「已取消」。

嘴巴在 Telegram,推播在 LINE

整個測試裡有一件事讀者可能已經注意到:指令是在 Telegram 下的,提醒響的地方是 LINE。這不是漏接,是底座那篇的決定:提醒的發送管道是 LINE 推播,失敗退 Email。這一篇只接輸入,沒有動發送。兩條線分開有一個好處:輸入那條線壞了,提醒照樣響;推播那條線壞了,我還是能用講的查資料。做之前先確認過一件事:小秘排程到點要主動推 Telegram 的時候,用的是直接送訊息的那個 API,那是推送,不佔 polling,跟聊天核心那條拿訊息的線不衝突,不會再踩一次 Conflict。規則:進來的訊息一條線、出去的推播另一條線,兩條線各自能壞。

接上了

現在這個小秘聽得到我講話了:用講的能查、能加、能取消,每一句都能在頁面上對到一列。Telegram 這條線的成本是一個帳號、一個 bot、一把 key、一段 prompt,不用網域、不用審核、不用對外的 port。
接下來接 LINE。LINE 三樣都要:網域、審核、對外的 webhook。麻煩。


上一篇
Day19 請個小秘 - 1 :行事曆、待辦、提醒
系列文
一個人的機房:用 Claude 建置 AI 機房20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言