本篇是紀錄一下透過Django來做webhook整合Telegram API,主要也是因爲爬了一些文章,都沒有人提到如何透過Django進行整合,多是介紹Python或是Flask的方式.
由於沒什麼參考文章,之前整合過LineBot(好像偷懶了,沒有放上來,有時間再寫一篇),所以我就試想,同樣是通訊軟體、聊天機器人,應該有些做法雷同,沒想到測試下來真的可行,就紀錄分享一下.
1.行前知識
-已經具備了Python(3.8up)與Django(3.x)基礎知識
-本次採用pyTelegramBotAPI這個套件應用
-需先向Telegram的’爸爸’申請一個機器人,並且取得Token,之後要輸入用,這邊就不闡述,可以參考Telegram官網
-若想要本機測試,可以採用 ngrok這個酷東西,他可以產生一個https網址對應到你的機器,這樣就不用先上傳服務器或準備ssl憑證了.(不過這邊就不細說,可以參考ngrol官網)
2.本次做法採用webhook方式,接收Telegram來的資訊.
3.架構長得像這樣
Telegram—>webhook(我們的主機)—>接收
回傳—>webhook(我們的主機)—>Telegram
4.所以我們可以看得出來,webhook就是我們要實作的.
5.開始寫程式摟
-建立一個名為TG的Project
–再此Project下的settings.py修改
1 |
ALLOWED_HOSTS = ['*'] //建議改為自己的domain或是ngrok的網址,這邊為了demo方便先改為全不允許 |
–再此Project下的url.py修改
1 2 3 4 5 |
from django.urls import path, include //加入include urlpatterns = [ path('webhook/', include('webhook.urls')), //這就是webhook到時候呼叫的位置 ] |
-建立一個App叫做webhook
–在此App下view.py建立一個callback function
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import telebot //引入pyTelegramBotAPI improt json import HttpResponse #API Token TOKEN = '{你的Token}' //這邊就是剛剛跟Telegram爸爸申請的Token bot = telebot.TeleBot(TOKEN) @csrf_exempt //記得csrf打開 def callback(request): print('in webhook....') //測試一下可不可以連到,連到應可以印出資訊 if request.method == 'POST': #此段主要為接受Telegram來的資料,並且轉換,這邊照著官方寫即可. json_string = json.dumps(json.loads(request.body)) update = telebot.types.Update.de_json(json_string) bot.process_new_updates([update]) return HttpResponse('webhook is ok') else: print('error') return HttpResponse('error') |
–在此App下urls.py建立剛寫的callback路徑
1 2 3 4 5 6 |
from django.urls import path from . import views urlpatterns = [ path('callback', views.callback) ] |
此時要先跟Telegram註冊您的webhook url,在網址列打上,以下資訊,並且替換相關訊息,URL=https://domain:port/webhook/callback
1 |
https://api.telegram.org/bot{TOKEN}/setwebhook?url={URL} |
並且要看到以下訊息才算設定成功.
1 |
{"ok":true,"result":true,"description":"Webhook was set"} |
開始測試是否主機可以通,透過丟一個訊息給您的機器人看有無收到,並且在主機部分會印出
1 |
in webhook.... |
表示成功,或是直接連網址也可以,網址為https://domain:port/webhook/callback
–接著我們來建立一個回聲機器人,在pyTelegramBotAPI內建很多好用的Function或是handler,就可以直接拿來用,例如簡單的您打什麼給機器人,機器人就會您什麼.
1 2 3 |
@bot.message_handler(func=lambda message: True, content_types=['text']) def echo(message): bot.send_message(message.chat.id, message.text) |
您沒看錯,就這樣就好了,透過pyTelegramBotAPI的handler就可以處理,當是傳入為文字的時候啟動echo function,然後bot會send訊息回去.