0
votes

Discord.py bot prend le fichier comme argument de la commande

Je dois prendre un fichier comme argument d'une commande de bot discord en le joignant au texte de la commande. Comment ferais-je cela? J'ai actuellement ce code mais le fichier n'est pas choisi comme argument:

Ignoring exception in command upload_file:
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/discord/ext/commands/bot.py", line 863, in invoke
    await ctx.command.invoke(ctx)
  File "/usr/local/lib/python3.7/site-packages/discord/ext/commands/core.py", line 721, in invoke
    await self.prepare(ctx)
  File "/usr/local/lib/python3.7/site-packages/discord/ext/commands/core.py", line 685, in prepare
    await self._parse_arguments(ctx)
  File "/usr/local/lib/python3.7/site-packages/discord/ext/commands/core.py", line 599, in _parse_arguments
    transformed = await self.transform(ctx, param)
  File "/usr/local/lib/python3.7/site-packages/discord/ext/commands/core.py", line 445, in transform
    raise MissingRequiredArgument(param)
discord.ext.commands.errors.MissingRequiredArgument: file is a required argument that is missing.
`

Pourquoi le fichier n'est-il pas passé en argument?

Et, plus important encore, comment puis-je faire en sorte qu'il en soit ainsi?

L'erreur exacte est la suivante:

@bot.command()
async def upload_file(ctx, file:discord.File):
    f = file.fp
    txt = f.read().decode("utf-8")
    file.close()
    print(txt)


2 commentaires

avec discordpy.readthedocs.io/en/latest/api.html?highlight=file#f‌ ?


@ eagle33322 oui j'ai regardé ça et ça ne répond pas à ma question


3 Réponses :


3
votes

J'ai lu la documentation de discord py et je pense que vous vous y prenez dans le mauvais sens. Les arguments de commande sont simplement analysés via le contexte de texte brut du message qu'il voit, donc y placer une pièce jointe ne sera pas capté de cette manière, mais vous pourrez toujours faire ce que vous voulez, bien que d'une manière différente.

La clé est l'argument de contexte de la commande (ctx): https://discordpy.readthedocs.io/en/latest/ext/commands/api.html#discord.ext.commands.Context

En regardant la documentation, vous verrez qu'elle a une instance de Message: https://discordpy.readthedocs.io/en/latest/api.html#discord.Message , qui contient une liste de pièces jointes: https: // discordpy. readthedocs.io/en/latest/api.html#discord.Attachment

Les pièces jointes ont un paramètre d'URL qui stocke où la pièce jointe est téléchargée sur discord (ce qui explique pourquoi vous ne pouvez pas prendre un fichier comme paramètre, les pièces jointes sont téléchargées sur les serveurs de discord indépendamment de votre bot discord). Le paramètre url vous permettra de télécharger le contenu dudit fichier et de faire tout le traitement que vous voudriez en faire, cependant. Voici donc un pseudo-code qui devrait fonctionner (encore une fois, tout cela à partir d'un coup d'œil rapide sur la documentation) en utilisant le module de requêtes pour télécharger la pièce jointe:

@bot.command()
async def upload_file(ctx):
    attachment_url = ctx.message.attachments[0].url
    file_request = requests.get(attachment_url)
    print(file_request.content)

Et pour récapituler, lorsque vous envoyez cette commande à votre bot avec une pièce jointe, cette pièce jointe est téléchargée sur des serveurs Discords et une URL et d'autres informations sont envoyées avec le message à votre bot de commande (et à toute autre personne qui écoute). Pour obtenir les données réelles du fichier, vous devez ensuite télécharger le fichier à partir de cette URL. À partir de là, vous pouvez en faire ce que vous voulez. Notez que la bibliothèque de requêtes est tierce, mais bien meilleure (imo) que la prise en charge intégrée de http. Je vous suggère également d'ajouter une gestion des cas de pointe à votre commande pour vous assurer qu'il y a effectivement une pièce jointe à traiter, etc.


0 commentaires

1
votes

Si vous avez besoin de travailler avec le fichier localement, il existe un moyen très simple: En Context : l'objet Message a un attribut appelé attachments . Liste de discord.Attachment ( https://discordpy.readthedocs.io/en/latest/api.html#discord.Attachment )

Je ne sais pas pourquoi, mais ce sera toujours la liste d'un objet

Il a une fonction de save qui accepte io.BufferedIOBase ou os.PathLike ( https://discordpy.readthedocs.io/en/latest/api.html#discord.Attachment.save )

Et déjà en fonction de l'objet transféré enregistre le fichier localement Ensuite, vous pouvez en faire tout ce que vous voulez


0 commentaires

0
votes

lorsqu'il est utilisé ce code:

b"data in the file"

le résultat est

@bot.command()
async def upload_file(ctx):
    attachment_url = ctx.message.attachments[0].url
    file_request = requests.get(attachment_url)
    print(file_request.content)

pourquoi y a-t-il un «b»?


1 commentaires

Tout d'abord, au lieu de répondre, envisagez de poser une question d'ordre général distincte ou de commenter le message. Mais la raison pour laquelle le b est là est que le fichier est ouvert en mode binaire et que ce que vous imprimez n'est pas une chaîne mais en fait des octets . Les documents python sont très bons, je suggérerais de regarder la section sur les octets ici: docs.python.org/3/library/stdtypes.html