Python Telegram Bot 如何等待用户回答问题并返回

2023-11-23

Context:

我在用PyTelegramBotAPi or Python 电报机器人

当用户开始对话时,我正在运行一段代码。

当用户开始对话时,我需要向他发送第一张图片和一个问题,如果他看到图片中的东西,该函数需要等待用户输入并返回无论他是否看到。

之后,我需要继续循环发送图片并等待答案并对其运行二分算法。

到目前为止我已经尝试过:

我尝试使用等待响应的回复标记或带有处理程序的内联键盘,但我陷入困境,因为我的代码正在运行而不等待用户输入。

代码:

@bot.message_handler(func=lambda msg: msg in ['Yes', 'No'])
@bot.message_handler(commands=['start', 'help'])
def main(message):
    """
    This is my main function
    """
    chat_id = message.chat.id
    try:
        reply_answer = message.reply_to_message.text
    except AttributeError:
        reply_answer = '0'
    # TODO : should wait for the answer asynchnonossly
    def tester(n, reply_answer):
        """
        Displays the current candidate to the user and asks them to
        check if they see wildfire damages.
        """
        print('call......')
        bisector.index = n
        bot.send_photo(
            chat_id=chat_id,
            photo=bisector.image.save_image(),
            caption=f"Did you see it Yes or No {bisector.date}",
            reply_markup=types.ForceReply(selective=True))
        # I SHOUL WAIT FOR THE INPUT HERE AND RETURN THE USER INPUT
        return eval(reply_answer)
    culprit = bisect(bisector.count, lambda x: x, partial(tester, reply_answer=reply_answer) )
    bisector.index = culprit
    bot.send_message(chat_id, f"Found! First apparition = {bisector.date}")


bot.polling(none_stop=True)

我在用户输入上运行的算法是这样的:

def bisect(n, mapper, tester):
    """
    Runs a bisection.

    - `n` is the number of elements to be bisected
    - `mapper` is a callable that will transform an integer from "0" to "n"
      into a value that can be tested
    - `tester` returns true if the value is within the "right" range
    """

    if n < 1:
        raise ValueError('Cannot bissect an empty array')

    left = 0
    right = n - 1

    while left + 1 < right:
        mid = int((left + right) / 2)

        val = mapper(mid)
        tester_values = tester(val) # Here is where I am using the ouput from Telegram bot
        if tester_values:
            right = mid
        else:
            left = mid

    return mapper(right)

我希望我清楚地解释了这个问题,请随时提出任何澄清。 如果您知道一些可以为我指明解决此问题的正确方向的信息,请告诉我。

我尝试过类似的问题,但没有得到答案。


您应该将用户信息保存在数据库中。基本字段是:

(id, first_name, last_name, username, menu)

什么是菜单?

菜单保留用户的当前状态。当用户向您的机器人发送消息时,您可以检查数据库以了解用户的当前状态。

因此,如果用户不存在,您可以将其添加到用户表中menu set to MainMenu or WelcomeMenu或者在你的情况下PictureMenu.

现在您将拥有一个用于更新功能的侦听器,让我们假设每个侦听器都是一个菜单。

@bot.message_handler(commands=['start', 'help'])

所以当用户发送start您将检查函数内的用户菜单字段。

@bot.message_handler(commands=['start', 'help'])
def main(message):
    user = fetch_user_from_db(chat_id)
    if user.menu == "PictureMenu":
        if message.photo is Not None:
            photo = message.photo[0].file_id
            photo_file = download_photo_from_telegram(photo)
            do_other_things()
            user.menu = "Picture2Menu";
            user.save();
        else:
            send_message("Please send a photo")
    if user.menu == "Picture2Menu":
        if message.photo is Not None:
            photo = message.photo[0].file_id
            photo_file = download_photo_from_telegram(photo)
            do_other_things()
            user.menu = "Picture3Menu";
            user.save();
        else:
            send_message("Please send a photo")   
    ...

我希望你明白了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Telegram Bot 如何等待用户回答问题并返回 的相关文章

  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • 如何使用Conda下载python包并随后离线安装?

    我知道通过 pip 我可以使用以下命令下载 Python 包 但 pip install 破坏了我的内部包依赖关系 当我做 pip download
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 使用 Tkinter 显示 numpy 数组中的图像

    我对 Python 缺乏经验 第一次使用 Tkinter 制作一个 UI 显示我的数字分类程序与 mnist 数据集的结果 当图像来自 numpy 数组而不是我的 PC 上的文件路径时 我有一个关于在 Tkinter 中显示图像的问题 我为
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip

