如何使用python-telegram-bot将用户消息转发至Telegram群组?
解决python-telegram-bot转发用户消息到Telegram群组的问题
首先,先帮你指出现有代码里的几个小问题:
send_message函数缺了闭合的括号,语法会直接报错forward_message的参数填错了:chat_id需要是目标群组的数字ID(不能写群组名称),from_chat_id应该是用户发送消息的聊天ID(也就是用户和bot对话的那个聊天窗口ID),message_id是用户那条消息的专属ID
接下来一步步实现你要的功能:转发用户的消息到指定群组,同时把回复内容发送到群组里。
第一步:获取目标群组的chat_id
Telegram的群组/超级群组不能直接用名称作为chat_id,必须用数字ID。获取方法很简单:
- 把你的bot加入目标群组
- 在群组里随便发一条消息
- 写个临时handler打印
update.message.chat_id,或者用Telegram的@getidsbot来获取(把这个bot拉进群组,它会自动返回群组ID)- 注意:群组ID一般是负数格式,比如
-1001234567890
- 注意:群组ID一般是负数格式,比如
第二步:修正并完善代码
如果你用的是python-telegram-bot v12及旧版本(同步写法)
# 先替换成你自己的群组ID和bot token GROUP_CHAT_ID = -1001234567890 BOT_TOKEN = "你的bot token" def feed(bot, update): # 获取用户发送的消息对象 user_msg = update.message # 转发用户的消息到目标群组 bot.forward_message( chat_id=GROUP_CHAT_ID, from_chat_id=user_msg.chat_id, # 用户和bot对话的聊天窗口ID message_id=user_msg.message_id # 用户那条消息的专属ID,确保转发内容准确 ) # 在目标群组发送回复内容 bot.send_message( chat_id=GROUP_CHAT_ID, text="reply this message" ) # 注册handler并启动bot(完整示例) from telegram.ext import Updater, MessageHandler, Filters updater = Updater(token=BOT_TOKEN, use_context=False) dispatcher = updater.dispatcher # 监听所有非命令的文本消息,触发feed函数 dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, feed)) updater.start_polling() updater.idle()
如果你用的是python-telegram-bot v20+版本(异步写法,官方推荐)
新版本改用Application和异步函数,写法如下:
from telegram import Update from telegram.ext import ApplicationBuilder, MessageHandler, filters, ContextTypes # 替换成你的信息 GROUP_CHAT_ID = -1001234567890 BOT_TOKEN = "你的bot token" async def feed(update: Update, context: ContextTypes.DEFAULT_TYPE): user_msg = update.message # 转发用户消息到群组 await context.bot.forward_message( chat_id=GROUP_CHAT_ID, from_chat_id=user_msg.chat_id, message_id=user_msg.message_id ) # 在群组发送回复 await context.bot.send_message( chat_id=GROUP_CHAT_ID, text="reply this message" ) def main(): application = ApplicationBuilder().token(BOT_TOKEN).build() # 监听所有非命令的文本消息 application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, feed)) application.run_polling() if __name__ == '__main__': main()
关键注意事项
- 确保你的bot已经加入目标群组,并且拥有发送消息和转发消息的权限(在群组权限设置里要开启对应权限)
- 不要用群组的用户名(比如@mygroup)作为
chat_id,必须用获取到的数字ID - 如果用户发送的是图片、文件等非文本消息,需要调整
Filters(比如Filters.photo)来匹配对应的消息类型
内容的提问来源于stack exchange,提问作者Karim




