Discord Python机器人距离计算事件无响应求助
解决Discord Python机器人距离计算功能无响应的问题
嘿,我帮你排查下这个机器人没反应的问题,大概率是几个基础配置或者代码细节写错了,我给你梳理几个关键修复点:
1. 客户端初始化完全错了!
你用discord.Client()却加了command_prefix参数,这根本不兼容啊!discord.Client是最基础的客户端,不支持命令前缀功能,要做带命令的机器人,得用commands.Bot才行,而且现在Discord必须要配置意图才能读取消息:
from discord.ext import commands import discord import gpxpy.geo import math import asyncio # 先配置意图,必须开message_content才能读取用户命令 intents = discord.Intents.default() intents.message_content = True # 换成commands.Bot初始化,这才是带命令功能的客户端 client = commands.Bot(command_prefix='kaikai*', intents=intents)
2. 事件装饰器拼写错误
你写的@client.async_even...明显打错了!正确的事件装饰器是@client.event,而且现在Discord.py的事件函数都用async def定义,不用加额外前缀:
@client.event async def on_message(message): # 一定要先加这句,不然自定义命令会失效 await client.process_commands(message) # 举个例子,识别你的距离计算命令 if message.content.startswith(f'{client.command_prefix}calc_distance'): # 拆分用户输入的参数 parts = message.content.split() if len(parts) != 5: await message.channel.send("格式不对哦!正确输入:kaikai*calc_distance 纬度1 经度1 纬度2 经度2") return try: lat1, lon1, lat2, lon2 = map(float, parts[1:5]) # 用gpxpy计算两点距离(单位米) distance = gpxpy.geo.haversine_distance(lat1, lon1, lat2, lon2) # 按宝可梦GO玩家大概的移动速度(1.5米/秒)算等待时间 wait_time = distance / 1.5 minutes = int(wait_time // 60) seconds = int(wait_time % 60) await message.channel.send(f"两地距离约{round(distance/1000,2)}公里,你大概要等{minutes}分{seconds}秒才能到哦!") except ValueError: await message.channel.send("请输入有效的数字坐标呀!") # 最后别忘了启动机器人,替换成你的令牌 client.run('你的机器人令牌')
3. 必须开启的权限配置
- 去Discord开发者后台的Bot页面,找到
Privileged Gateway Intents,把Message Content Intent开关打开,不然机器人读不到用户发的命令内容 - 邀请机器人进服务器时,要给它分配发送消息和读取消息历史的权限,不然它没法和用户互动
更规范的命令写法(推荐)
如果想用命令而不是监听消息事件,用@client.command()装饰器更靠谱,还能自动处理参数和错误:
@client.command() async def calc_distance(ctx, lat1: float, lon1: float, lat2: float, lon2: float): distance = gpxpy.geo.haversine_distance(lat1, lon1, lat2, lon2) wait_time = distance / 1.5 minutes = int(wait_time // 60) seconds = int(wait_time % 60) await ctx.send(f"两地距离约{round(distance/1000,2)}公里,你大概要等{minutes}分{seconds}秒才能到哦!") # 自动处理命令错误 @calc_distance.error async def calc_distance_error(ctx, error): if isinstance(error, commands.BadArgument): await ctx.send("请输入有效的数字坐标呀!") elif isinstance(error, commands.MissingRequiredArgument): await ctx.send("格式不对哦!正确输入:kaikai*calc_distance 纬度1 经度1 纬度2 经度2")
你先把这些基础错误修复了,应该就能正常运行了!如果还是有问题,再检查下机器人令牌是否正确,服务器里机器人有没有被禁言之类的。
内容的提问来源于stack exchange,提问作者Zen Chan
相关产品推荐
相关产品推荐

