discord.errors.Forbidden: 403 Forbidden (error code: 50001): Missing Access
Я создал код для бота Discord. Мне нужно, чтобы бот с 15.07.2024 до текущего времени посчитал количество сообщений людей на серверах, разделил на 20, округлил и умножил на 5. Ошибка такова:
Traceback (most recent call last):
File "C:\Users\"***\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\client.py", line 449, in _run_event
await coro(*args, **kwargs)
File "D:\folder\all\catcoins\mess.py", line 43, in on_ready
messages = await get_messages_from_channels(guild, start_date, end_date)
File "D:\folder\all\catcoins\mess.py", line 21, in get_messages_from_channels
async for message in channel.history(limit=100, oldest_first=True): # Получайте самые старые сообщения первыми
File "C:\Users\***\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\abc.py", line 1843, in history
data, state, limit = await strategy(retrieve, state, limit)
File "C:\Users\***\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\abc.py", line 1773, in _after_strategy
data = await self._state.http.logs_from(channel.id, retrieve, after=after_id)
File "C:\Users\***\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\http.py", line 752, in request
raise Forbidden(response, data)
discord.errors.Forbidden: 403 Forbidden (error code: 50001): Missing Access
Вот сам код:
import discord
import datetime
import os
intents = discord.Intents.default()
intents.messages = True
bot = discord.Client(intents=intents)
async def get_messages_from_channels(guild: discord.Guild, start_date: datetime.date, end_date: datetime.date):
"""Возвращает словарь с идентификаторами участников в качестве ключей и количеством сообщений в качестве значений."""
messages = {} # Храните количество сообщений для каждого участника
# Итерация по текстовым каналам
for channel in guild.text_channels:
# Преобразование дат в объекты datetime (эффективно)
start_datetime = datetime.datetime.combine(start_date, datetime.time(0, 0, 0))
end_datetime = datetime.datetime.combine(end_date, datetime.time(23, 59, 59))
# Используйте эффективный цикл для получения сообщений
async for message in channel.history(limit=100, oldest_first=True): # Получайте самые старые сообщения первыми
# Эффективная проверка, находится ли сообщение в диапазоне дат
if start_datetime <= message.created_at.replace(tzinfo=None) <= end_datetime:
messages[message.author.id] = messages.get(message.author.id, 0) + 1
return messages
@bot.event
async def on_ready():
print(f'Вход выполнен как {bot.user}')
with open('users.txt', 'w') as f:
# Получить гильдии, где бот присутствует
guilds = bot.guilds
# Установить начальную и конечную даты
start_date = datetime.date(2024, 7, 5)
end_date = datetime.date.today()
# Итерация по гильдиям и подсчет сообщений
for guild in guilds:
# Найдите роль бота на сервере:
bot_role = discord.utils.get(guild.roles, name='CatCoins Bot')
if bot_role is None:
print(f'Ошибка: Роль не найдена на сервере {guild.name}')
continue
# Проверьте, есть ли у бота разрешение на чтение истории сообщений:
if not bot_role.permissions.read_message_history:
print(f'Ошибка: У бота нет разрешения "Просмотр истории сообщений" на сервере {guild.name}')
continue
messages = await get_messages_from_channels(guild, start_date, end_date)
for member_id, count in messages.items():
# Получить объект участника по ID
member = guild.get_member(member_id)
if member is not None:
score = round((count / 20) * 5)
f.write(f'{member.id} {score}\n') # Добавлен символ перевода строки '\n'
bot.run('***')
С разрешениями всё нормально, чтение истории сообщений включено на всех серверах.