自定义前缀 discord.py、json 文件

custom prefix discord.py, json file

我看过所有的教程、所有的论坛,他们都对 discord 机器人的自定义前缀说了同样的话。 我试过了,但没用。 我什至尝试过复制粘贴代码并更改名称。 我不知道现在要做什么,这是我的代码:

def get_prefix(client, message):
    with open('prefixes.json', 'r') as f:
        prefixes = json.load(f)
    return prefixes[str(message.guild.id)]

client = commands.Bot(command_prefix = get_prefix, help_command = None)
slash = SlashCommand(client, sync_commands = True)

@client.event
async def on_ready():
    activity = discord.Game(name="!help", type=3)
    await client.change_presence(activity=activity)
    print('online !')

@client.event
async def on_guild_join(guild):
    with open('prefixes.json', 'r') as f:
        prefixes = json.load(f)

    prefixes[str(guild.id)] = '!'

    with open('prefixes.json', 'w') as f:
        json.dump(prefixes, f, indent=4)

@client.event
async def on_guild_remove(guild):
    with open('prefixes.json', 'r') as f:
        prefixes = json.load(f)

    prefixes.pop(str(guild.id))

    with open('prefixes.json', 'w') as f:
        json.dump(prefixes, f, indent=4)

这是我的错误信息:

Ignoring exception in on_guild_join
Traceback (most recent call last):
  File "C:\Users\ethom\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\client.py", line 343, in _run_event
    await coro(*args, **kwargs)
  File "C:\Users\ethom\PycharmProjects\discord\rocket_bot\rocket.py", line 32, in on_guild_join
    prefixes = json.load(f)
  File "C:\Users\ethom\AppData\Local\Programs\Python\Python38\lib\json\__init__.py", line 293, in load
    return loads(fp.read(),
  File "C:\Users\ethom\AppData\Local\Programs\Python\Python38\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "C:\Users\ethom\AppData\Local\Programs\Python\Python38\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\ethom\AppData\Local\Programs\Python\Python38\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

在大多数情况下,您的 json.load - JSONDecodeError: Expecting value: line 1 column 1 (char 0) 错误是由于:

  1. 非JSON 符合引用
  2. XML/HTML输出(即以<开头的字符串),或者
  3. 不兼容的字符编码

最终,错误告诉您字符串在第一个位置已经不符合 JSON。

尝试调试以验证您正在阅读的文件的内容:

@client.event
async def on_guild_join(guild):
    with open('prefixes.json', 'r') as f:
        #Verify the content is really "{}"
        print(f.read())
        prefixes = json.load(f)
        
    prefixes[str(guild.id)] = '!'

    with open('prefixes.json', 'w') as f:
        json.dump(prefixes, f, indent=4)

如果此验证未通过,您需要将 'prefixes.json' 的修复路径指定为 'complete_path/prefixes.json' 以确保读取正确的文件。

如果不是路径问题,您也可以尝试在读取文件时更改编码:

 with open('prefixes.json', 'r') as f:
      prefixes = json.loads(f.read().encode("utf-8"))

我已经回答了我自己的问题。 它说找不到 json 文件,但实际上,这不是代码问题。 是文件问题,我把__pycache__文件删了,突然就可以正常使用了。 所以,我的结论是你的 bot 文件夹中不能有任何目录。

所以,祝你有美好的一天!希望我的回答对你有用。