Проверить, открыты ли комментарии к постам в каналах Telegram с помощью библиотеки telethon

Рейтинг: 0Ответов: 1Опубликовано: 01.06.2023

Проблема заключается в том, что я хочу пропарсить каналы по ключевым словам и получить данные о том, можно ли оставлять комментарии под постом или нет, в виде Excel файла.

# Фильтрация и обработка каналов
for dialog in dialogs:
    if isinstance(dialog, Channel) or isinstance(dialog, Chat):
        title = dialog.title
        participants_count = dialog.participants_count

        # Проверка ключевых слов
        for keyword in keywords:
            if keyword.lower() in title.lower():
                # Получение информации о последних постах
                messages = client.get_messages(dialog, limit=2)

                if len(messages) >= 2:
                    views_previous = messages[0].views
                    views_latest = messages[1].views
                else:
                    views_previous = 0
                    views_latest = 0

                # Проверка возможности комментирования
                can_comment = dialog.megagroup or (not dialog.broadcast and not dialog.restricted)

                # Формирование ссылки на канал или группу
                if isinstance(dialog, Channel):
                    link = f'https://t.me/{dialog.username}'
                else:
                    link = f'https://t.me/c/{dialog.id}/{dialog.access_hash}'

                # Добавление данных в Excel
                sheet.append([title, 'Канал' if isinstance(dialog, Channel) else 'Группа',
                              link, participants_count,
                              views_previous, views_latest, 'Да' if can_comment else 'Нет'])
                break

# Сохранение Excel-файла
wb.save('channels.xlsx')

Опять же повторюсь, что проблема заключается в том, что код реагирует только на чаты и определяет только для них, что доступна отправка сообщений, но он не видит возможность отправки сообщений под постами в Telegram каналах.

На скриншоте ниже можно заметить, как парсер указывает только Чаты как каналы, в которых можно отправлять сообщения.

Результат парсинга

Импортированные библиотеки:

import openpyxl
from telethon.sync import TelegramClient
from telethon.tl.types import Channel, Chat, InputPeerEmpty
from telethon.tl.functions.messages import GetDialogsRequest
from telethon.errors import SessionPasswordNeededError

Создание Exсel-файла:

# Создание эксель-файла и заголовков столбцов
wb = openpyxl.Workbook()
sheet = wb.active
sheet.append(['Название канала', 'Тип', 'Ссылка на канал', 'Количество участников',
              'Просмотры под предпоследним постом', 'Просмотры под последним постом', 'Можно комментировать'])

Ответы

▲ 0

В возвращаемом объекте Message вы можете посмотреть атрибут 'replies' далее в нем уже можно найти 'comments: True | False' с флагом, думаю это то что вам нужно.

Для примера вот структура одного объекта Message:

{
    '_': 'Message',
    'id': 705,
    'peer_id': {
        '_': 'PeerChannel',
        'channel_id': 1665165740
    },
    'date': '2023-08-01T09:57:56+00:00',
    'message': '🎯Планы на август: что будет на канале?\n\nАвгуст это не только самый сладкий месяц лета, но и возможность заложить основу на осень. Этим я и планирую заняться.\n\nЧто же будет на канале:\n\n♦️В августе я закрываю продажу всех своих курсов в том виде, как это есть сейчас. Кто хотел успевайте купить.\n\n♦️ Проведу 1-2 прямых эфира🔥\n\n♦️Сделаю Открытый урок по вокалу и поделюсь последними ноу-хау по работе с микстом и песнями👌\n\n♦️ Презентую новый, офигенный формат работы со мной с сентября.\n\n♦️ Грядет повышение цен на индивидуальные уроки, для тех кто сейчас занимается будет спец предложение!\n\nА еще немного личного:\n\n🧳Поездка со старшей дочкой в Санкт-Петербург! \n\n👗👠 Создание моего уникального органичного стиля вместе со стилистом, результаты вы точно не сможете не заметить😉\n\nКакие у вас планы на последний месяц лета?',
    'out': False,
    'mentioned': False,
    'media_unread': False,
    'silent': False,
    'post': True,
    'from_scheduled': False,
    'legacy': False,
    'edit_hide': True,
    'pinned': False,
    'noforwards': False,
    'from_id': None,
    'fwd_from': None,
    'via_bot_id': None,
    'reply_to': None,
    'media': None,
    'reply_markup': None,
    'entities': [{
        '_': 'MessageEntityBold',
        'offset': 2,
        'length': 38
    }, {
        '_': 'MessageEntityBold',
        'offset': 160,
        'length': 23
    }, {
        '_': 'MessageEntityBold',
        'offset': 592,
        'length': 22
    }, {
        '_': 'MessageEntitySpoiler',
        'offset': 646,
        'length': 17
    }, {
        '_': 'MessageEntityItalic',
        'offset': 782,
        'length': 42
    }],
    'views': 148,
    'forwards': 0,
    'replies': {
        '_': 'MessageReplies',
        'replies': 1,
        'replies_pts': 4244,
        'comments': True,
        'recent_repliers': [{
            '_': 'PeerUser',
            'user_id': 1837922800
        }],
        'channel_id': 1250833771,
        'max_id': 2730,
        'read_max_id': 2730
    },
    'edit_date': '2023-08-01T10:27:18+00:00',
    'post_author': None,
    'grouped_id': None,
    'reactions': {
        '_': 'MessageReactions',
        'results': [{
            '_': 'ReactionCount',
            'reaction': {
                '_': 'ReactionEmoji',
                'emoticon': '🔥'
            },
            'count': 4,
            'chosen_order': None
        }],
        'min': False,
        'can_see_list': False,
        'recent_reactions': []
    },
    'restriction_reason': [],
    'ttl_period': None }