Python 中的电报机器人。 从头开始编写具有汇率的机器人的完整指南

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 等于 true. 否则,系统将提示错误。

有两种方法可以在机器人中获取自定义消息。 两种方法都有效,但适用于不同的情况。 要获取消息,您可以使用 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 中的电报机器人。 从头开始编写具有汇率的机器人的完整指南

第 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 中的电报机器人。 从头开始编写具有汇率的机器人的完整指南

第 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['buy'] if diff: 结果 += ' ' + 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 中的电报机器人。 从头开始编写具有汇率的机器人的完整指南

第 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 中的电报机器人。 从头开始编写具有汇率的机器人的完整指南

当课程更改时,由于规定的参数,值之间的差异会显示在消息中。

Python 中的电报机器人。 从头开始编写具有汇率的机器人的完整指南

第 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 中的电报机器人。 从头开始编写具有汇率的机器人的完整指南

用户可以通过输入所需的货币来过滤结果。

从列表中单击所需货币后,聊天会收到与机器人用户收到的相同消息。 您也可以使用更新按钮。 下图显示了通过机器人发送的更新消息:

Python 中的电报机器人。 从头开始编写具有汇率的机器人的完整指南

结论

现在您知道如何为 Telegram 创建机器人了。 您可以将有用的工具添加到您的程序中:用于更新结果并将结果发送给信使的其他用户的按钮,以及允许您在聊天之外使用机器人功能的内置模式。 根据此说明,您可以创建任何具有其他功能的简单机器人——不仅是显示汇率的机器人。 不要害怕尝试使用库、API 和代码来创建一个自动助手,该助手将在 Telegram 上与客户聊天并加强感兴趣的人与公司的联系。

1评论

  1. 幻想出版物

发表评论