如何在discord.py中实现终端输入发至指定频道并接收消息
使用discord.py实现终端输入发消息+监听打印聊天内容
一、从终端输入发送到指定Discord频道
核心是在不阻塞discord.py异步事件循环的前提下,单独开线程处理终端输入,避免卡住机器人的事件监听逻辑:
- 提前获取机器人Token(Discord开发者门户获取)和目标频道ID(开启开发者模式后右键频道复制)
- 用线程循环读取终端输入,输入内容直接发送到指定频道;输入
exit可退出程序
二、监听并打印其他用户的聊天内容
需要监听on_message事件,注意discord.py v2.0+必须开启message_content意图才能读取消息内容,还要在Discord开发者门户的机器人设置里手动开启这个权限。
完整代码示例
import discord import asyncio import threading # 替换为你的机器人Token TOKEN = "你的机器人Token" # 替换为目标频道的整数ID TARGET_CHANNEL_ID = 123456789012345678 # 配置机器人意图,必须开启message_content才能读取消息内容 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) def terminal_input_handler(): """处理终端输入的线程函数""" while True: user_input = input("输入要发送的消息(输入exit退出):") if user_input.lower() == "exit": asyncio.run_coroutine_threadsafe(client.close(), client.loop) break # 获取目标频道对象 channel = client.get_channel(TARGET_CHANNEL_ID) if channel: # 异步发送消息到指定频道 asyncio.run_coroutine_threadsafe(channel.send(user_input), client.loop) else: print("未找到指定频道,请检查ID是否正确") @client.event async def on_ready(): print(f"已登录为 {client.user}") # 启动终端输入处理线程 threading.Thread(target=terminal_input_handler, daemon=True).start() @client.event async def on_message(message): # 忽略机器人自身发送的消息,避免循环触发 if message.author == client.user: return # 自定义打印格式,按需调整 print(f"[{message.channel.name}] {message.author.name}:{message.content}") # 启动机器人 client.run(TOKEN)
关键注意事项
- 安装最新版discord.py:
pip install discord.py - 必须在Discord开发者门户的「Bot」页面开启「Message Content Intent」权限
- 邀请机器人到服务器时,要勾选「发送消息」「读取消息历史」等必要权限
内容的提问来源于stack exchange,提问作者Dwij
相关产品推荐
相关产品推荐

