如何用Aiogram让Telegram Bot主动给未对话过的新频道用户发消息?
解决Telegram Bot无法给未互动用户发私聊消息的问题
核心原因是Telegram Bot API的隐私限制:Bot无法主动向未发起过对话的用户发送私聊消息,这是平台为避免垃圾消息骚扰用户设定的机制。以下是可行的解决办法:
1. 引导用户主动与Bot互动
在频道的欢迎提示(或自动回复)中明确告知用户需要先和Bot开启对话,比如:
欢迎加入频道!请先点击 @你的Bot用户名 发送任意消息或/start,之后会收到专属欢迎指引~
用户完成互动后,Bot就能获得会话权限,后续可正常发送私聊消息。
2. 改为在频道内@用户发送公开欢迎消息
如果不需要私聊,直接在频道内@用户发送公开欢迎消息,无需用户提前互动:
# 替换成你的频道ID CHANNEL_ID = -100XXXXXXXXX async def send_channel_welcome(user_id, username): # 优先使用用户名,无用户名则显示用户ID mention = f'@{username}' if username else f'用户{user_id}' await support_bot.send_message( chat_id=CHANNEL_ID, text=f'{mention} 欢迎加入我们的频道!' )
3. 实现「强制互动后加入」的逻辑
将Bot设置为频道管理员,开启「审核加入请求」功能,逻辑如下:
- 用户申请加入频道时,Bot拦截请求并回复用户(此时用户主动发起申请,Bot可正常回复)
- 用户回复Bot后,Bot自动批准其加入频道,并发送欢迎消息
示例代码片段:
# 处理用户加入请求 @router.chat_join_request() async def handle_join_request(request: ChatJoinRequest): # 回复用户触发会话权限 await support_bot.send_message( chat_id=request.from_user.id, text='请发送任意消息确认,即可加入频道~' ) # 处理用户回复 @router.message() async def handle_user_reply(message: Message): # 验证用户是否有待处理的加入请求(省略数据库查询逻辑) if has_pending_request: # 批准加入 await support_bot.approve_chat_join_request( chat_id=CHANNEL_ID, user_id=message.from_user.id ) # 发送欢迎消息 await support_bot.send_message( chat_id=message.from_user.id, text='欢迎加入频道!这是为你准备的专属内容...' )
4. 捕获异常并给出提示
如果坚持要发私聊消息,捕获「chat not found」异常,在频道内提示用户调整设置或互动:
async def send_private_welcome(user_id, username): try: await support_bot.send_message(user_id, 'Welcome to the channel!') except Exception as e: if 'chat not found' in str(e).lower(): await support_bot.send_message( chat_id=CHANNEL_ID, text=f'@{username} 无法给你发送私聊消息,请先点击 @你的Bot用户名 发送任意消息开启对话~' )
内容的提问来源于stack exchange,提问作者Artttezy
相关产品推荐
相关产品推荐

