如何让自建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
相关产品推荐
相关产品推荐

