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('***')

С разрешениями всё нормально, чтение истории сообщений включено на всех серверах.


Ответы (0 шт):