Python 中的 Telegram 機器人。 從頭開始編寫具有匯率的機器人的完整指南

Telegram 中的機器人程序有助於與觀眾建立聯繫或簡化以前必須手動執行的操作。 這些程序是專門為信使平台編寫的。 機器人以這種方式工作:用戶通過輸入行發送命令,系統以文本或交互式消息響應。 有時該程序甚至會模仿真人的行為——這樣的機器人會在客戶中激發更多的信任。

有幾種類型的系統可以為用戶提供自動幫助。 一些機器人只與客戶交流,其他機器人定期提供信息。 將程序明確劃分為不同類型是不可能的——開發人員通常將多個功能組合在一個機器人中。

您可以通過 9 個步驟以屏幕按鈕的形式為 Telegram 編寫一個帶有交互元素的簡單機器人。 讓我們詳細了解它們並回答幾個問題:

  • 如何啟動機器人;
  • 如何通過一個或多個按鈕註冊內置鍵盤;
  • 如何對所需功能的按鈕進行編程;
  • 什麼是內聯模式以及如何為現有機器人設置它。

第 0 步:關於 Telegram 機器人 API 的理論背景

用於創建 Telegram 機器人的主要工具是 HTML 應用程序編程接口或 HTML API。 此元素接受訪問者請求並以信息的形式發送響應。 現成的設計簡化了程序的工作。 要為 Telegram 編寫機器人,您需要使用此電子郵件地址:https://api.telegram.org/bot/METHOD_NAME

為了讓機器人正常運行,還需要一個令牌——一個保護程序並向受信任的開發人員開放訪問權限的字符組合。 每個令牌都是唯一的。 該字符串在創建時分配給機器人。 方法可以不同:getUpdates、getChat 等。 方法的選擇取決於開發人員對機器人的期望算法。 令牌示例:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

機器人使用 GET 和 POST 請求。 方法參數通常需要補充——例如,當 sendMessage 方法應該發送聊天 id 和一些文本時。 方法細化的參數可以作為 URL 查詢字符串使用 application/x-www-form-urlencoded 或通過 application-json 傳遞。 這些方法不適合下載文件。 還需要 UTF-8 編碼。 通過向 API 發送請求,您可以獲得 JSON 格式的結果。 看一下程序對通過 getME 方法檢索信息的響應:

獲取 https://api.telegram.org/bot/getMe{ ok: true, result: { id: 231757398, first_name: "Exchange Rate Bot", username: "exchangetestbot" } }

如果得到結果 ok 等於 . 否則,系統將提示錯誤。

有兩種方法可以在機器人中獲取自定義消息。 兩種方法都有效,但適用於不同的情況。 要獲取消息,您可以使用 getUpdates 方法手動編寫請求——程序將在屏幕上顯示更新數據數組。 請求必須定期發送,分析每個數組後,重複發送。 偏移量是一個參數,用於確定在加載新結果之前跳過的記錄數,以避免再次出現已檢查的對象。 getUpdates 方法的好處將在以下情況下發揮作用:

  • 沒有辦法配置HTTPS;
  • 使用複雜的腳本語言;
  • bot服務器不時變化;
  • 機器人加載了用戶。

第二種可以用來接收用戶消息的方法是 setWebhook。 使用一次,無需不斷發送新請求。 Webhook 將數據更新發送到指定的 URL。 此方法需要 SSL 證書。 Webhook 在這些情況下會很有用:

  • 使用網絡編程語言;
  • 機器人沒有超載,沒有太多用戶;
  • 服務器沒有改變,程序在同一台服務器上保持很長時間。

在進一步的說明中,我們將使用 getUpdates。

@BotFather Telegram 服務旨在創建聊天機器人。 基本設置也通過該系統進行設置——BotFather 將幫助您進行描述、放置個人資料照片、添加支持工具。 圖書館——Telegram 機器人的 HTML 請求集——可以在 Internet 上找到,其中有很多。 創建示例程序時,使用了 pyTelegramBotApi。

第 1 步:實施匯率請求

首先,您需要編寫執行查詢的代碼。 我們將在編寫 PrivatBank API 時使用,下面是它的鏈接:https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5。 您需要在代碼中使用這些方法:

  • load_exchange – 查找匯率並顯示編碼信息;
  • get_exchange – 顯示特定貨幣的數據;
  • get_exchanges – 根據樣本顯示貨幣列表。

因此,pb.py 文件中的代碼如下所示:

