Почему мой дискорд бот не работает на серверах, только в личных сообщениях?
Я сделал дискорд бота на питоне, когда запускаю его из пайчарма всё нормально, полностью работает, но когда бот активен с heroku, бот на сервере не отвечает. И именно на серверах, в личные сообщения бот отзывается, но на серверах игнорирует команды. Я пробовал делать и через @client.event, и через @client.command(), ничего не работает. Создавал новые сервера, удалял со старых, проверял его роли, пересоздавал приглашения. Всё не работает именно когда бот запущен через хероку.
import random
import time
import asyncio
import datetime
from discord.ext import commands
client = discord.Client()
client = commands.Bot(command_prefix="/")
token = "My Token" # Токен
now = datetime.datetime.now()
newYear = datetime.datetime(now.year + 1, 1, 1, 0, 0)
counting = True
@client.event
async def on_ready():
print("Bot is ready")
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('/lolKekHype'):
kek_list = ['Оооо, я вижу ты тоже в теме, я тоже шарю!!1! Всем #, всем тик ток, я в теме!!!!!!1!!1!!11',
'Фу, ты кринж, такими командами пользоваться, Osu!ждаю',
'Лол лмао, реально чееееееел, давай круто позависаем на этих выхах)))))',
'Не вижу нечего смешного, это не кек',
'Ну тут всё как бы норм, но не Hype же, кто так вообще пишет? проверься', 'фу, токс',
'о, а знаешь такого ютубера: Диму Масленикова? Такой, не популярный канал. Вот ссылка: https://www.youtube.com/watch?v=c5tY3F8ADGA',
'хочешь бесплатных гемов бравл старс? перехади по ссылке: https://brawlgems.com/generator/.',
'Выбран рандомный хит Шадоу рейза!!! Слушать:<https://www.youtube.com/watch?v=a3Z7zEc7AXQ>',
'Выбран рандомный хит Шадоу рейза!!! Слушать:<https://www.youtube.com/watch?v=qRU2aoiSLlg>',
'Выбран рандомный хит Шадоу рейза!!! Слушать:<https://www.youtube.com/watch?v=a3Z7zEc7AXQ>',
'Выбран рандомный хит Шадоу рейза!!! Слушать:<https://www.youtube.com/watch?v=UxM5UgpXYM4>']
await message.channel.send(random.choice(kek_list))
if message.content.startswith('/randomTopSong'):
song_list = ['Слушать: <https://youtu.be/9Q7o07WfQj8>',
'Слушать: <https://youtu.be/ANlrXX8A1gY>',
'Слушать: <https://youtu.be/DAgEu_A0zHk>',
'Слушать: <https://youtu.be/mO9iWE499A0>',
'Слушать: <https://youtu.be/l_B9-9QVw2M>',
'Слушать: <https://youtu.be/89yDiQ8WkNg>']
await message.channel.send(embed=discord.Embed(title='Выбран рандомный хит Шадоу рейза!!!', description=random.choice(song_list), colour=0xffcc00), delete_after=60)
if message.content.startswith('/currentTime'):
dt_now = datetime.datetime.now()
if dt_now.day >= 10 and dt_now.month >= 10:
await message.channel.send(f"{dt_now.day}.{dt_now.month}.{dt_now.year} Сейчас {dt_now.hour + 3} часов {dt_now.minute} минут {dt_now.second} секунд")
if dt_now.day < 10 and dt_now.month >= 10:
await message.channel.send(f"0{dt_now.day}.{dt_now.month}.{dt_now.year} Сейчас {dt_now.hour + 3} часов {dt_now.minute} минут {dt_now.second} секунд")
if dt_now.day >= 10 and dt_now.month < 10:
await message.channel.send(f"{dt_now.day}.0{dt_now.month}.{dt_now.year} Сейчас {dt_now.hour + 3} часов {dt_now.minute} минут {dt_now.second} секунд")
if dt_now.day < 10 and dt_now.month < 10:
await message.channel.send(f"0{dt_now.day}.0{dt_now.month}.{dt_now.year} Сейчас {dt_now.hour + 3} часов {dt_now.minute} минут {dt_now.second} секунд")
if message.content.startswith('/startCounting'):
counting = True
while counting == True:
now = datetime.datetime.now()
delta = newYear - now
await message.channel.send(f"До Нового Года осталось {int(delta.total_seconds() / 60 // 60)} часов")
print(now)
print(newYear)
print(delta)
await asyncio.sleep(3600)
if message.content.startswith('/stopCounting'):
counting = False
await message.channel.send("ok")
if message.content.startswith('/info'):
await message.channel.send("Discord python bot v1.2 \n"
"Last Updates: Добавлена комманда /help")
if message.content.startswith('/help'):
await message.channel.send("/help - помощь по командам \n"
"/info - информация о боте \n"
"/lolKekHype - похайпить \n"
"/currentTime - вывести текущее время \n"
"/startCounting - начать считывать часы до нового года с момента отправки команды ||пишите в ровное время, типа 12:00, 14:00 и т д|| \n"
"/stopCounting - перестать считывать часы до нового года \n"
"/randomTopSong - получить классную песню \n"
"/lolKekHype - немножко похайпить \n")
await client.process_commands(message)
@client.command()
async def test(ctx):
await ctx.send("тест пройден")
client.run(token)```
Ответы (3 шт):
client = discord.Client()
Для чего вам эта строчка?
Советую прописывать все команды таким образом, а не через событие сообщения
client = commands.Bot(command_prefix = '/')
@client.command()
async def test(ctx)
if ctx.author.bot:
return
await ctx.send("TEST COMMAND")
Так-же не понятно для чего вам это условие
if message.author == client.user: return
Здесь у вас пользователь, отправивший сообщение, сравнивается с клиентом бота для чего? Используйте ctx.author.bot (bool) чтобы отсечь сообщения ботов, пример написал в листинге выше.
Так-же, вы обращаетесь к библиотеке discord'a, но отсутствует import discord
Я добавил импорт и удалил ненужное условие, о котором писал выше, и строку client = discord.Client(). Такой код у меня работает нормально.

Проблема решена. Я деплоил бота по гайду Tech With Tim, в файле requirements.txt он говорил написать вот эту строку: 'git+https://github.com/Rapptz/discord.py', убрав её всё заработало.
этот пример бота, уже не актуален, кое что поменялось, свежий рабочий вариант есть здесь: https://discordpy.readthedocs.io/en/stable/quickstart.html
у меня вышел такой минимальный вариант:
import discord
from discord.ext import commands
intents = discord.Intents.default()
intents.messages = True
intents.message_content = True
client = discord.Client(intents=intents)
token = "" # Токен
@client.event
async def on_ready():
print("Bot is ready")
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('/help'):
await message.channel.send("/help - помощь по командам \n"
"/info - информация о боте \n")
client.run(token)