AttributeError: 'Client' object has no attribute 'send_message' (Discord Bot) AttributeError: 'Client' object has no attribute 'send_message' (Discord Bot) python-3.x python-3.x

AttributeError: 'Client' object has no attribute 'send_message' (Discord Bot)


You are probably running the rewrite version of discord.py, since the discord.Client object does not a have a send_message method.

To fix your problem you can just have it as:

async def test(author, message):    await message.channel.send('I heard you! {0.name}'.format(author))

but for what i see you doing I reccomend using the commands extension

This makes creating a bot and commands for the bot much simpler, for example here is some code that does exactly the same as yours

from discord.ext import commandsbot = commands.Bot(command_prefix='!')@bot.command()async def test(ctx):    await ctx.send('I heard you! {0}'.format(ctx.author))bot.run('token')


As per discord.py documentation, migration to v1.0 brought a lot of major changes in the API, including the fact that a lot of functionality was moved out of discord.Client and put into their respective model.

E.g. in your specific case:Client.send_message(abc.Messageable) --> abc.Messageable.send()

So your code would be restyled from this:

await client.send_message(message.channel, 'I heard you! {0}'.format(message.author))

to this:

await message.channel.send('I heard you! {0}'.format(message.author))

This makes the code much more consistent and more accurate in depicting the actual discord entities, i.e. it's intuitive that a discord Message is sent to a Channel (subclass of abc.Messageable) and not to the Client itself.

There is a quite large list of migrations in this sense; you can find them all hereunder the Models are Stateful section.


The discord.py can't be used for the send_message() function anymore, I think. But this doesn't mean we can not send messages. Another way of sending messages into the channel do exist.

You can use:

await message.channel.send("")

for this purpose.

So let's apply this into your code now.

import asyncioimport discordclient = discord.Client()@client.async_eventasync def on_message(message):    author = message.author   if message.content.startswith('!test'):        print('on_message !test')        await test(author, message)async def test(author, message):    print('in test function')    await message.channel.send(F'Hi {author}, I heard you.')client.run("key")

Now this would fix your issue and you'll be able to use your bot to send messages easily.

Thank You! :D