在Telegram群组和频道中,投票是收集意见、活跃气氛的利器。而通过机器人创建投票,能实现自动化、定制化,甚至与外部数据联动。本文将从零开始,带你掌握Telegram机器人投票功能的完整实现路径,无论你是群主、频道运营者还是开发者,都能从中获得实用技能。
一、准备工作:创建机器人与获取令牌
要使用机器人功能,首先需要有一个Telegram机器人。打开与 @BotFather 的对话,发送 /newbot,按提示设置机器人名称和用户名。创建成功后,你会获得一个API令牌(形如 123456:ABC-DEF1234),这是机器人调用API的唯一凭证。请妥善保管,切勿泄露。
二、认识投票API:sendPoll方法
Telegram Bot API提供了 sendPoll 方法,用于发送原生投票。其核心参数包括:
- chat_id:目标群组、频道或用户ID
- question:投票问题
- options:选项列表(JSON数组,最多10个)
- is_anonymous:是否匿名投票(默认True)
- type:投票类型,可选
quiz或regular - allows_multiple_answers:是否允许多选
- correct_option_id:在测验模式下,正确选项的索引(从0开始)
- open_period 或 close_date:投票自动关闭的时长或时间戳
以下是一个Python示例(使用 python-telegram-bot 库):
from telegram import Bot
bot = Bot(token="YOUR_TOKEN")
bot.send_poll(
chat_id="@your_group",
question="你更喜欢哪种编程语言?",
options=["Python", "JavaScript", "Go", "Rust"],
is_anonymous=False,
allows_multiple_answers=True
)
三、创建投票的三种方式
1. 直接通过API发送
如上述示例,调用 sendPoll 即可发送原生投票。这种方式适合脚本或定时任务,适合快速发布。
2. 通过内联键盘实现自定义投票
如果你希望投票选项更灵活(比如带图标、带图片),可以使用内联键盘。通过 sendMessage 发送消息,并附上 InlineKeyboardMarkup。用户点击按钮时,机器人会收到 CallbackQuery,你可以自行记录统计结果。
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import CallbackQueryHandler
buttons = [[InlineKeyboardButton("选项A", callback_data="vote_a")]]
reply_markup = InlineKeyboardMarkup(buttons)
bot.send_message(chat_id, "请投票:", reply_markup=reply_markup)
随后在回调处理器中计数:
def button_callback(update, context):
query = update.callback_query
data = query.data
# 记录data到数据库或内存
query.answer("你已投票")
3. 结合群组管理员权限创建投票
如果机器人是群组管理员,还可以通过 sendPoll 直接发送,并且投票结果会显示在消息中。这种方式最简洁,推荐优先使用。
四、高级功能:定时投票与结果统计
借助任务调度(如APScheduler),可以定时发送投票。例如每周一自动发起“本周团建地点”投票。而投票结果统计,可以通过 poll.answer 字段获取实时数据,或使用 stopPoll 结束投票并返回最终结果。
# 停止投票并获取结果
result = bot.stop_poll(chat_id, message_id)
print(result)
对于内联键盘模式,你需要自己维护一个字典或数据库,记录每个callback_data的点击次数。
五、实战案例:一个自动化团队决策机器人
假设你要为团队开发一个“午餐吃什么”机器人。流程:每天11:30定时发送投票,选项为附近的餐厅,下午1点自动结束并统计结果。关键代码逻辑如下:
from telegram.ext import Updater, CommandHandler, JobQueue
def poll_job(context):
context.bot.send_poll(
chat_id=context.job.context,
question="今天午餐吃什么?",
options=["川菜", "粤菜", "火锅", "轻食沙拉"],
is_anonymous=False
)
# 在main中调度
def schedule_polls(update, context):
chat_id = update.effective_chat.id
context.job_queue.run_daily(poll_job, time=datetime.time(11, 30), context=chat_id)
六、常见问题与优化建议
- 投票能否修改? 官方不允许修改已发送的投票,但你可以用
editMessageText修改内联键盘版的投票。 - 如何防止刷票? 原生投票只能一人一票(可通过
is_anonymous控制显示)。内联键盘版建议记录用户ID,每个用户投票后禁用按钮。 - 投票结果可见性? 原生投票在结束后,用户可查看实时结果。你也可以设置
open_period控制关闭时间。
总结
通过Telegram机器人创建投票功能,不仅能简化日常运营,还能结合程序实现无数创意。从原生 sendPoll 到内联键盘,你已掌握了全部核心技术。现在就去打造一个专属投票机器人吧!如果你需要更高级的玩法,如投票后自动发送通知、对接外部数据库,可以在此基础上拓展。
祝你在Telegram的自动化之路上越走越远!