随机推荐

  • AWS ec2 根卷增加:在 aws ubuntu 实例上扩展弹性根卷不起作用

    我已经关注了用于扩展弹性根卷的 aws 文档我的根卷大小从 8 GB 增加到 20 GB 我确认使用lsblk NAME MAJ MIN RM SIZE RO TYPE MOUNTPOINT xvda 202 0 0 20G 0 disk
  • 将 xtable 输出拆分为子表

    有一个关于在有多列时将 xtable 与 Sweave 一起使用的问题 我正在处理的表格大约有 25 列和 5 行 确切的列数未知 因为它是动态的 当我跑步时说 表 1 我得到的表格基本上超过了页面长度 ColA ColB ColC Row
  • XCHG 在 Intel 汇编语言中如何工作?

    如何xchg以下代码中的指令工作 已知arrayD是一个 DWORD 数组 1 2 3 mov eax arrayD eax 1 xchg eax arrayD 4 eax 2 arrayD 2 1 3 为什么后面不是数组 1 1 3xch
  • 正则表达式匹配单个点而不是两个点?

    尝试创建用于电子邮件地址检查的正则表达式模式 这将允许使用点 但如果有多个点相邻 则不允许使用点 应匹配 电子邮件受保护 不应该匹配 电子邮件受保护 现在我知道互联网上有数千个用于电子邮件匹配的示例 因此请不要向我发布包含完整解决方案的链接
  • Matlab - save(int2str(i), x) 不起作用 - 参数必须包含字符串

    我有一个循环正在生成一些数据 在某些情况下我想保存数据 因此我有 save int2str i x 这不起作用并显示以下消息 Error using gt save Argument must contain a string 我究竟做错了
  • 无法 Dockerize Vite React-Typescript 项目

    我正在尝试对 Vite React Typescript 样板设置进行 dockerize 但无法连接到容器 安装了 vite react typescript 样板 npm init vite latest vite docker dem
  • 返回 http 200 OK,响应正文中有错误

    我想知道返回是否正确HTTP 200 OK当服务器端发生错误时 错误详细信息将包含在响应正文中 Example 我们正在发送HTTP GET 服务器端发生了一些意想不到的事情 服务器返回HTTP 200 OK响应中存在错误的状态代码 例如
  • 如何通过给出私钥获得RSA公钥?

    我正在寻找一个 Java 函数 它将获取 RSA 私钥并返回正确的 RSA 公钥 或者 是否有一个函数可以告诉我们 RSA 私钥 公钥是否有效 如果您有私钥作为RSA私钥对象 您可以获得公共指数以及模数 然后你可以像这样创建公钥 RSAPu
  • 如何在 django 的 ModelForm 中使用 DatePicker?

    我正在使用 django 3 0 我试图在我的 ModelForm 中显示一个日期选择器小部件 但我不知道如何 我能得到的只是文本字段 我尝试寻找一些解决方案 但找不到任何解决方案 这就是我的模型和 ModelForm 的样子 class
  • 在 AngularJS 自定义验证指令中调用异步服务

    我有一个自定义验证指令 验证用户名尚不存在 验证使用 http服务询问服务器用户名是否存在 因此返回的是一个promise对象 这对于验证来说非常有效 当用户名已被使用时 表单无效并包含 myform error usernameVerif
  • 如何将 Angular Promise 转换为 jquery 延迟对象

    我想将承诺从我的模块 sdk 返回到非角度 javascript 例如 如果我将 Promise 返回给 jquery 我可能应该发送 jquery 延迟对象 如何将 Angular Promise 转换为 jquery Promise D
  • Xcode 6 iPhone 模拟器应用程序支持位置

    在 Xcode 6 中 我有一个正在使用 Core Data 的应用程序 但 iOS 8 iPhone 模拟器的应用程序支持中没有文件夹 我的文件和 Core Data sqlite 数据库存储在哪里 模拟器目录已随 Xcode 6 bet
  • 操作栏 Sherlock SearchView 单击时不会展开

    我有一个 Sherlock 片段活动 我使用片段寻呼机适配器从中设置不同的 Sherlock 片段 现在 为了在每个片段中显示搜索视图 我已将此方法放置在片段的 onCreate 中 此方法将在片段的 ActionBar 中显示菜单项 Ov
  • 为什么使用“g++”而不是“gcc”来编译 *.cc 文件?

    我编译了一个使用的库g 代替gcc 一开始我以为源代码是用C 写的 后来发现 cc文件里并没有任何C 代码 为了确认这一点 我更换了g 在原始 makefile 中gcc 而且我仍然得到了正确的程序 解释是什么 我不是第一次遇到这样的情况
  • 从密码字符串派生加密密钥和 IV 时,可以使用密码的 SHA1 哈希值作为盐吗?

    我在用着Rfc2898DeriveBytes从用户提供的字符串密码安全地生成加密密钥和初始化向量 以与对称加密 例如 AesManaged 一起使用 我将密码的 SHA1 哈希值作为盐参数Rfc2898DeriveBytes 这可以吗 如果
  • 需要 .NET WinForms IP 地址控件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要一个强大的 用户友好的 具有专业外观的 NET WinForms IP 地址控件 以便在我正在进行的项目中使用 此控件至少应支持 IPv4 寻
  • 将科学记数法转换为浮点数

    遇到一个问题 我的 JSON 数据被打印为科学记数法而不是浮点数 import urllib2 import json import sys url https bittrex com api v1 1 public getmarketsu
  • 如何设置间隔来调用类中的函数

    我有一堂课 比如 function run this interval this start function this interval setInterval this draw 1000 this draw function some
  • Win2D中如何计算一段文本的大小

    我正在使用 Win2D 为 Windows 10 编写一个应用程序 并且尝试绘制一个可动态缩放的形状以适应其中的任何文本 我想做的是计算出给定 CanvasTextFormat 的特定字符串有多大 然后用它来设置形状的大小 我的问题是我似乎
  • Python Telegram Bot 如何等待用户回答问题并返回

    Context 我在用PyTelegramBotAPi or Python 电报机器人 当用户开始对话时 我正在运行一段代码 当用户开始对话时 我需要向他发送第一张图片和一个问题 如果他看到图片中的东西 该函数需要等待用户输入并返回无论他是