Makzan
Makzan

我管理世界職業技能競賽之網站技術項目、舉辦本地設計與開發賽事、開課分享技術心得。一個用網頁來表達自己的作家。

製作 Telegram 聊天機械人回答現時 LIKE 幣價格

我們可以通過建立 Telegram 聊天機械人,並向聊天機械人發出指令,以觸發預定義的函數。而這些函數處理完成後,發回信息予用戶。

之前介紹了使用 Python 及 Coingecko API 取得 $LIKE 幣價)及放到 iOS 主畫面並以 Siri 語音觸發的介紹文。

今期講解一下通過建立 Telegram 聊天機械人來實現查找指令功能。

Telegram 是類似 LINE, Whatsapp 的通訊軟件,也是其中最早支援聊天機械人服務的通訊軟件。我們可以通過建立 Telegram 聊天機械人,並向聊天機械人發出指令,以觸發預定義的函數。而這些函數處理完成後,發回信息予用戶。

觸發流程
  1. 發出指令,例如 /LIKE, /price 等
  2. 機械人在線收到指令,觸發函數
  3. 函數處理完成,獲得必要數據,向用戶發出信息
  4. 用戶收到信息。

成果截圖:

測試機械人範例結果

測試機械人:可以使用 Telegram 連接此聊天機械人,並詢問 /LIKE 或 /price 等指令。

https://t.me/like_price_bot


1️⃣ 建立 Telegram Bot 聊天機械人

想利用聊天機械人為自己進行查詢及執行任務,首先需要注冊一個專屬機械人。要登記,需於 Telegram 內使用 @BotFather 機械人。BotFather 是 Telegram 為開發者而設的聊天機械人管理服務。

https://t.me/botfather

使用 BotFather 創建新聊天機械人

與 BotFather 管理服務開始聊天後,可以發出 /newbot 指令,按指示填上機械人名稱,例如我使用 Like Price Bot,你可以按自己需求設定,例如 Jane's Helper 等。然後需要為這個機械人註冊一個用戶名稱,且必須以 _bot 結尾。例如我在這例子中使用 like_price_bot,又或者按你的需求自定義一個不重覆的名稱,例如 jane_helper_bot 等。

完成後,BotFather 會發出一個完成信息,內𥚃包括我們的 Python 程式所需要的 API TOKEN。範例如下:

Done! Congratulations on your new bot. You will find it at t.me/thomas_helper_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.
Use this token to access the HTTP API:
5021980959:AAEDaEh-7PayRc2VG8ov7bU0occHQAi08q4
Keep your token secure and store it safely, it can be used by anyone to control your bot.

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

當中 “Use this token to access the HTTP API:” 的下一行,以數字開頭及包括字母與數字的,就是這個聊天機械人的 API 令牌(Token),這類似存取資源的密鑰,有了他就可以控制這個聊天機械人,所以要妥善保管及不要外洩喔。

⚠️ API Token 需要妥善保管好

2️⃣ 安裝 Python Telegram Bot 套件

登記好機械人後, 接下來可以開始編程部份。

使用 Python 開發的話,暫時最方便的是 Python-Telegram-Bot,可以通過 pip install python-telegram-bot 安裝。

注:視乎你的系統之 pip 安裝在哪𥚃,例如在 Mac 中,有可能需要使用 pip3 代替 pip,即 pip3 intsall python-telegram-bot

運行結果:

3️⃣ 構建 Bot 代碼

安裝好後,便可以正式編寫 Python 代碼。

使用 python-telegram-bot,最基本的起步代碼如下:

# (1) 匯入必要的 python-telegram-bot 程式庫from telegram.ext import Updater
from telegram import Update
from telegram.ext import CallbackContext
from telegram.ext import CommandHandler

# (2) 填上從 BotFather 注冊機械人得來的 API 令牌
TOKEN = "YOUR_BOT_API_TOKEN_HERE"

# (3) 機械人的主要功能使 Updater,負責注冊指令回饋方法及連接 Telegram 服務
updater = Updater(token=TOKEN)

# (4) 定義不同的函數,第一個通常為 start 函數,將會由用戶發出 /start 指令觸發。
def start(update: Update, context: CallbackContext):
    # (5) 通過 context.bot.send_message 發回信息。
    # text 為發出的信息,當中若包括斜號開頭文字,如 /LIKE,則在 Telegram 中為可以直接按下的快捷鍵。
    context.bot.send_message(chat_id=update.effective_chat.id, text="I'm a bot. You may check LIKE price with me: /LIKE")    

# (6) 注冊使用哪個指令字串來觸發上述函數 'start' 即使用 /start 觸發
updater.dispatcher.add_handler(CommandHandler('start', start))

# (7) 注冊好所有指令函數後,使用 start_polling 開始監聽來自用戶的機械人指令
updater.start_polling()

把上述代碼儲存,例如儲存為 like_price_bot.py 檔案。 此時,若運行代碼 python like_price_bot.py,並使用 Telegram 跳轉到機械人聊天畫面,機械人網址為 https://t.me/ 加上機械人用戶名稱,例如上述例子是 https://t.me/like_price_bot

