You need to enable JavaScript to run this app. pytelegrambotapi如何检测内联按钮的历史点击记录?
优惠活动
大模型
产品
解决方案
定价
更多

pytelegrambotapi如何检测内联按钮的历史点击记录?

实现思路

要跟踪用户历史点击行为,必须以*用户唯一ID(call.from_user.id)*为维度存储点击记录,不要使用chat id作为key,避免群组场景下多用户的点击记录互相混淆。根据是否需要留存记录,有两种常用的规范实现方案:


方案1:内存存储(单实例、无需持久化场景)

适合不需要长期保留点击记录、机器人无需多实例部署的场景,实现最简单。

  1. 定义全局字典存储用户点击记录:
# key为用户ID,value为该用户已点击的回调数据列表
user_click_history = {}
  1. 调整回调处理逻辑:
@bot.callback_query_handler(func=lambda call:True)
def callback(call):
    user_id = call.from_user.id
    # 初始化当前用户的点击记录
    if user_id not in user_click_history:
        user_click_history[user_id] = []
    
    # 示例逻辑:判断当前用户是否点击过2或3按钮
    if '2' in user_click_history[user_id] or '3' in user_click_history[user_id]:
        bot.send_message(call.message.chat.id, text="你此前已经点击过其他按钮")
    
    # 原有点击处理逻辑
    if call.data == '1':
        bot.send_message(chat_id=call.message.chat.id,text="1")
    elif call.data == '2':
        bot.send_message(chat_id=call.message.chat.id,text="2")
    elif call.data == '3':
        bot.send_message(chat_id=call.message.chat.id,text="3")
    
    # 将本次点击加入记录,可选去重避免重复记录同个按钮的多次点击
    user_click_history[user_id].append(call.data)
    # user_click_history[user_id] = list(set(user_click_history[user_id]))

注意:该方案下机器人重启后所有点击记录会清空。


方案2:持久化存储(需长期留存、多实例部署场景)

适合需要重启后保留记录、点击量较大的场景,可使用SQLite、Redis等存储,以下为内置SQLite的实现示例,无需额外安装依赖:

  1. 初始化数据库与操作方法:
import sqlite3

# 初始化数据库表
def init_db():
    conn = sqlite3.connect('click_history.db')
    cursor = conn.cursor()
    cursor.execute('''CREATE TABLE IF NOT EXISTS click_history
                 (user_id INTEGER, callback_data TEXT, click_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')
    conn.commit()
    conn.close()

# 写入点击记录
def add_click(user_id, callback_data):
    conn = sqlite3.connect('click_history.db')
    cursor = conn.cursor()
    cursor.execute("INSERT INTO click_history (user_id, callback_data) VALUES (?, ?)", (user_id, callback_data))
    conn.commit()
    conn.close()

# 查询用户是否点击过指定按钮
def check_clicked(user_id, target_data):
    conn = sqlite3.connect('click_history.db')
    cursor = conn.cursor()
    cursor.execute("SELECT 1 FROM click_history WHERE user_id = ? AND callback_data = ? LIMIT 1", (user_id, target_data))
    result = cursor.fetchone()
    conn.close()
    return result is not None

# 启动时初始化数据库
init_db()
  1. 调整回调处理逻辑:
@bot.callback_query_handler(func=lambda call:True)
def callback(call):
    user_id = call.from_user.id
    # 示例逻辑:判断是否点击过2或3按钮
    if check_clicked(user_id, '2') or check_clicked(user_id, '3'):
        bot.send_message(call.message.chat.id, text="你此前已经点击过其他按钮")
    
    # 原有点击处理逻辑
    if call.data == '1':
        bot.send_message(chat_id=call.message.chat.id,text="1")
    elif call.data == '2':
        bot.send_message(chat_id=call.message.chat.id,text="2")
    elif call.data == '3':
        bot.send_message(chat_id=call.message.chat.id,text="3")
    
    # 写入本次点击记录
    add_click(user_id, call.data)

如果点击量较大,可以替换为Redis存储,读写速度更快,也支持设置记录过期时间,适合临时跟踪点击的场景。


内容的提问来源于stack exchange,提问作者sdd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 06:51:03