<!-- .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/) 成員

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」

----
## 建立新的 Bot
使用 `/newbot` 指令,輸入名字、`@username`

----
## 完成!
這串 `12345:AAJqs_w-4` 格式的文字就是你的 Token
<!-- .element: class="r-fit-text" -->

----
## 測試 Telegram API
URL: [`https://api.telegram.org/bot<TOKEN>/getMe`](https://api.telegram.org/bot<TOKEN>/getMe)
<!-- .element class="r-fit-text" -->

----
## 提醒事項
- 請將 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" -->

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

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
----
## 成品範例(一)

----
## 成品範例(二)

----
## 需求一:/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" -->
[][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 繼續
----
## 邀請群組

----
## 選擇群組

----
## 實作時間
請加到你們的小隊群
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)
----
## 如果想看到所有訊息呢?

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 繼續課堂
----
## 設定指令列表 ⌨️

Note:
16:15 開始
指令列表 5 min
16:20 繼續
相關資訊 10 min
----
## 設定方式

----
## 實作時間
找 Bot Father > Edit Bot > Edit Commands
指令格式:
```
help - 使用說明
add - 新增美食
....
```
----
## 設定頭貼 📷
Edit Botpic
小技巧:https://picsum.photos/1280/1280

----
## 設定關於 💬
Edit About

----
## 設定描述 ✍️
Edit Description / Edit Desc Picture
小技巧:https://picsum.photos/640/360

----
## 中場休息
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 繼續
----
## 成品範例

----
## 回顧:昨天 [Module][datetime] 上課內容
[][datetime]
[datetime]: https://hackmd.io/@Sean64/py-module-sitcon2023#/4/3
----
## 鍵盤使用方式
- 2D List 二維陣列
- callback_data / Callback Query
----
## 程式碼參考
[](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 繼續
----
## 成品範例

----
## 實作時間
基本需求:
- 收到 /game 指令,隨機挑選自己出的拳
- 訊息下方出現「剪刀 石頭 布」三個按鈕
- 玩家出拳後,顯示出了什麼
Note:
16:55 Intro + Demo
17:00 實作
17:10 教學
17:15 繼續
----
## 進階功能
- 記錄每個人的勝率
- 同一則訊息重新開局
- 雙人遊玩模式
- 支援多場遊戲同時進行
---
# HTTP 喵咪 🐈
Inline Bot
Note:
17:15 介紹示範
17:20 實作
17:25 教學
17:30 下課
----
## 使用範例

----
## 設定方式

----
## 程式範例

```
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>
[](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)
----
## 合作單位

{"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}]"}