首页 > 编程问答 >编写用于关键字检测和按钮发送的 Python Telegram 机器人

编写用于关键字检测和按钮发送的 Python Telegram 机器人

时间:2024-07-29 16:04:22浏览次数:11  
标签:python telegram telegram-bot python-telegram-bot py-telegram-bot-api

我需要帮助用 Python 为我的 Telegram 机器人编写代码。我有一个 config.py 文件,其中包含两个关键字列表:keywords 和 button_phrases。

keywords - 负责在单击时显示子按钮的按钮。 Button_phrases - 负责单击时打开链接的按钮。

我需要机器人检查用户输入的文本并按以下顺序查找关键字:

检查关键字中是否存在关键字。 检查button_phrases 中是否存在关键字。 get_matching_keywords 函数应该执行特定任务:检查单个消息中是否存在关键字。在我们的例子中,该函数应使用两个循环,当找到关键字并发送适当的按钮时,这两个循环将关闭。

循环应按如下方式工作:

检查关键字中是否存在关键字。如果找到,则添加按钮并退出循环。 检查button_phrases 中是否存在关键字。如果找到,则添加按钮并退出循环。 如果文本包含两个列表中的关键字(关键字和按钮短语),则机器人应一起发送相应的按钮。

如果有任何可以帮助实现此逻辑的建议或示例代码,我将不胜感激。谢谢!

我编写了一个检查关键字的函数,但我不确定如何正确构建循环以确保检查两个列表并发送适当的按钮。


import telebot
from telebot import types

from config import keywords, button_phrases

bot = telebot.TeleBot("YOUR_TELEGRAM_BOT_TOKEN")

def get_matching_keywords(message):
    """
    检查单个消息中是否存在关键字和按钮短语,并返回匹配的按钮。

    Args:
        message: Telegram 消息对象。

    Returns:
        匹配的按钮列表,如果没有匹配则为空列表。
    """
    matched_buttons = []
    message_text = message.text.lower()

    # 首先检查关键字
    for keyword in keywords:
        if keyword.lower() in message_text:
            # 为关键字创建 InlineKeyboardButton
            button = types.InlineKeyboardButton(keyword, callback_data=f"keyword_{keyword}")
            matched_buttons.append(button)
            # 如果找到关键字,则退出关键字循环
            break

    # 然后检查按钮短语
    for phrase in button_phrases:
        if phrase.lower() in message_text:
            # 为短语创建 InlineKeyboardButton
            button = types.InlineKeyboardButton(phrase, url=button_phrases[phrase])
            matched_buttons.append(button)
            # 如果找到短语,则退出短语循环
            break

    return matched_buttons

@bot.message_handler(func=lambda message: True)
def handle_message(message):
    """
    处理传入的消息并发送匹配的按钮。
    """
    matched_buttons = get_matching_keywords(message)

    if matched_buttons:
        # 创建键盘并将按钮添加到其中
        keyboard = types.InlineKeyboardMarkup()
        for button in matched_buttons:
            keyboard.add(button)

        # 发送包含按钮的消息
        bot.send_message(message.chat.id, "我找到了这些按钮:", reply_markup=keyboard)
    else:
        bot.send_message(message.chat.id, "在的消息中找不到任何匹配的关键字或短语。")

# 启动机器人
bot.polling()

说明:

  1. 导入必要的库:
  2. telebot :用于与 Telegram Bot API 交互。
  3. types :用于创建不同类型的消息内容,例如内联键盘按钮。
  4. config :创建的配置文件,其中包含 keywords button_phrases 列表。

  5. 初始化机器人:

  6. 使用的 Telegram 机器人令牌替换 "YOUR_TELEGRAM_BOT_TOKEN"

  7. get_matching_keywords 函数:

  8. 此函数接受一条消息作为输入。
  9. 它迭代 keywords button_phrases 列表。
  10. 如果在消息文本中找到关键字或短语,它会创建一个相应的按钮并将其附加到 matched_buttons 列表中。
  11. 注意: 一旦在每个列表中找到匹配项,循环就会使用 break 语句中断,以确保只为每个列表添加一个按钮。

  12. handle_message 函数:

  13. 这是使用 @bot.message_handler 装饰器注册的消息处理程序。它处理所有传入的消息。
  14. 它调用 get_matching_keywords 函数来获取匹配的按钮列表。
  15. 如果找到匹配项:
    • 它会创建一个 InlineKeyboardMarkup 对象(键盘)。
    • 它迭代 matched_buttons 列表,并将每个按钮添加到键盘。
    • 它使用找到的按钮发送一条消息。
  16. 如果没有找到匹配项,它会发送一条消息,告知用户没有找到匹配项。

  17. 启动机器人:

  18. bot.polling() 方法启动机器人并开始侦听传入的更新。

