如何使用discord.py调用Discord平台中其他机器人的命令?
问题分析与解决方案
核心问题:机器人账号无法触发其他机器人的命令
没错,调用Midjourney这类第三方机器人的斜杠命令,得用真实用户账号的身份发起交互——Discord平台默认限制机器人账号触发其他机器人的命令,这是权限层面的规则,所以你用discord.py的机器人账号直接调用肯定跑不起来。
可行实现方案
1. 用用户令牌登录Discord
你需要获取自己Discord账号的用户令牌(注意:Discord服务条款不鼓励用用户令牌做自动化操作,风险自行承担),然后以用户身份登录discord.py,再发起命令:
import discord from discord.ext import commands import asyncio # 替换成你自己的用户令牌 USER_TOKEN = "你的Discord用户令牌" # 初始化客户端,开启所有必要权限 bot = commands.Bot(command_prefix="!", intents=discord.Intents.all()) @bot.event async def on_ready(): print(f"已以用户 {bot.user} 身份登录Discord") # 替换成你的目标服务器ID和频道ID guild = bot.get_guild(1234567890) channel = guild.get_channel(987654321) # 调用Midjourney的/imagine命令 await channel.send("/imagine cat") async def main(): # bot=False表示以普通用户身份登录,而非机器人账号 await bot.start(USER_TOKEN, bot=False) asyncio.run(main())
2. 和aiogram结合的异步兼容写法
如果要对接Telegram的aiogram框架,得保证两个异步客户端的事件循环不冲突,用asyncio.create_task分别启动就行:
import discord from discord.ext import commands from aiogram import Bot, Dispatcher, types from aiogram.filters import CommandStart import asyncio # Discord配置 DISCORD_USER_TOKEN = "你的Discord用户令牌" TARGET_GUILD_ID = 1234567890 # 目标服务器ID TARGET_CHANNEL_ID = 987654321 # 目标频道ID # Telegram配置 TELEGRAM_BOT_TOKEN = "你的Telegram机器人令牌" # 初始化Discord用户客户端 discord_client = commands.Bot(command_prefix="!", intents=discord.Intents.all()) # 初始化Telegram机器人 tg_bot = Bot(token=TELEGRAM_BOT_TOKEN) tg_dp = Dispatcher() @discord_client.event async def on_ready(): print(f"Discord用户登录成功:{discord_client.user}") # Telegram触发命令的逻辑 @tg_dp.message(CommandStart()) async def trigger_midjourney(message: types.Message): guild = discord_client.get_guild(TARGET_GUILD_ID) channel = guild.get_channel(TARGET_CHANNEL_ID) if channel: await channel.send("/imagine cat") await message.answer("已给Midjourney发出生成命令") else: await message.answer("找不到目标频道,请检查ID是否正确") # 启动Discord客户端的任务 async def run_discord(): await discord_client.start(DISCORD_USER_TOKEN, bot=False) # 启动Telegram客户端的任务 async def run_telegram(): await tg_dp.start_polling(tg_bot) # 同时运行两个异步任务 async def main(): discord_task = asyncio.create_task(run_discord()) telegram_task = asyncio.create_task(run_telegram()) await asyncio.gather(discord_task, telegram_task) asyncio.run(main())
关键注意点
- 令牌安全:用户令牌等于你的Discord账号密码,绝对不能泄露,也别提交到代码仓库。
- 合规风险:用用户令牌做自动化操作可能违反Discord的服务条款,有账号被封的风险,谨慎使用。
- 命令格式:确保斜杠命令的格式和你手动输入的完全一致,比如有些参数需要加引号,别写错。
- Intents权限:discord.py要开启
message_content等必要权限,不然发不了消息。
内容的提问来源于stack exchange,提问作者Zemmeus
相关产品推荐
相关产品推荐

