You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让自建Telegram Bot实现帖子点赞/点踩按钮及计数器

实现Telegram Bot带计数的点赞/点踩按钮(无需依赖其他Bot)

核心逻辑

不用第三方Bot的话,核心就是靠Telegram Bot API的内联键盘和回调查询,自己维护投票计数、处理重复投票,最后通过编辑消息更新按钮上的数字就行。

具体实现步骤

1. 存投票数据

得找个地方存每个帖子的点赞数、点踩数,还要记哪些用户投过票(防重复):

  • 测试用的话,直接用内存字典就行,比如post_votes = {post_id: {'like':0, 'dislike':0, 'voted_users': set()}},但Bot重启数据就没了;
  • 正式环境必须用数据库,比如SQLite,建表语句可以这么写:
    CREATE TABLE post_votes (
        post_id TEXT PRIMARY KEY,
        like_count INTEGER DEFAULT 0,
        dislike_count INTEGER DEFAULT 0,
        voted_users TEXT -- 用JSON存用户ID集合,比如 "[12345,67890]"
    );
    

2. 发带按钮的初始帖子

发消息的时候给按钮绑定带标识的callback_data,比如like_帖子ID、dislike_帖子ID,方便后面识别操作。用Python的python-telegram-bot库举个例子:

from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler

# 内存存储示例
post_votes = {}

def send_test_post(update, context):
    # 用消息ID当帖子唯一标识,发完消息后能拿到
    channel_id = "@your_channel_id"
    msg = context.bot.send_message(chat_id=channel_id, text="这是一条带投票的测试帖")
    post_id = str(msg.message_id)
    
    # 初始化该帖子的投票数据
    post_votes[post_id] = {'like':0, 'dislike':0, 'voted_users': set()}
    
    # 构建带计数的内联键盘
    keyboard = [
        [
            InlineKeyboardButton(f"👍 {post_votes[post_id]['like']}", callback_data=f"like_{post_id}"),
            InlineKeyboardButton(f"👎 {post_votes[post_id]['dislike']}", callback_data=f"dislike_{post_id}")
        ]
    ]
    # 更新刚发的帖子,加上键盘
    context.bot.edit_message_reply_markup(
        chat_id=channel_id,
        message_id=msg.message_id,
        reply_markup=InlineKeyboardMarkup(keyboard)
    )

3. 处理投票回调

监听用户点击按钮的回调事件,解析操作类型和帖子ID,更新计数后再编辑消息刷新按钮:

def handle_vote_callback(update, context):
    query = update.callback_query
    query.answer()  # 必须调用,不然用户那边会一直显示加载
    
    # 拆分回调数据,拿到操作和帖子ID
    action, post_id = query.data.split("_", 1)
    user_id = query.from_user.id
    
    # 检查用户是否已经投过票
    if user_id in post_votes[post_id]['voted_users']:
        query.answer("你已经投过票啦!", show_alert=True)
        return
    
    # 更新计数
    if action == "like":
        post_votes[post_id]['like'] += 1
    elif action == "dislike":
        post_votes[post_id]['dislike'] += 1
    
    # 标记该用户已投票
    post_votes[post_id]['voted_users'].add(user_id)
    
    # 重新构建带最新计数的键盘
    new_keyboard = [
        [
            InlineKeyboardButton(f"👍 {post_votes[post_id]['like']}", callback_data=f"like_{post_id}"),
            InlineKeyboardButton(f"👎 {post_votes[post_id]['dislike']}", callback_data=f"dislike_{post_id}")
        ]
    ]
    # 编辑消息,更新键盘
    query.edit_message_reply_markup(reply_markup=InlineKeyboardMarkup(new_keyboard))

# 注册处理器,启动Bot
updater = Updater("你的BotToken")
dp = updater.dispatcher
dp.add_handler(CommandHandler("sendpost", send_test_post))
dp.add_handler(CallbackQueryHandler(handle_vote_callback))

updater.start_polling()
updater.idle()

4. 关键注意点

  • 帖子ID尽量用频道消息的ID,唯一且好对应;
  • 一定要做重复投票校验,不然用户能无限点;
  • 内存存储只适合测试,正式环境必须用数据库持久化数据;
  • 确保Bot是频道的管理员,有编辑消息的权限;
  • callback_data最大只能64字节,所以帖子ID别太长,或者用短编码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:31:34