在 config.py 中:

keywords = [
    "关键字1",
    "关键字2",
    "关键字3"
]

button_phrases = {
    "按钮短语1": "https://example.com/link1",
    "按钮短语2": "https://example.com/link2",
    "按钮短语3": "https://example.com/link3"
}

用自己的关键字和按钮短语替换占位符文本及其相应的链接。

此代码演示了如何根据用户消息中的关键字和短语发送内联按钮。可以通过添加更多条件语句和自定义逻辑来根据需要进一步增强此功能。

标签:python,telegram,telegram-bot,python-telegram-bot,py-telegram-bot-api
From: 78805942

相关文章

  • Python monorepo 打包,使用 Poetry
    我想将我的Python源代码组织到一个单一存储库中,具有以下基本结构:projectrootdir-libraryone-pyproject.toml-README-src/orgname/libraryone-__init__.py-somemodule.py-webapi-pyproject.toml-README-src/organa......
  • 如何使用Python AST给表达式a == b添加括号?
    请问,有谁知道如何使用PythonAST在代码中为a==b这样的表达式添加括号?我尝试过重写visit_Compare,但是ast.unparse中的delimit_if自动删除了我添加的括号,因为优先级a==b的值更高。你说的对,直接使用ast.unparse会因为优先级问题导致添加的括号被移除。为了解......
  • 使用 powershell 或 python 从网页列出公司名称
    我希望使用PowerShell或python仅列出URL中的公司名称:https://www.moneycontrol.com/markets/earnings/results-calendar/?activeDate=2024-07-29下面是我的python脚本用于获取网页的结构:importrequestsfrombs4importBeautifulSoup#URLo......
  • T3/A40i支持Linux-5.10新内核啦,Docker、Qt、Python统统升级!
    自2021年创龙科技推出全志国产化率100%的T3/A40i工业核心板后,不到两年时间已超过800家工业客户选择创龙科技T3/A40i平台。随着客户产品的不断升级与迭代,部分“能源电力”、“工业自动化”行业客户对T3/A40i的Linux版本提出了更高要求,主要涉及Docker、Qt、Python等组件特性。秉持......
  • 使用 Python 中的多处理防止共享内存中的数据损坏?
    我目前正在开发一个多处理Python程序,其中每个进程将其索引作为连续的4字节整数写入共享内存。并且有一个读取器可以在没有任何锁的情况下读取其他进程的索引。因为我没有使用任何同步原语,所以我担心读取器进程可能会由于逐字节写入内存而读取损坏的数据(例如,一个索引的前2个......
  • Python如何统治AI世界?一文读懂它的优势与挑战
    一、Python语言介绍1.1Python语言概述Python是一种由GuidovanRossum于1991年首次发布的高级编程语言。其设计理念强调代码的可读性和简洁性,使其成为了许多开发者的首选语言。Python的语法简洁直观,采用了缩进来定义代码块,这与其他使用花括号或关键词的编程语言不同。Python......
  • 找到一种方法将program1的输出作为python中program2的输入发送
    有人可以帮我找到一种方法将program1的输出作为python中的program2的输入发送将其保存为.csv文件不会对我有帮助,因为该程序应该尽快执行这些任务。因此我正在寻找一种方法将程序1的终端输出直接发送到程序2在Python中,可以使用子进程模块将一个程序的输出发送到另一个程......
  • 同时运行多个Python程序的最佳方法
    我有一个python程序,我想同时运行多个具有不同参数的实例。这些实例彼此之间不进行通信。在单独的终端中运行每个实例太乏味了。我考虑使用多处理模块将每个实例作为单独的进程运行,但是我希望能够随时停止和重新启动某些单独的实例,而不会中断其他正在运行的实例。是否有任何流程......
  • 替换 Python 数据框中包含值的 <
    我有一个数据框,在某些列中存在诸如“<0.5、<10、<100”等值。如果值仅包含“<”,我想将所有这些值替换为0。我该怎么做?我对Python比较陌生。尝试使用pd.DataFrame.replace()。importpandasaspd#创建示例数据框df=pd.DataFrame({'A':['<0.5','<10',15,20],......
  • 基于funasr+pyaudio实现电脑本地麦克风实时语音识别项目语音转文本python实现
    【框架地址】https://github.com/modelscope/FunASR【简单介绍】FunASR是一个功能全面的语音识别工具包,支持多种预训练模型的推理和微调,提供高精度和高效能的语音识别服务。结合PyAudio库,可以实现电脑本地麦克风实时语音识别项目。该项目首先通过PyAudio库捕获麦克风输入的......