<!-- .slide: data-background="https://hackmd.io/_uploads/rk51ahkcn.png" --> # Telegram Bot 開發 Sean 韋詠祥 Note: 日期:2023-07-22(六)Day 3 課程時間:14:30 - 17:30 14:30 - 15:30 (60 min) 建立環境、Echo Bot、晚餐吃什麼 15:40 - 16:30 (50 min) 保存狀態、隱私模式、修改資訊 16:40 - 17:30 (50 min) 報時機器人、猜拳 Bot、HTTP 喵咪 Day 1 下午 yc 帶 1 Hr 認識 TG Bot Day 3 上午 Package、爬蟲 前一堂 廣度課程(AI、Arduino) 晚餐後為黑客松時段 ---- ## Sean 韋詠祥 - [中文 Telegram 討論區](https://t.me/PublicGroupForzh) 管理者 - [台灣群組導航](https://t.me/ChatTW) 創始人 - Telegram [客服團隊](https://tsf.telegram.org/) 成員 ![](https://hackmd.io/_uploads/Sk7KX1Vd2.png) Note: 我的第三堂課 Day 1 晚上 廣度課程 網路治理(選) Day 2 晚上 Py Module Day 3 下午 TG Bot 開發(這堂) ---- ## 課前準備 - 用電腦打開 Telegram 並登入帳號 - 確認電腦中有 Python 及 poetry 環境 Note: 給 3 分鐘確認已登入 TDesktop 14:35 繼續 --- # 建立 Telegram Bot 🤖 <!-- .element: class="r-fit-text" --> Note: 取得 Bot Token 14:35 開始 先照簡報講一次 2 min 實際操作一次 3 min 再留時間給大家實作 5 min 進階 + 緩衝 5 min 14:50 繼續 ---- ## 找到 Bot Father 點擊 [@BotFather](https://t.me/BotFather) 並按下「START」 ![](https://hackmd.io/_uploads/H1VYLJVOn.png) ---- ## 建立新的 Bot 使用 `/newbot` 指令,輸入名字、`@username` ![](https://hackmd.io/_uploads/HyvfwJNd2.png) ---- ## 完成! 這串 `12345:AAJqs_w-4` 格式的文字就是你的 Token <!-- .element: class="r-fit-text" --> ![](https://hackmd.io/_uploads/BJ0Ev1VOn.png) ---- ## 測試 Telegram API URL: [`https://api.telegram.org/bot<TOKEN>/getMe`](https://api.telegram.org/bot<TOKEN>/getMe) <!-- .element class="r-fit-text" --> ![](https://hackmd.io/_uploads/HkhF3J4uh.png) ---- ## 提醒事項 - 請將 Bot Token 保存好,不要傳給其他人 - 如果外洩了,可以用 `/revoke` 指令重置 ---- ## 實作時間 - 請想好 Bot 的名字、username - 找到 [@BotFather](https://t.me/BotFather),依指示建立 Bot - 成功建立後,用瀏覽器測試 Bot Token Note: 14:40 開始 講解 2 min 示範 3 min 實作 5 min 14:45 繼續 進階 5 min 停在這,先給學員實作 過五分鐘介紹 getUpdates(進階) ---- ## 再次測試 Telegram API URL: `https://api.telegram.org/bot<TOKEN>/getUpdates` <!-- .element class="r-fit-text" --> ![](https://hackmd.io/_uploads/SyZwBhIun.png) Note: 14:45 介紹 實作到 14:50 繼續 --- # Python Telegram Bot 🐍 <!-- .element: class="r-fit-text" --> 撰寫你的第一隻 Telegram 機器人 Note: 確認完 token 有效 改用 Python 處理 14:50 開始 建立環境、安裝套件 講解 3 min 學員操作 7 min 15:00 繼續 ---- ## 建立開發環境 - 建立新資料夾(`mkdir ~/tg-bot`) - 用 VS Code 開啟(`code .`) - 初始化專案(`poetry init`) ---- ## 安裝 telebot 套件 指令:`poetry add pyTelegramBotAPI` ```bash poetry add pyTelegramBotAPI ``` Note: 14:50 開始 講解 3 min 學員操作 7 min 15:00 繼續 ---- ## 練習:Echo Bot ![](https://hackmd.io/_uploads/rJ-rNGSYh.png) Note: 15:00 開始 下一頁詳細需求 ---- ## Echo Bot 開發要求 請寫出你的第一隻 bot - 需求一:說什麼回什麼 - 需求二:輸入 `/ping` 回覆 `PONG` - 需求三:執行程式後,用 `print()` 說已上線 可以從 [echo_bot.py](https://github.com/eternnoir/pyTelegramBotAPI/blob/master/examples/echo_bot.py) 範例開始修改 Note: 15:00 開始 講課 3 min 學員練習 7 min 到 15:10 回來 帶學員操作 5 min --- # 練習:晚餐吃什麼 🍽️ <!-- .element: class="r-fit-text" --> 不只我有選擇障礙吧...? Note: 15:15 開始 講解 5 min 學員實作 10 min 15:30 下課 休息到 15:40 示範 5 min 緩衝 5 min ---- ## 前情提要 每次到了吃飯時間 為了晚餐要吃什麼都煩惱好久 學會 Telegram Bot 開發的你 決定做一隻 Bot 解決世紀難題 Note: 15:15 開始 講解 5 min 學員實作 10 min 15:30 下課 休息到 15:40 示範 5 min 緩衝 5 min ---- ## 成品範例(一) ![](https://hackmd.io/_uploads/H1uBUzBYn.png) ---- ## 成品範例(二) ![](https://hackmd.io/_uploads/HJ9ILfrK2.png) ---- ## 需求一:/add 新增品項 建立 `foods` 全域變數 在收到 `/add xxx` 指令時 把 `xxx` 放進 `foods` 列表 然後回覆 okay ---- ## 需求二:/list 列出所有品項 告訴使用者目前有哪些美食 合併字串後,用一則訊息發送 ---- ## 需求三:/eat 隨機決定美食 幫使用者決定晚餐要吃什麼 從美食清單中,隨機挑一個給使用者 Hint:可以用昨天教到的 `random` 函式庫 ---- ## 實作時間 基本需求: - `/add` 新增品項 - `/list` 列出所有品項 - `/eat` 決定隨機美食 ```bash # 可以複製 Echo Bot 來改 cp echo_bot.py my_bot.py ``` Note: 提醒學員 function 名稱不要撞 keyword 先往後介紹進階功能、官方文件 再翻回來這頁放著 15:15 開始 講解 5 min 學員實作 10 min 15:30 下課 休息到 15:40 示範 5 min 緩衝 5 min 15:50 繼續 ---- ## 進階功能 - `/help` 使用說明 - `/remove` 我不喜歡吃這個 - 看到關鍵字「吃什麼」就跳出來刷存在感 - 支援多位使用者(獨立美食清單) - 顯示最近 5 次推薦的食物、時間、使用者 Note: 給提早做完的學員練習 不留講解/示範時間 再往後翻一頁,講完 msg 再開始練習 ---- ## 補充:收到的 message 裡有什麼 <!-- .element: class="r-fit-text" --> 練習自己看文件 (⁎⁍̴̛ᴗ⁍̴̛⁎) https://pytba.readthedocs.io/en/latest/types.html#telebot.types.Message <!-- .element: class="r-fit-text" --> Hint: 常用的有 from_user、text、chat、date Note: 給提早做完的學員參考 不留講解/示範時間 講完後,先翻回去 ---- ## 中場休息 15:30 - 15:40 起身活動筋骨 Note: 14:30 - 15:30 (60 min) 建立環境、Echo Bot、晚餐吃什麼 15:40 - 16:30 (50 min) 保存狀態、隱私模式、修改資訊 16:40 - 17:30 (50 min) 報時機器人、猜拳 Bot、HTTP 喵咪 15:40 回到前面,示範 Dinner Bot --- # 保存程式狀態 💾 用 JSON 檔儲存當前狀態 Note: 15:50 開始 講解示範 3 min 學員實作 7 min 16:00 繼續 ---- ## 現況回顧 - 晚餐吃什麼 美食清單 - 重開了,然後呢 ---- ## 可以如何保存呢? - 資料庫 - 文字文件.txt - JSON 檔 ---- ## 回顧:[上午 Package 課程][json] 教到.... <!-- .element: class="r-fit-text" --> [![](https://hackmd.io/_uploads/SJw6CYqYh.png)][json] [json]: https://hackmd.io/@Vincent550102/BJhTDxIr3#/5/11 Note: 吃飯前 Vincent 帶過基礎 ---- ## 實作時間 請儲存在 `foods.json` --- # 邀請 Bot 加入小隊 🫡 <!-- .element: class="r-fit-text" --> Note: 16:00 開始 講解 2 min 實作 3 min 16:05 繼續 ---- ## 邀請群組 ![](https://hackmd.io/_uploads/HJ-fiqcK2.png) ---- ## 選擇群組 ![](https://hackmd.io/_uploads/Byrvjq9Kn.png) ---- ## 實作時間 請加到你們的小隊群 Note: 16:00 開始 講解 2 min 實作 3 min 16:05 繼續 --- # 設定 Privacy Mode 🔒 <!-- .element: class="r-fit-text" --> Note: 16:05 開始 講解示範 3 min 實作 7 min 16:15 繼續 ---- ## 預設能收到.... - 所有私訊 - 加入退出通知 - 傳給你的指令 - 回覆你的內容 Ref: [Bot FAQ](https://core.telegram.org/bots/faq#what-messages-will-my-bot-get) ---- ## 如果想看到所有訊息呢? ![set privacy](https://hackmd.io/_uploads/HysYIhBth.png) Note: My Bot > @bot > Bot Settings > Group Privacy > Turn on ---- ## 實作時間 設定 Privacy Mode - 找到 BotFather - 使用 /mybots 指令打開選單 - Bot Settings > Group Privacy Note: 16:05 開始 講解示範 3 min 實作 7 min 16:15 繼續 ---- ## 組內測試 現在,輸入 `/add 美食` 大家都收得到 開始大亂鬥吧! Note: 不要洗板 --- # Bot 資訊設定 ℹ️ Note: 16:15 開始 指令列表 5 min 16:20 繼續 相關資訊 10 min 16:30 下課休息 16:40 繼續課堂 ---- ## 設定指令列表 ⌨️ ![](https://hackmd.io/_uploads/B1WPRccY3.png) Note: 16:15 開始 指令列表 5 min 16:20 繼續 相關資訊 10 min ---- ## 設定方式 ![](https://hackmd.io/_uploads/B1IRksqY3.png) ---- ## 實作時間 找 Bot Father > Edit Bot > Edit Commands 指令格式: ``` help - 使用說明 add - 新增美食 .... ``` ---- ## 設定頭貼 📷 Edit Botpic 小技巧:https://picsum.photos/1280/1280 ![](https://hackmd.io/_uploads/r1Y1Zicth.jpg) ---- ## 設定關於 💬 Edit About ![](https://hackmd.io/_uploads/rJ8Xbo5Y2.png) ---- ## 設定描述 ✍️ Edit Description / Edit Desc Picture 小技巧:https://picsum.photos/640/360 ![](https://hackmd.io/_uploads/BJtFZi5Kn.jpg) ---- ## 中場休息 16:30 - 16:40 找隊友聊聊題目 Note: 14:30 - 15:30 (60 min) 建立環境、Echo Bot、晚餐吃什麼 15:40 - 16:30 (50 min) 保存狀態、隱私模式、修改資訊 16:40 - 17:30 (50 min) 報時機器人、猜拳 Bot、HTTP 喵咪 --- # 報時機器人 ⏰ Inline Keyboard Note: 16:40 Intro + Demo 16:45 實作 16:50 教學 16:55 繼續 ---- ## 成品範例 ![](https://hackmd.io/_uploads/Hk-eMaqK2.jpg) ---- ## 回顧:昨天 [Module][datetime] 上課內容 [![](https://hackmd.io/_uploads/SyW5E2qtn.png)][datetime] [datetime]: https://hackmd.io/@Sean64/py-module-sitcon2023#/4/3 ---- ## 鍵盤使用方式 - 2D List 二維陣列 - callback_data / Callback Query ---- ## 程式碼參考 [![](https://hackmd.io/_uploads/SkeYLpctn.png)](https://tg.pe/XmN) Code: https://tg.pe/XmN ---- ## 實作時間 - 讓 Bot 發送帶有按鈕的訊息 - 點擊按鈕後,更新訊息內容 - 完成後跳出提示文字 可參考簡報前一頁寫法 Note: 16:40 Intro + Demo 16:45 實作 16:50 教學 16:55 繼續 --- # 練習:猜拳 Bot ✌️ Inline Keyboard Note: 16:55 Intro + Demo 17:00 實作 10 min 17:10 教學 17:15 繼續 ---- ## 成品範例 ![](https://hackmd.io/_uploads/BJI1t6cKh.jpg) ---- ## 實作時間 基本需求: - 收到 /game 指令,隨機挑選自己出的拳 - 訊息下方出現「剪刀 石頭 布」三個按鈕 - 玩家出拳後,顯示出了什麼 Note: 16:55 Intro + Demo 17:00 實作 17:10 教學 17:15 繼續 ---- ## 進階功能 - 記錄每個人的勝率 - 同一則訊息重新開局 - 雙人遊玩模式 - 支援多場遊戲同時進行 --- # HTTP 喵咪 🐈 Inline Bot Note: 17:15 介紹示範 17:20 實作 17:25 教學 17:30 下課 ---- ## 使用範例 ![](https://hackmd.io/_uploads/rykiQ0qK2.jpg) ---- ## 設定方式 ![](https://hackmd.io/_uploads/SJXkC69Fh.jpg) ---- ## 程式範例 ![](https://hackmd.io/_uploads/S1INo1oFh.png) ``` from telebot.types import InlineQueryResultPhoto ``` ---- ## 實作時間 - 啟用 inline bot 功能 - 任意查詢時,能出現 200 OK 圖片 - 輸入 404、502 等狀態碼,能給出對應結果 - 進階:過濾不屬於狀態碼的輸入 - 進階:在圖片 [caption](https://pytba.readthedocs.io/en/latest/types.html#telebot.types.InlineQueryResultPhoto) 加上<br>  「404 Not Found」等對應名稱 Note: 17:15 介紹示範 17:20 實作 17:25 教學 17:30 下課 --- # Thanks 🥳 自由練習 & QA <br> 投影片連結:https://hackmd.io/@Sean64/tg-bot-sitcon2023 <!-- .element: class="r-fit-text" --> <br> [![CC-BY](https://mirrors.creativecommons.org/presskit/buttons/88x31/png/by.png)](https://creativecommons.org/licenses/by/4.0/deed.zh_TW) ###### 這份投影片以 [創用 CC - 姓名標示](https://creativecommons.org/licenses/by/4.0/deed.zh_TW) 授權公眾使用,原始碼及講稿請見 [此連結](https://hackmd.io/@Sean64/tg-bot-sitcon2023/edit)。 Note: 時間規劃 | Time | Topic | Duration | |:-------------:|:---------------:|:--------:| | 14:30 ~ 14:35 | 開場、課前準備 | 5 min | | 14:35 ~ 14:50 | 建立 Bot | 15 min | | 14:50 ~ 15:00 | 安裝 telebot | 10 min | | 15:00 ~ 15:15 | Echo Bot | 15 min | | 15:15 ~ 15:30 | 晚餐吃什麼 | 15 min | | 15:30 ~ 15:40 | 中場休息 | 10 min | | | | | | 15:40 ~ 15:50 | 晚餐吃什麼 示範 | 10 min | | 15:50 ~ 16:00 | 保存狀態 | 10 min | | 16:00 ~ 16:05 | 邀請加入群組 | 5 min | | 16:05 ~ 16:15 | 隱私模式 | 10 min | | 16:15 ~ 16:20 | 指令列表 | 5 min | | 16:20 ~ 16:30 | 修改 Bot 資訊 | 10 min | | 16:30 ~ 16:40 | 中場休息 | 10 min | | | | | | 16:40 ~ 16:55 | 報時機器人 | 15 min | | 16:55 ~ 17:15 | 猜拳 Bot | 20 min | | 17:15 ~ 17:30 | HTTP 喵咪 | 15 min | ---- ## 參考資料 / 延伸閱讀 - 教學文章:[core.telegram.org](https://core.telegram.org/bots)、[blog.sean.taipei](https://blog.sean.taipei/2017/05/telegram-bot) - 套件:[pyTelegramBotAPI](https://github.com/eternnoir/pyTelegramBotAPI) - 版本控制:[Git 使用教學](https://www.youtube.com/watch?v=b7NDvFd7bJw) ---- ## 合作單位 ![](https://hackmd.io/_uploads/rkHEkI0ch.png)
{"metaMigratedAt":"2023-06-18T05:11:32.028Z","metaMigratedFrom":"YAML","title":"Telegram Bot 開發 - SITCON Camp 2023 主線課程","breaks":true,"description":"Sean 韋詠祥 / 2023-07-22 14:30","slideOptions":"{\"backgroundTransition\":\"none\",\"parallaxBackgroundSize\":\"cover\",\"parallaxBackgroundHorizontal\":0,\"parallaxBackgroundVertical\":0,\"parallaxBackgroundImage\":\"https://hackmd.io/_uploads/SkaithcP2.png\"}","contributors":"[{\"id\":\"fcc5ac68-1288-47e7-babb-af51a3368c4a\",\"add\":73,\"del\":6},{\"id\":\"8a6148ae-d280-4bfd-a5d9-250c22d4675c\",\"add\":17275,\"del\":7289}]"}
    2253 views
   owned this note