在聊天畫面中,可以發出 /start 及得到返回文字。但除此之外,我們的機械人並未懂得做更多事情,以下,我們會添加幣價查詢指令函數。

4️⃣ 加入更多指令

上述的起始樣板代碼,連接好 Telegram 服務及設定了第一個指令回饋。我們可以照板煮碗,定義其他查詢用函數,例如 like 及 price

首先我們定義一個 like 函數。當中使用我們之前教學文所取得 $LIKE 幣價的方法。通過 requests 向 Coingecko API 查詢,並將返回值以 Telegram 信息方式發回。

重溫一下 Coingecko API,取得幣價的網址為:

https://api.coingecko.com/api/v3/simple/price?ids=likecoin&vs_currencies=usd

返回值是 JSON 結構,包括查詢幣種及兌換法幣價值。

CoinGecko API 的返回值。

故查詢 API 代碼如下,API 的使用請情也可以參考《Python 與 JSON API 應用入門:使用 Python 取得現時 LikeCoin 幣價》一文。

def like(update: Update, context: CallbackContext):
    import requests
    # 查詢 LikeCoin 幣價的 API 網址
    url = "https://api.coingecko.com/api/v3/simple/price?ids=likecoin&vs_currencies=usd"
    # 取得 API 返回值
    res = requests.get(url)
    # 將返回文字分析為 JSON 字典結構
    data = res.json()
    # 從結構中
    price = data["likecoin"]["usd"]
    context.bot.send_message(chat_id=update.effective_chat.id, text=f"LIKE: {price}")

相應的,我們為剛剛定義的函數注冊 telegram 指令,例如 /like。這個指令是不分大小寫的,所以 /like 或 /LIKE 皆可以觸發。

updater.dispatcher.add_handler(CommandHandler('like', like))

同埋,我們也可以製作搜尋其他不同幣價的指令,或定義一個同時包括幾個幣價的指令。並使用相類似的方法返回信息。

多幣值的 Coingecko API 查找網址為:

https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum,terra-luna,osmosis,likecoin,crypto-com-chain&vs_currencies=usd

當中請自行替換需要查詢的幣種。而返回結構如下:

使用 Coingecko API 查詢多幣值

5️⃣ 最終代碼

最終代碼如下,已加入 /price 指令,亦可以在以下網址取得源代碼,當中的 YOUR_BOT_API_TOKEN_HERE 請替換成你所創立的聊天機械人 API 令牌。你亦可以加入其他查詢指令函數來配合你的需要。

https://gist.github.com/makzan/b90dd176504e4b076ef9f99e022a3570

源代碼:

from telegram.ext import Updater
from telegram import Update
from telegram.ext import CallbackContext
from telegram.ext import CommandHandler

TOKEN = "YOUR_BOT_API_TOKEN_HERE"

updater = Updater(token=TOKEN)

def start(update: Update, context: CallbackContext):
    context.bot.send_message(chat_id=update.effective_chat.id, text="I'm a bot. You may check LIKE price with me: /LIKE")

def like(update: Update, context: CallbackContext):
    import requests
    url = "https://api.coingecko.com/api/v3/simple/price?ids=likecoin&vs_currencies=usd"

    res = requests.get(url)
    data = res.json()
    price = data["likecoin"]["usd"]
    context.bot.send_message(chat_id=update.effective_chat.id, text=f"LIKE: {price}")

def price(update: Update, context: CallbackContext):
    import requests
    url = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum,terra-luna,osmosis,likecoin,crypto-com-chain&vs_currencies=usd"

    res = requests.get(url)
    data = res.json()
    btc,eth,like,osmo,cro,luna = (
      data["bitcoin"]["usd"],
      data["ethereum"]["usd"],
      data["likecoin"]["usd"],
      data["osmosis"]["usd"],
      data["crypto-com-chain"]["usd"],
      data["terra-luna"]["usd"],
    )
    text = f"BTC: {btc}\nETH: {eth}\nLIKE: {like}\nOSMO: {osmo}\nCRO: {cro}\nLUNA: {luna}"
    context.bot.send_message(chat_id=update.effective_chat.id, text=text)


updater.dispatcher.add_handler(CommandHandler('start', start))
updater.dispatcher.add_handler(CommandHandler('like', like))
updater.dispatcher.add_handler(CommandHandler('price', price))

updater.start_polling()

Enjoy! 😉

— 麥誠 Makzan,2021-12-30。


我是麥誠軒(Makzan),除了正職外,平常我要麼辦本地賽與辦世界賽,要麼任教編程與網站開發的在職培訓。現正轉型將面授培訓內容寫成電子書、網上教材等,至今撰寫了 7 本書, 2 個視頻教學課程。

如果我的文章有價值,請左下角 👍🏻按讚支持,或訂閱贊助我持續創作及分享。


麥誠 Makzan


CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

第一个支持了这篇作品
加载中…
加载中…

发布评论