首页 > 编程问答 >在预定时间从 python telegram bot 发起对话

在预定时间从 python telegram bot 发起对话

时间:2024-07-31 04:56:32浏览次数:14  
标签:python bots telegram

对于没有提供代码,我提前表示歉意。我明天会尝试添加它,但我现在还没有接近它,思考如何解决这个问题让我一直在思考。

我已经为一个机器人创建了一个程序,该程序的数据帧充满了之前请求的用户添加到机器人的消息列表中。现在,机器人使用 job_queue 在一天中的随机时间向每个用户发送一条消息。该消息要求用户输入,就像测验一样。这个想法是用户可以回复此消息。对话应该是在对话处理程序中进行的,现在对话处理程序的唯一入口点是带有命令“/start”的 CommandHandler。但是,我想在机器人发送测验问题后立即触发对话。

从机器人发送“/start”是行不通的。它不会触发任何东西。我使用 ChatGPT,它说发送消息,但使用 process_update 和 de_json 函数,这似乎以某种方式发送消息而不在聊天中显示它,但也没有触发对话处理程序。我研究了回调处理程序,但无法弄清楚这是否是正确的研究方法。

解决此问题的简单方法是要求用户发送“/start”,但我希望有更好的解决方案。我还想在一段时间后取消对话,但这很高兴,但我可以想象它可以/应该以类似的方式完成。

希望有人可以帮助我,提前致谢!


你不需要使用 /start 命令或隐藏消息来使用你的 Python Telegram 机器人发起对话。你可以使用 ConversationHandler 来实现这一点,即使对话是由机器人发起的。

以下是它的工作原理:

  1. 存储用户数据: 你已经将用户消息存储在一个数据框中。在该数据框中添加一列以跟踪用户是否处于“测验模式”。
  2. 使用 job_queue 发送测验问题: 当你使用 job_queue 向用户发送消息时,将他们的“测验模式”设置为 True
  3. 创建一个处理测验逻辑的回调处理程序: 此处理程序将检查用户的“测验模式”。如果为 True ,它将处理测验逻辑;如果为 False ,则忽略该消息。
  4. 使用 ConversationHandler 管理对话流: ConversationHandler 将使用回调处理程序来处理用户响应并指导对话。

以下是一个简单的示例:

from telegram import Bot, Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext, ConversationHandler

# 定义对话状态
QUIZ_MODE = 0

def start(update: Update, context: CallbackContext) -> None:
    """发送欢迎消息并设置测验模式"""
    update.message.reply_text("你好!我是测验机器人。")
    context.user_data['quiz_mode'] = False 

def send_quiz_question(context: CallbackContext) -> None:
    """从数据框中获取问题并将其发送给用户"""
    job = context.job
    user_id = job.context['user_id']
    # 从你的数据框中获取问题,并设置用户的“测验模式”为 True
    question = get_quiz_question(user_id)
    context.bot.send_message(chat_id=user_id, text=question)
    set_quiz_mode(user_id, True)

def quiz_handler(update: Update, context: CallbackContext) -> int:
    """处理测验逻辑"""
    user_id = update.effective_user.id
    if not is_in_quiz_mode(user_id):
        return ConversationHandler.END

    # 处理测验逻辑,检查答案等。
    answer = update.message.text
    if check_answer(user_id, answer):
        update.message.reply_text("正确!")
    else:
        update.message.reply_text("不正确。")

    # 重置测验模式并结束对话
    set_quiz_mode(user_id, False)
    return ConversationHandler.END

def main():
    """启动机器人"""
    updater = Updater("YOUR_BOT_TOKEN")
    dispatcher = updater.dispatcher

    # 添加处理程序
    dispatcher.add_handler(CommandHandler("start", start))
    conv_handler = ConversationHandler(
        entry_points=[MessageHandler(Filters.text & ~Filters.command, quiz_handler)],
        states={
            QUIZ_MODE: [MessageHandler(Filters.text & ~Filters.command, quiz_handler)],
        },
        fallbacks=[],
    )
    dispatcher.add_handler(conv_handler)

    # 使用 job_queue 定期发送问题
    for user_id in get_all_user_ids():
        context.job_queue.run_repeating(send_quiz_question, interval=3600, context={'user_id': user_id}) 

    # 启动机器人
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()

