在Telegram群组中,置顶消息是管理员发布公告、维持秩序的重要功能。对于机器人开发者而言,通过代码自动置顶消息可以极大提升群组管理效率,实现公告推送、重要信息固定等场景。本文将深入讲解如何利用Telegram Bot API,在主流开发框架中编写代码实现群组消息的置顶与取消置顶,并附上可直接运行的示例。
前置准备:创建机器人并设置管理员权限
在编写代码之前,你需要完成以下准备:
- 在Telegram中与@BotFather对话,创建你自己的机器人并获取
BOT_TOKEN。 - 将机器人加入目标群组,并在群组管理中将机器人设为管理员。
- 确保该管理员角色拥有“置顶消息”权限(
can_pin_messages),否则调用API时会返回403错误。 - 确定目标群组的
chat_id(形如-1001234567890,或使用群组公开链接的用户名)以及要置顶的消息ID。
Python实现:python-telegram-bot框架
python-telegram-bot是目前最流行的Telegram Bot Python框架。以下示例展示如何响应指令并置顶机器人自己发送的消息。
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes
# 你从BotFather获取的Token
TOKEN = "YOUR_BOT_TOKEN"
async def pin_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""置顶当前用户发送的这条消息"""
try:
# 置顶用户发的消息
await context.bot.pin_chat_message(
chat_id=update.effective_chat.id,
message_id=update.effective_message.message_id,
disable_notification=False # 是否静默置顶,True则不发送通知
)
await update.message.reply_text("消息已置顶 ✅")
except Exception as e:
await update.message.reply_text(f"置顶失败:")
# 也可以写一个置顶机器人自己回复的消息的版本
def main():
app = Application.builder().token(TOKEN).build()
app.add_handler(CommandHandler("pin", pin_command))
print("机器人已启动,发送 /pin 试试吧!")
app.run_polling() # 轮询模式
if __name__ == "__main__":
main()
如果想置顶任意一条已存在的消息,只需替换message_id参数为对应消息的ID即可。你可以通过数据库或监听新消息来获取并存储想要置顶的消息ID。
Python实现:aiogram框架(异步原生)
aiogram是另一个强大的异步框架,尤其适合复杂场景。以下代码展示aiogram 3.x版本的操作方式。
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command
BOT_TOKEN = "YOUR_BOT_TOKEN"
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()
@dp.message(Command("pin"))
async def pin_handler(message: types.Message):
"""置顶用户发送的消息"""
try:
# aiogram 3.x使用bot.pin_chat_message方法
await bot.pin_chat_message(
chat_id=message.chat.id,
message_id=message.message_id,
disable_notification=False
)
await message.reply("置顶成功!")
except Exception as e:
await message.reply(f"置顶失败: ")
# 入口函数
async def main():
await bot.delete_webhook(drop_pending_updates=True)
await dp.start_polling(bot)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Node.js实现:Telegraf框架
对于JavaScript/Node.js开发者,Telegraf是社区最活跃的框架。以下是完整示例:
const { Telegraf } = require('telegraf');
const bot = new Telegraf('YOUR_BOT_TOKEN');
// 命令 /pin 置顶这条命令消息本身
bot.command('pin', (ctx) => {
ctx.pinChatMessage(
ctx.chat.id,
ctx.message.message_id,
{ disable_notification: false }
).then(() => ctx.reply('消息已置顶 ✅'))
.catch((err) => ctx.reply('置顶失败: ' + err));
});
// 也可以使用内联键盘触发置顶逻辑
bot.launch();
console.log('Bot is running...');
在Telegraf中,ctx.pinChatMessage是对Bot API的直接封装,参数与官方一致。如果你想置顶某条由机器人发送的消息,可以在sendMessage返回后获取message_id再调用置顶。
常见错误与处理建议
- 403 Forbidden:机器人不是群组管理员,或缺少“置顶消息”权限。请检查群组管理员设置。
- 400 Bad Request:
chat_id或message_id无效。确认消息确实存在于该群组中,且消息未被删除。 - 409 Conflict:如果使用Webhook模式同时启用了轮询,可能引发冲突。请只使用一种接收方式。
- 消息无法置顶:某些服务消息或匿名消息可能无法被置顶,建议先让机器人发送一条新消息再置顶。
扩展技巧:结合权限判断与批量操作
在实际开发中,你可能需要先检测用户是否为管理员,再执行置顶操作。以下思路可参考:
// 伪代码示例
async function isAdmin(chatId, userId) {
const chatMember = await bot.getChatMember(chatId, userId);
return ['administrator', 'creator'].includes(chatMember.status);
}
另外,调用unpin_all_chat_messages可以一键清除所有置顶消息,适合定期刷新公告场景。
总结
本文提供了三种主流框架的置顶消息代码示例,并解释了所需权限与常见问题。无论你使用Python还是Node.js,都可以快速集成到自己的机器人中。记住,置顶消息只是群组管理的一个环节,结合其他API(如删除消息、管理员操作)可以让你的机器人在群组中发挥更大价值。动手试试吧,让代码替你高效管理群组!