---
# System prepended metadata

title: Telegram Bot 開發 - SITCON Camp 2023 主線課程
tags: [presentation]

---

---
type: slide
tags: presentation
title: Telegram Bot 開發 - SITCON Camp 2023 主線課程
description: Sean 韋詠祥 / 2023-07-22 14:30
slideOptions:
    backgroundTransition: none
    parallaxBackgroundSize: 'cover'
    parallaxBackgroundHorizontal: 0
    parallaxBackgroundVertical: 0
    parallaxBackgroundImage: https://hackmd.io/_uploads/SkaithcP2.png
---

<!-- .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)