解释:

  • start 函数初始化用户的“测验模式”为 False
  • send_quiz_question 函数从你的数据框中获取问题,将其发送给用户,并将其“测验模式”设置为 True
  • quiz_handler 函数检查用户的“测验模式”。如果为 True ,则处理测验逻辑;如果为 False ,则忽略消息。
  • ConversationHandler 管理测验流程,确保仅在用户处于“测验模式”时才处理消息。

请注意:

  • 你需要替换 YOUR_BOT_TOKEN get_quiz_question set_quiz_mode is_in_quiz_mode check_answer 占位符。
  • 此代码仅作为起点。你需要根据你的具体需求进行调整。

通过这种方法,你可以在不需要用户发送 /start 命令的情况下启动对话,并创建更具吸引力的用户体验。

标签:python,bots,telegram
From: 78813651

相关文章

  • python函数:带星号的参数一个接一个
    我想知道为什么定义以下函数被认为是好的。deffoo(*x,y):pass据我所知,现在有调用此函数的方法,因为它总是缺少y的值。(如果我错了,请纠正我。)这有什么我不知道的用处吗?你说得对,在Python中定义一个像deffoo(*x,y):...这样的函数,在试图以常规方......
  • 基于遗传(GA)、粒子群(PSO)、模拟退火(SA)、禁忌搜索(ST)、蚁群算法(ACO)、自自组织神
        ......
  • 10个append()函数在Python程序开发中的创新应用
    文末赠免费精品编程资料~~在Python编程的世界里,append()函数是列表操作中最常见的方法之一。它允许我们在列表的末尾添加一个元素,这一简单的功能却能激发无限的创造力。今天,我们将探讨append()函数在Python程序开发中的10种创新应用,从基本用法到高级技巧,逐步深入。1.构......
  • 全网最适合入门的面向对象编程教程:28 类和对象的Python实现-Python编程原则、哲学和规
    全网最适合入门的面向对象编程教程:28类和对象的Python实现-Python编程原则、哲学和规范大汇总摘要:本文主要介绍了在使用Python进行面向对象编程时,Python异常处理的原则-“请求谅解,而非许可”,以及软件设计和Python的编程原则,同时介绍了PEP8规范。原文链接:FreakStud......
  • python生成器
    一前言环境:python3.10win10二生成器1关于生成器先看一个例子    定义了一个函数,当我们运行该函数时,并未像普通函数那样执行函数体内的代码    从其中的英文可知,执行函数得到了一个生成器对象,这个生成器对象也叫做generatoriterator(生成器迭代器),generatorit......
  • 生成MySQL-oracle-SQL server数据字典(附Python代码)
    生成数据字典,早年写的,请注意新的版本变化。(1)MySQL元数据SQLUSEinformation_schema;#取出库和表。select  TABLE_SCHEMAAS'数据库名称',  TABLE_NAMEAS'表名',  TABLE_TYPEAS'表类型',  ROW_FORMATAS'行格式',  ENGINEAS'数据库引擎',  TABL......
  • Python - Method Resolution Order (MRO)
    TheorderinwhichPythonsearchesforattributesinbaseclassesiscalledmethodresolutionorder(MRO).Itgivesalinearizedpathforaninheritancestructure.PythoncomputesanMROforeveryclassinthehierarchy;thisMROiscomputedusingthe‘C3......
  • 计算机毕业设计选题推荐-零食批发商仓库管理系统-Java/Python项目实战
    ✨作者主页:IT研究室✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......
  • 【自动化测试必学语言】python:语言基础
    目录Python介绍语言的分类注释单行注释多行注释变量定义变量使用变量变量名的命名规范数据类型数字类型非数字类型type()函数input输入print输出格式化输出快捷键(小操作)运算符算术运算符 比较运算符Python介绍作者:吉多·范罗苏姆(Guidov......
  • Python基础知识笔记——常用函数
    一、range()函数range()函数用于生成一个整数序列。它通常用于循环结构中,例如for循环,以提供循环的迭代次数。range()函数可以有1到3个参数。#range(start,stop,step)range(2,6,2)#生成从2开始,到6结束(不包括6),步长为2的一串数字#参数指定不完全时,默认从0开始,步长......