Discord.py Bot sending file to Discord Channel
Asked Answered
C

4

9

I am trying to make my discord bot send a jpg file to my discord server, but I keep getting an error that seems pretty uncommon as I can not find any solutions to it on the internet...

the error is... discord.ext.commands.errors.CommandInvokeError: Command raised an exception: ClientRequestError: Can not write request body for https://discordapp.com/api/v6/channels/454374995758678029/messages

My imports are

import time

import discord
from discord.ext import commands
from discord.ext.commands import Bot
import asyncio

The code that I will pull out that the error is related to is

@bot.command(pass_context = True)

async def image(ctx):

        await bot.send_file(ctx.message.channel, open('halogen.jpg'))

Am I just missing an import or is there an actual problem with my code?

Thanks guys

Condescending answered 14/6, 2018 at 14:55 Comment(3)
Sidenote: passing open(...) to a function is usually a bad idea, since that image might never get closed, so if this command is run multiple times, you could leak file handles and eventually crash your bot.Indochina
Josh, you were right... I got rid of open and my code instantly worked... always the small thingsCondescending
You should be opening your object in 'rb' mode. You can also just pass the path to the file instead of a file object. See the send_file documentationReverence
T
14

I was researching the same thing and I found this to work:

await ctx.send(file=discord.File(r'c:\location\of\the_file_to\send.png'))

Here is where I found it: link

Trellis answered 19/11, 2020 at 7:12 Comment(0)
E
2

Try doing it this way.

@bot.command(pass_context=True)
async def send(ctx):
    area=ctx.message.channel
    await bot.send_file(area, r"c:\location\of\the_file_to\send.png",filename="Hello",content="Message test")

You can refer to the discord documentation for it here link

Elliot answered 15/6, 2018 at 5:24 Comment(0)
A
2

You can send it without ctx:

async def timer():

    await client.wait_until_ready()
    channel = client.get_channel(number_of_channel)
    while True:
        await channel.send('Working!', file=discord.File("file.txt"))
        await asyncio.sleep(10)#seconds
Armidaarmiger answered 9/11, 2021 at 10:5 Comment(0)
O
0

It's work for me

from discord import File

@bot.command
async def sender(ctx):
    image = "file_name.png"
    file = File(image)
    link=f"attachment://{image}"
    await ctx.send(link, file=file)

100% working

Onto answered 30/6, 2024 at 0:16 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.