import re import requests import json URL = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5' def load_exchange(): return json.loads(requests.get(URL).text) def get_exchange(ccy_key ): for exc in load_exchange(): if ccy_key == exc['ccy']: return exc return False def get_exchanges(ccy_pattern): result = [] ccy_pattern = re.escape(ccy_pattern) + '.*' for exc in load_exchange(): 如果 re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) 不是 None: result.append(exc) 返回結果

程序可以對指定的請求發出以下響應:

[ { ccy:"USD", base_ccy:"UAH", 買:"25.90000", 銷售:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", 買:"29.10000", 銷售:"29.85000 " }, { ccy:"RUR", base_ccy:"UAH", 購買:"0.37800", 銷售:"0.41800" }, { ccy:"BTC", base_ccy:"USD", 購買:"11220.0384", 銷售: “12401.0950”}]

第 2 步:使用 @BotFather 創建 Telegram 機器人

您可以創建一個程序來接收消息並使用@BotFather 服務對其進行響應。 轉到他的電報頁面並輸入 /newbot 命令。 聊天中會出現說明,根據說明,您需要先記下機器人的名稱,然後再記下它的地址。 創建機器人帳戶後,屏幕上將顯示一條包含令牌的歡迎消息。 如需進一步配置,請使用以下命令:

  • /setdescription – 描述;
  • /setabouttext – 關於新機器人的信息;
  • /setuserpic – 個人資料照片;
  • /setinline – 內聯模式;
  • /setcommands – 命令的描述。

在最後的配置步驟中,我們描述了 /help 和 /exchange。 完成所有步驟後,就該開始編碼了。

第 3 步:設置和啟動機器人

讓我們創建一個 config.py 文件。 在其中,您需要指定唯一的機器人代碼和程序將在其中查找信息的時區。

令牌 = '' # 替換為你的機器人令牌TIMEZONE = 'Europe/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

接下來,我們創建另一個文件,導入之前編寫的 pb.py、庫和其他必要組件。 缺少的庫是從包管理系統 (pip) 安裝的。

import telebotimport configimport pbimport datetimeimport pytzimport jsonimport traceback P_TIMEZONE = pytz.timezone(config.TIMEZONE) TIMEZONE_COMMON_NAME = config.TIMEZONE_COMMON_NAME

讓我們使用 pyTelegramBotApi 的內容來創建一個機器人。 我們使用以下代碼發送接收到的令牌:

bot = telebot.TeleBot(config.TOKEN) bot.polling(none_stop=True)

none_stop 參數確保不斷發送請求。 參數的操作不會受到方法錯誤的影響。

第 4 步:編寫 /start 命令處理程序

如果前面的所有步驟都正確完成,則機器人已開始工作。 該程序會定期生成請求,因為它使用 getUpdates 方法。 在包含 none_stop 元素的行之前,我們需要一段處理 /start 命令的代碼:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message(message.chat.id, '問候!我可以告訴你匯率。n' + '要獲得匯率,請按 / exchange.n' + '要獲得幫助,請按 /help。' )

RџСўРё 命令=['開始'] 等於真 start_command 被調用。 消息的內容在那裡。 接下來需要實現發送功能_信息 與特定消息有關。

第 5 步:創建 /help 命令處理程序

/help 命令可以實現為按鈕。 通過單擊它,用戶將被帶到開發者的 Telegram 帳戶。 為按鈕命名,例如“詢問開發人員”。 為 send_message 方法設置 reply_markup 參數,將用戶重定向到一個鏈接。 讓我們在代碼中編寫創建鍵盤的參數(InlineKeyboardMarkup)。 您只需要一個按鈕(InlineKeyboardButton)。

最終的命令處理程序代碼如下所示:

@bot.message_handler(commands=['help']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( '詢問開發者', url='ваша ссылка на профиль' ) bot.send_message(message.chat.id, '1) 要接收可用貨幣列表,請按 /exchange.n' + '2) 點擊您感興趣的貨幣。n' + '3) 你將收到一條消息,其中包含有關源貨幣和目標貨幣的信息,'+'買入價和賣出價。n'+'4) 單擊“更新”以接收有關請求的當前信息。 ' + '機器人還會顯示以前和當前匯率之間的差異。n' + '5) 機器人支持內聯。 類型 @ 在任何聊天和貨幣的第一個字母中。', reply_markup=keyboard )

Telegram 聊天中的代碼操作:

Python 中的 Telegram 機器人。 從頭開始編寫具有匯率的機器人的完整指南

第 6 步:添加 /exchange 命令處理程序

需要此步驟以在聊天中顯示帶有可用貨幣符號的按鈕。 帶有選項的屏幕鍵盤將幫助您避免錯誤。 PrivatBank 提供有關盧布、美元和歐元的信息。 InlineKeyboardButton 選項的工作方式如下:

  1. 用戶單擊具有所需名稱的按鈕。
  2. getUpdates 接收回調 (CallbackQuery)。
  3. 眾所周知,如何處理按下鍵盤 - 傳輸有關按下按鈕的信息。

/交換處理程序代碼:

@bot.message_handler(commands=['exchange']) def exchange_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton('USD', callback_data='get-USD') )keyboard.row(telebot.types.InlineKeyboardButton('EUR',callback_data='get-EUR'),telebot.types.InlineKeyboardButton('RUR',callback_data='get-RUR'))bot.send_message(message.chat .id, '點擊選擇的貨幣:', reply_markup=keyboard )

Telegram 中的代碼結果:

Python 中的 Telegram 機器人。 從頭開始編寫具有匯率的機器人的完整指南

第 7 步:為內置鍵盤按鈕編寫處理程序

pyTelegramBot Api 包包含 @bot.callback_query_handler 裝飾器函數。 該組件旨在將回調轉換為函數——API 解包並重新創建調用。 它是這樣拼寫的:

@bot.callback_query_handler(func=lambda call: True) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(query)

讓我們也編寫 get_ex_callback 方法:

def get_ex_callback(query): bot.answer_callback_query(query.id) send_exchange_result(query.message, query.data[4:])

還有另一種有用的方法——answer_callback_query。 它有助於消除按下按鈕和在屏幕上顯示結果之間的負擔。 您可以通過傳遞一些貨幣代碼和消息來向 send_exchange_query 發送消息。 讓我們編寫 send_exchange_result:

def send_exchange_result(message, ex_code): bot.send_chat_action(message.chat.id, 'typing') ex = pb.get_exchange(ex_code) bot.send_message(message.chat.id, serialize_ex(ex), reply_markup=get_update_keyboard(ex ), parse_mode='HTML' )

當聊天機器人收到銀行請求的結果時 API,訪問者會看到“正在輸入消息”的題詞。 好像是真人在回答。 要在屏幕上顯示這樣的指示器,您需要添加輸入狀態行。 接下來,我們將使用 get_exchange——在它的幫助下,程序將接收貨幣名稱(盧布、歐元或美元)。 send_message 使用其他方法:serialize_ex 將貨幣轉換為另一種格式,get_update_keyboard 設置更新信息並將貨幣市場數據發送到其他聊天室的軟鍵。

讓我們為 get_update_keyboard 編寫代碼。 需要提到兩個按鈕——t 和 e 代表類型和交換。 需要共享按鈕的 switch_inline_query 項目,以便用戶可以從多個聊天中進行選擇。 訪問者將能夠選擇向誰發送美元、盧布或歐元的當前匯率。

def get_update_keyboard(ex): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Update', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['buy'], 's': ex['sale'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Share', switch_inline_query=ex['ccy']) ) 返回鍵盤

