Python Telegram bot 部署到 Heroku

更新 發佈閱讀 12 分鐘

使用 Telegram 官方推薦的方式,實作 webhook 和部署機器人到 Heroku。

本文只講部署(deploy)的部分,撰寫程式和申請帳號、操作 Heroku 教學很多了請自行 google。
本文章撰寫給:
1. 想要部署寫好的機器人上 Heroku 但不知道要怎麼做的人
2. 看過各路大神的教學了但還是懵懵懂懂的人
3. 看了半天不懂「一定要用 flask 之類的套件才能實作 webhook 嗎」的人
4. 「我不想看英文」的人

前言

最近總算開始動手實作完一年前想到要做的 Telegram bot 也真的實作完成了(沒想到只花了兩天,可是拖延了一年XD)做出來之後當然就要找一個地方丟上去讓機器人運作囉,雖然說可以自己的電腦跑啦,但本人沒這個打算,所以最後找到了 Heroku 這個雲端平台。

網路上也滿多 python telegram bot 部署到 Heroku 的教學,那聽起來照著做就好啦?原因是這樣的:個人比較傳統,是 Notepad++打開後按照官方的範例和一些大大的教學寫出來的。可是不少人在開發階段就使用了 flask 等套件直接用 webhook;而我還是用 polling 的方式,因此就需要修改 code 搭配 flask 實作 webhook 並部署。(polling 和 webhook 的差別可見此位大大撰寫的教學文

一開始爬了幾篇前輩們用中文寫的教學八九不離十都是這招,正當我開始想套用的時候,有位大神提點了我 flask 的作用,讓我開始重新思考並改用英文搜尋,結果就發現了其實可以靠官方和 heroku 提供的方法來解決(而且官方文件其實都有寫0.0)。本文就是為這個方式留下紀錄提供給想用官方提供的方法但不想看英文的人。

先聲明,只要能達成目的的都是方法,沒有優劣之分。另外,也可能此方法是後來才新增支援的,所以前人都沒有紀錄。請大家依照自身的需求決定用何種方式部署最適合自己的專案。

事前準備

1. 不用說,就是你寫好的機器人。沒有的話也可以使用範例的。
2. Heroku CLI
3. git(使用和部署 Heroku 需要)
4. 已經建立好的一個空白 heroku 專案

本文使用的範例程式碼放在 Github 上了。
https://github.com/hms5232/deploy-python-telegram-bot-on-heroku

開始

為了方便大家有個對照,這邊會在每個步驟最後附上對照目前的狀態對應範例程式碼的哪個 commit。

一開始專案狀態會是這顆 commit(尚未為了 heroku 做出任何修改)

建立 Pipfile ★

pipenv 是一套整合套件管理及虛擬環境的的工具,詳細介紹可以去查詢一下,總之是一套個人在做 Python 專案常用的工具。而 Heroku 現在支援在部署的時候使用 Pipfile 來自動安裝所需要的套件(以前要 requirements.txt)。沒安裝過的同學請在命令列下 pip install pipenv 來安裝;已經有安裝的請生出 Pipfile 並產生 Pipfile.lock 吧;如果你這邊已經完成了請直接下一步吧。

raw-image

此時狀態:https://github.com/hms5232/deploy-python-telegram-bot-on-heroku/commit/d28019acea6bd9ed289d75f8ffbb93875d4481d9

建立 Procfile ★★★

Procfile 是 heroku 部署時會用到的檔案,用來讓 Heroku 知道要如何部署並執行你的專案。請注意檔案名稱只要 Procfile 就好不需要有副檔名!內容也請只有接下來說的這行

檔案內容請寫(注意:Python 2 的話請用 python):

web: python3 {你的機器人}.py

例如(依照我的範例程式碼的話):

web: python3 bot.py

其中 web 是 process model ,後面則是你部署上去後要執行的指令。

此時狀態:https://github.com/hms5232/deploy-python-telegram-bot-on-heroku/commit/727b33c262b0b1c4cfc1137fef7be07aa4fb61ed

修改程式碼中關於讀取設定的部分

此部分僅針對有將一些敏感設定採用另外讀取方式的人需要

Heroku 的 dyno 以我自己的理解,就很像 Docker container 一樣,容器關掉東西就通通消失了,所以傳統的一個 env 檔案之類的設定不太適用(如果有上去 repo 的話,大家都知道這種敏感檔案要另外處理)。當然應該另外有方法解決,只是這邊採用「環境變數」的方式:

首先,大家可以看到範例程式碼中原先讀取 token 的方式是讀取組態檔

env = ConfigParser()
env.read('config.ini')
TOKEN = env['bot']['TOKEN']

現在請改成:

# 如果有其他需求的變數也請一併設定
TOKEN = os.environ["TOKEN"]

然後到 heroku 網站下自己的專案→setting→Reveal Config Vars→新增剛剛設定的 Config Vars:(例如剛剛的 TOKEN 請填入 BotFather 給你的機器人 token)

raw-image

此時專案狀態:https://github.com/hms5232/deploy-python-telegram-bot-on-heroku/commit/db994c28598e9513c63e881cfa1c702d280984a7

修改機器人和 Telegram API 的溝通方式 ★★

接下來就要從 polling 的方式改成 webhook 的方式啦~

首先請先在程式碼中加上下面這行(我自己是跟剛剛設定環境變數的區塊放一起,總之只要在開始呼叫機器人之前宣告好即可):

PORT = int(os.environ.get('PORT', '8443'))

接著修改 updater.start_polling() 成:(請自行填入自己的 heroku 專案名稱,別傻傻的就複製貼上什麼都沒改啊)

updater.start_webhook(listen="0.0.0.0",
port=PORT,
url_path=TOKEN)
updater.bot.set_webhook("https://{你的 heroku 專案名稱}.herokuapp.com/" + TOKEN)

這樣就完成修改溝通方式以及設定 webhook 了,最後就 commit 並推上 heroku 吧!請開啟命令列:

git commit -am "準備推上 heroku 囉"  # 這邊請依照情況自己做 commit
heroku login # 如果之前沒先登入過的話
heroku git:remote -a {你的 heroku 專案名稱}
git push heroku master

此時專案狀態:https://github.com/hms5232/deploy-python-telegram-bot-on-heroku/commit/d7a0b2fd23108e1d523adc103d0ed5c9d5d46654

完成

如果有成功部署上去,應該會看到 heroku 自動偵測到 Python app 並依照 Pipenv、Pipenv.lock 去安裝需要的相依套件,最後照著 Procfile 去執行你的機器人。

如果是使用範例程式碼的話,在啟動(Start)機器人的時候就會跳出問候訊息;傳送 /hi 的話就會回你「Hello world!」。到這邊一切大功告成~灑花

其他補充

在部署到 heroku 的路上產生的疑問或踩過的坑

一定要在 maser 分支上嗎?

可能大家會在一些教學文上看到大家都是用 master 分支當範例,或是有看到「heroku 只有在分支是 master 的時候才會有作用」之類的句子。這是正確的嗎?一定只能用 master 分支嗎?

教學們並沒有說錯,但講不夠明確,正確的應該是:推上去 heroku 『後』的分支要是 master,heroku 才會運作。也就是說,不管你的分支叫什麼阿貓阿狗奇怪的名稱,只要上到 heroku 這個 remote repo 後東西是在他的 master 就可以!

那具體來說要怎麼做?一言以蔽之的話就是下面這行指令:

git push heroku +HEAD:master

有興趣想知道為什麼的人可以參考文章最後有附上參考來源或直接點此

Heroku 免費方案會睡覺,影響很大嗎?

以前是怎樣我不敢說,現在的話以我們部署機器人來說,我看大家比較有感的應該是「三十分鐘沒有活動則會進入休眠」,而其他什麼「每天要睡 8 小時」之類的倒是沒看到。

最新的方案及內容請參考官方網站最準
https://www.heroku.com/pricing

那這個休眠會差很多嗎?我自己實際部署使用後,測試下來休眠後傳送訊息等機器人起床大約要 10 秒。這樣的影響大還是小請大家自行評估囉。

後記

部署成功,好開心啊!

如果本文有任何錯誤、執行上有碰到問題或是有更好的做法及替代方案都歡迎留言給我。也祝大家順利部署自己的作品(不論用什麼方式和部署到哪裡),成功上線後歡迎留言分享喔。

在 Medium 上的第一篇文就獻給這篇了。

如果覺得寫的棒有幫助想小額贊助的話也歡迎~

Buy hms5232 a Coffee. ko-fi.com/hms5232
Buy a Coffee for hms5232 with Ko-fi.comko-fi.com

參考資料

How to push different local Git branches to Heroku/master
Heroku has a policy of ignoring all branches but 'master'. While I'm sure Heroku's designers have excellent reasons for…stackoverflow.com

python-telegram-bot/python-telegram-bot
Our examples usually start the bot using Updater.start_polling. This method uses the getUpdates API method to receive…github.com

How to Deploy a Telegram Bot using Heroku for FREE
Using the python-telegram-bot librarytowardsdatascience.com

Configuration and Config Vars
A single app always runs in multiple environments, including at least on your development machine and in production on…devcenter.heroku.com

留言
avatar-img
留言分享你的想法!
avatar-img
hms5232的沙龍
5會員
23內容數
hms5232的沙龍的其他內容
2025/04/03
輕小說式標題,看標題就看完整篇文。重點就是標題說的,有興趣聽廢話再點進來吧。
Thumbnail
2025/04/03
輕小說式標題,看標題就看完整篇文。重點就是標題說的,有興趣聽廢話再點進來吧。
Thumbnail
2025/03/15
謝謝蘇媽讓我的 9700X 突飛猛進,讓我拿到 3DMark Free PC Upgrade 成就!
Thumbnail
2025/03/15
謝謝蘇媽讓我的 9700X 突飛猛進,讓我拿到 3DMark Free PC Upgrade 成就!
Thumbnail
2024/12/29
上個月還在職的時候,公司有提供一些名額給員工報名參加這次的台北葡萄酒馬拉松。雖然我自己並沒特別喜歡喝紅酒,不過既然有免費的機會,當然是要去看看了!(不知道哪裡來的勇氣,相信自己能跑馬拉松)
Thumbnail
2024/12/29
上個月還在職的時候,公司有提供一些名額給員工報名參加這次的台北葡萄酒馬拉松。雖然我自己並沒特別喜歡喝紅酒,不過既然有免費的機會,當然是要去看看了!(不知道哪裡來的勇氣,相信自己能跑馬拉松)
Thumbnail
看更多
你可能也想看
Thumbnail
去歐洲真的是又興奮又緊張。網路上常說歐洲治安不好,行前說明會時領隊也提醒:「不要背後背包,隨身物要放在前面比較安全!」 但出國玩總是想打扮得美美的啊~而且隨身總得帶些實用小物:雨傘、濕紙巾、小瓶水、萬用藥膏……體積雖小,但零零總總裝起來也不少。我在蝦皮購買了這4樣超實用旅遊好物!減緩我的焦慮感。
Thumbnail
去歐洲真的是又興奮又緊張。網路上常說歐洲治安不好,行前說明會時領隊也提醒:「不要背後背包,隨身物要放在前面比較安全!」 但出國玩總是想打扮得美美的啊~而且隨身總得帶些實用小物:雨傘、濕紙巾、小瓶水、萬用藥膏……體積雖小,但零零總總裝起來也不少。我在蝦皮購買了這4樣超實用旅遊好物!減緩我的焦慮感。
Thumbnail
開箱 3 套深受 0-6 歲寶寶喜愛的互動式童書,包含 Bizzy Bear 推拉書、小小音樂大師有聲書、Poke A Dot 泡泡書,有效提升寶寶閱讀興趣與親子共讀時光。搭配蝦皮雙 11 購物攻略,教你如何鎖定免運、折價券、高額回饋,並透過蝦皮分潤計畫,將日常購物開銷轉化為穩定育兒基金,聰明消費。
Thumbnail
開箱 3 套深受 0-6 歲寶寶喜愛的互動式童書,包含 Bizzy Bear 推拉書、小小音樂大師有聲書、Poke A Dot 泡泡書,有效提升寶寶閱讀興趣與親子共讀時光。搭配蝦皮雙 11 購物攻略,教你如何鎖定免運、折價券、高額回饋,並透過蝦皮分潤計畫,將日常購物開銷轉化為穩定育兒基金,聰明消費。
Thumbnail
其實要為專案建立操作介面的方式很多,除了網頁之外,還能另外寫個專門的手機 APP 連線,或是乾脆升級算法,讓我們能隨口喊一聲「嘿OO!」就搞定,不過⋯
Thumbnail
其實要為專案建立操作介面的方式很多,除了網頁之外,還能另外寫個專門的手機 APP 連線,或是乾脆升級算法,讓我們能隨口喊一聲「嘿OO!」就搞定,不過⋯
Thumbnail
在先前的教學中,我都教大家程式寫完以後就架設到「Heroku」的雲端上做使用,但如果你想嘗試其他自創的功能,這時一定會需要一直Debug,如果每次想看結果都要部屬一次Heroku,那這樣就變得相當麻煩,所以今天我就教大家如何利用本機端來提供外網連接的方式吧!!
Thumbnail
在先前的教學中,我都教大家程式寫完以後就架設到「Heroku」的雲端上做使用,但如果你想嘗試其他自創的功能,這時一定會需要一直Debug,如果每次想看結果都要部屬一次Heroku,那這樣就變得相當麻煩,所以今天我就教大家如何利用本機端來提供外網連接的方式吧!!
Thumbnail
第一個實戰,我們就先從如何連接自己的網站開始,當我們輸入「部落格」時,機器人就會輸出一個表格,只要點選「馬上觀看」,我們就可以直接連接到自己的部落格,此功能其實也可以運用在連接粉專或是其他想要觀看的網站唷!! Flex Message 實際製作教學 選擇模板 更改圖片 修改內容物 修改底部box
Thumbnail
第一個實戰,我們就先從如何連接自己的網站開始,當我們輸入「部落格」時,機器人就會輸出一個表格,只要點選「馬上觀看」,我們就可以直接連接到自己的部落格,此功能其實也可以運用在連接粉專或是其他想要觀看的網站唷!! Flex Message 實際製作教學 選擇模板 更改圖片 修改內容物 修改底部box
Thumbnail
在上一篇文章中,我們已經準備好製作LINE機器人的工具了,接下來我們就要來做一個最簡單的Python與LINE的串接練習,讓我們的機器人活起來,並且做出最基本的回話功能,如果還沒準備好串接所需的工具,記得先去看《【python】Python+LINE Bot 輕鬆打造股市機器人(二) : 所需準備的
Thumbnail
在上一篇文章中,我們已經準備好製作LINE機器人的工具了,接下來我們就要來做一個最簡單的Python與LINE的串接練習,讓我們的機器人活起來,並且做出最基本的回話功能,如果還沒準備好串接所需的工具,記得先去看《【python】Python+LINE Bot 輕鬆打造股市機器人(二) : 所需準備的
Thumbnail
在我們正式開始Python串接LINE Bot的教程之前,有必要先為大家準備好所需的工具。實際上,製作LINE Bot的工具有很多選擇,我將會介紹我在製作過程中所使用的具體工具有哪些,以及如何進行事前的準備工作。讓我們一起走進這個有趣的製作過程吧!
Thumbnail
在我們正式開始Python串接LINE Bot的教程之前,有必要先為大家準備好所需的工具。實際上,製作LINE Bot的工具有很多選擇,我將會介紹我在製作過程中所使用的具體工具有哪些,以及如何進行事前的準備工作。讓我們一起走進這個有趣的製作過程吧!
Thumbnail
對於前端工程師來說github上的gh-page是一個很適合放置自己作品的地方 尤其適合想要練練手感的時候可以方便地展示成果的地方 在過去使用手動commit至gh-page的分支上,或是使用deploy.sh檔來部署,對於我這種懶人來說都是多一個步驟,時常會覺得麻煩 現在能夠透過github ac
Thumbnail
對於前端工程師來說github上的gh-page是一個很適合放置自己作品的地方 尤其適合想要練練手感的時候可以方便地展示成果的地方 在過去使用手動commit至gh-page的分支上,或是使用deploy.sh檔來部署,對於我這種懶人來說都是多一個步驟,時常會覺得麻煩 現在能夠透過github ac
Thumbnail
本文目標是用 gh-pages 來部署靜態網頁達成需求 最近有人剛好有兩個版本的問卷,需要在使用者進入時隨機給予其中一份。他也找了程式碼,只差部署到一個地方來做隨機派發的需求。 簡單看一下發現其實用 Github Pages 就能達成(單純的前端而已),可是程式碼內容比較不符個人習慣,所以就改了一下
Thumbnail
本文目標是用 gh-pages 來部署靜態網頁達成需求 最近有人剛好有兩個版本的問卷,需要在使用者進入時隨機給予其中一份。他也找了程式碼,只差部署到一個地方來做隨機派發的需求。 簡單看一下發現其實用 Github Pages 就能達成(單純的前端而已),可是程式碼內容比較不符個人習慣,所以就改了一下
Thumbnail
使用本文方式需要以下條件: Telegram(通訊軟體) Raspberry Pi + Linux based 的作業系統(例如: Raspberry Pi OS ) 前言(廢話) 這個其實已經是老問題了,Paspberry Pi 各種教學文除了教你安裝 OS 外,還會教你怎樣設定連上網路,之後拿到
Thumbnail
使用本文方式需要以下條件: Telegram(通訊軟體) Raspberry Pi + Linux based 的作業系統(例如: Raspberry Pi OS ) 前言(廢話) 這個其實已經是老問題了,Paspberry Pi 各種教學文除了教你安裝 OS 外,還會教你怎樣設定連上網路,之後拿到
Thumbnail
使用 Telegram 官方推薦的方式,實作 webhook 和部署機器人到 Heroku。 本文只講部署(deploy)的部分,撰寫程式和申請帳號、操作 Heroku 教學很多了請自行 google。
Thumbnail
使用 Telegram 官方推薦的方式,實作 webhook 和部署機器人到 Heroku。 本文只講部署(deploy)的部分,撰寫程式和申請帳號、操作 Heroku 教學很多了請自行 google。
Thumbnail
不過因為網站和 repo 都是託管在 GitHub,就想說是不是可以直接在 GitHub 上讓他自動部署就好,我只要把文件上傳上去,接著 CI 就幫我弄好了。剛好之前 GitHub 就有推出 GitHub Actions,就是 GitHub 自己的 CI/CD 服務。剛好可以來試試看,
Thumbnail
不過因為網站和 repo 都是託管在 GitHub,就想說是不是可以直接在 GitHub 上讓他自動部署就好,我只要把文件上傳上去,接著 CI 就幫我弄好了。剛好之前 GitHub 就有推出 GitHub Actions,就是 GitHub 自己的 CI/CD 服務。剛好可以來試試看,
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News