如何在discord.py中逐个运行多个Discord令牌 发送X条消息后切换下一个
Discord多令牌循环发送消息后主动终止客户端解决方案
核心原理
discord.py的client.run()是阻塞式调用,要在完成发送任务后退出阻塞继续下一个令牌的处理,只需要在任务完成后主动调用client.close()方法断开当前客户端连接即可。
实现步骤
- 每个令牌单独初始化客户端实例,避免不同令牌之间的状态污染
- 设置计数变量统计单令牌已发送消息数量,达到预设阈值X后终止发送
- 发送任务完成后主动调用
await client.close()退出当前客户端的阻塞运行 - 补充异常捕获逻辑,避免单令牌运行出错导致整个循环终止
可运行示例代码
import discord from discord import Intents # 自定义配置 SINGLE_TOKEN_SEND_LIMIT = X # 替换为单令牌需要发送的目标用户数X tokens = ["token1", "token2", "token3", "...", "token100"] # 替换为你的实际令牌列表 target_user_ids = [123456789, 987654321, "..."] # 替换为你要发送消息的用户ID列表 for idx, token in enumerate(tokens): current_sent = 0 # 每个令牌重新初始化客户端 intents = Intents.default() # 根据实际需要开启对应权限,比如获取消息、获取用户等 intents.members = True client = discord.Client(intents=intents) @client.event async def on_ready(): global current_sent print(f"当前使用第{idx+1}个令牌,已登录账号:{client.user}") for user_id in target_user_ids: if current_sent >= SINGLE_TOKEN_SEND_LIMIT: break try: user = await client.fetch_user(user_id) await user.send("你需要发送的消息内容") current_sent += 1 print(f"已发送成功:{current_sent}/{SINGLE_TOKEN_SEND_LIMIT}") except Exception as e: print(f"向用户{user_id}发送失败:{str(e)}") # 任务完成,关闭当前客户端 await client.close() try: client.run(token) except Exception as e: print(f"第{idx+1}个令牌运行异常,跳过:{str(e)}") # 运行到此处说明当前令牌处理完毕,自动进入下一个令牌循环
注意事项:
- 不要复用同一个客户端实例处理多个令牌,否则会出现会话冲突、状态异常问题
- 控制发送频率,避免触发Discord反垃圾机制导致令牌被封禁
- 可以根据需求调整异常处理逻辑,比如统计发送失败的用户后续重试
内容的提问来源于stack exchange,提问作者Raskolnikov
相关产品推荐
相关产品推荐