有時您需要查看匯率在短時間內發生了多少變化。 讓我們為“更新”按鈕編寫兩個方法,以便用戶可以看到比較的課程。

匯率之間的差異通過 diff 參數傳遞給序列化程序。

規定的方法只有在數據更新後才有效,不會影響課程的首次顯示。

def serialize_ex(ex_json, diff=None): result = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + '買入:' + ex_json['買入'] 如果差異:結果 += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + '賣出:' + ex_json['sale'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: result += 'nSell: ' + ex_json['sale'] + 'n' 返回結果 def serialize_exchange_diff(diff): result = '' if diff > 0: 結果 = '(' + str(diff) + ' " src="https://sworg/images/core/emoji/2.3/svg/2197.svg">" src="https://sworg/images /core/emoji/72x72/2197.png">" src="https://sworg/images/core/emoji/72x72/2197.png">)' elif diff < 0: result = '(' + str( diff)[1:] + ' " src="https://sworg/images/core/emoji/2.3/svg/2198.svg">" src="https://sworg/images/core/emoji/72x72 /2198.png">" src="https://sworg/images/core/emoji/72x72/2198.png">)'返回結果

假設訪問者想知道美元匯率。 如果您在消息中選擇 USD,會發生以下情況:

Python 中的 Telegram 機器人。 從頭開始編寫具有匯率的機器人的完整指南

第 8 步:實現更新按鈕處理程序

讓我們編寫代碼來處理帶有 Update 按鈕的操作,並將 iq_callback_method 部分添加到其中。 當程序項以 get 參數開頭時,您必須編寫 get_ex_callback。 在其他情況下,我們解析 JSON 並嘗試獲取密鑰 t。

@bot.callback_query_handler(func=lambda call: True) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(query) else: try: if json.loads(data)[ 't'] == 'u': edit_message_callback(query) 除了 ValueError: pass

如果 t 等於 u,則需要為 edit_message_callback 方法編寫程序。 讓我們逐步分解這個過程:

  1. 下載有關貨幣市場狀態的最新信息 (exchange_now = pb.get_exchange(data['c'])。
  1. 通過帶有差異的序列化程序編寫新消息。
  2. 添加簽名 (get_edited_signature)。

如果初始消息沒有更改,請調用 edit_message_text 方法。

def edit_message_callback(query): data = json.loads(query.data)['e'] exchange_now = pb.get_exchange(data['c']) text = serialize_ex(exchange_now, get_exchange_diff(get_ex_from_iq_data(data), exchange_now)) + 'n' + get_edited_signature() if query.message: bot.edit_message_text(text, query.message.chat.id, query.message.message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML') elif query.inline_message_id :bot.edit_message_text(文本,inline_message_id=query.inline_message_id,reply_markup=get_update_keyboard(exchange_now),parse_mode='HTML')

讓我們編寫 get_ex_from_iq_data 方法來解析 JSON:

def get_ex_from_iq_data(exc_json): return { 'buy': exc_json['b'], 'sale': exc_json['s'] }

您將需要更多方法:例如,get_exchange_diff,它讀取有關貨幣成本的新舊信息並顯示差異。

def get_exchange_diff(last, now): return { 'sale_diff': float("%.6f" % (float(now['sale']) - float(last['sale']))), 'buy_diff': float ("%.6f" % (float(now['buy']) - float(last['buy']))) }

最後一個 get_edited_signature 顯示了課程最後一次更新的時間。

def get_edited_signature(): return '更新 ' + str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + ' (' + TIMEZONE_COMMON_NAME + ')'

結果,來自具有穩定匯率的機器人的更新消息如下所示:

Python 中的 Telegram 機器人。 從頭開始編寫具有匯率的機器人的完整指南

當課程更改時,由於規定的參數,值之間的差異會顯示在消息中。

Python 中的 Telegram 機器人。 從頭開始編寫具有匯率的機器人的完整指南

第 9 步:嵌入式模式實現

需要內置模式才能將信息從程序快速發送到任何聊天 - 現在您無需將機器人作為參與者添加到對話中。 當 Telegram 用戶輸入帶有 @ 符號的機器人名稱時,轉換選項應出現在輸入行上方。 如果您單擊其中一個項目,機器人將向對話發送一條消息,其中包含用於更新和發送數據的結果和按鈕。 發件人的姓名將包含標題“通過 “。

InlineQuery 通過庫傳遞給 query_text。 該代碼使用 answer_line 函數以數據數組和 inline_query_id 元素的形式檢索搜索結果。 我們使用 get_exchanges 以便機器人根據請求找到幾種貨幣。

@bot.inline_handler(func=lambda query: True) def query_text(inline_query): bot.answer_inline_query(inline_query.id, get_iq_articles(pb.get_exchanges(inline_query.query))

我們將一個數據數組傳遞給 get_iq_articles,以便通過此方法從 InlineQueryResultArticle 返回對象。

def get_iq_articles(exchanges): result = [] for exc in exchange: result.append( telebot.types.InlineQueryResultArticle( id=exc['ccy'], title=exc['ccy'], input_message_content=telebot.types.InputTextMessageContent ( serialize_ex(exc), parse_mode='HTML'), reply_markup=get_update_keyboard(exc), description='Convert ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 )返回結果

現在,如果你寫@ 和一行中的空格,搜索結果將出現在屏幕上 - 用於轉換為三種可用貨幣的選項。

Python 中的 Telegram 機器人。 從頭開始編寫具有匯率的機器人的完整指南

用戶可以通過輸入所需的貨幣來過濾結果。

從列表中單擊所需貨幣後,聊天會收到與機器人用戶收到的相同消息。 您也可以使用更新按鈕。 下圖顯示了通過機器人發送的更新消息:

Python 中的 Telegram 機器人。 從頭開始編寫具有匯率的機器人的完整指南

結論

現在您知道如何為 Telegram 創建機器人了。 您可以將有用的工具添加到您的程序中:用於更新結果並將結果發送給信使的其他用戶的按鈕,以及允許您在聊天之外使用機器人功能的內置模式。 根據此說明,您可以創建任何具有其他功能的簡單機器人——不僅是顯示匯率的機器人。 不要害怕嘗試使用庫、API 和代碼來創建一個自動助手,該助手將在 Telegram 上與客戶聊天並加強感興趣的人與公司的聯繫。

如何1

  1. 幻想出版物

發表評論