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

Patrick Haugh
  • 59,226
  • 13
  • 88
  • 96
Enzo Romano
  • 167
  • 1
  • 2
  • 11
  • 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. – ash Jun 14 '18 at 15:10
  • Josh, you were right... I got rid of open and my code instantly worked... always the small things – Enzo Romano Jun 14 '18 at 15:12
  • 1
    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` documentation](https://discordpy.readthedocs.io/en/latest/api.html#discord.Client.send_file) – Patrick Haugh Jun 14 '18 at 15:15

4 Answers4

13

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

Twenty
  • 5,234
  • 4
  • 32
  • 67
Nathan-Call
  • 131
  • 1
  • 3
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

KowaiiNeko
  • 327
  • 6
  • 17
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
Suraj Rao
  • 29,388
  • 11
  • 94
  • 103
pepe
  • 21
  • 2
-1
from discord import File

@bot.command(name="photo")
async def img(ctx):
    file_name = "image.jpg" # if in folder of bot.py, else write path before
    await ctx.send(file=File(file_name))

I belive 100% of successfully