如何将投诉发送到所选投诉类型的消息中?马拉松

问题描述 投票:0回答:1

我的代码:

REPORT_REASON_MAP = {
    "child_abuse": InputReportReasonChildAbuse(),
    "copyright": InputReportReasonCopyright(),
    "illegal_drugs": InputReportReasonIllegalDrugs(),
    "other": InputReportReasonOther(),
    "personal_details": InputReportReasonPersonalDetails(),
    "pornography": InputReportReasonPornography(),
    "spam": InputReportReasonSpam(),
    "violence": InputReportReasonViolence(),
}


async def report_message(link, reason) -> (int, int):
    message_link_pattern = re.compile(r'https://t.me/(?P<username_or_chat>.+)/(?P<message_id>\d+)')
    chat_link_pattern = re.compile(r'https://t.me/c/(?P<chat_id>\d+)/(?P<message_id>\d+)')

    # Проверка на приватный канал по ссылке
    if chat_link_pattern.match(link):
        print(f"Группа {link} является приватной. Жалоба не будет отправлена.")
        return 0, 0

    match = message_link_pattern.search(link)

    if not match:
        print("Неверная ссылка.")
        return 0, 0

    chat = match.group("username_or_chat")
    message_id = int(match.group("message_id"))

    now = datetime.now()
    last_report_time = last_report_times.get(chat)

    if last_report_time and now - last_report_time < timedelta(minutes=8):
        print(f"Жалобы на {chat} можно отправлять только раз в 8 минут. Попробуйте позже.")
        return 0, 0

    last_report_times[chat] = now

    path = './sessions/'
    files = os.listdir(path)
    sessions = [s for s in files if s.endswith(".session") and s != 'bot.session']

    successful_reports = 0
    failed_reports = 0

    report_reason = REPORT_REASON_MAP.get(reason)

    if not report_reason:
        print(f"Неверная причина: {reason}")
        return 0, 0

    for session in sessions:
        try:
            client = TelegramClient(f"{path}{session}", api_id, api_hash)

            await client.connect()

            if not await client.is_user_authorized():
                print(f"Сессия {session} не авторизована, пропуск.")
                failed_reports += 1
                await client.disconnect()
                continue

            try:
                entity = await client.get_entity(chat)

                if isinstance(entity, Channel):
                    if not chat_link_pattern.match(link):
                        print(f"Публичный канал {chat}, жалоба отправляется.")
                    else:
                        print(f"Приватный канал {chat}, жалоба не отправляется.")
                        failed_reports += 1
                        continue
                else:
                    print(f"Чат {chat} является приватным, жалоба не отправляется.")
                    failed_reports += 1
                    continue

                report_reasons = random.choice(REPORT_MESSAGES)

                await client.report(entity, message_id, report_reason, message=report_reasons)

                await client(ReportRequest(
                    peer=entity,
                    id=[message_id],
                    reason=InputReportReasonSpam(),
                    message=report_reason
                ))

                print(f"Жалоба отправлена через сессию {session}. Номер жалобы: {successful_reports}")
                successful_reports += 1

            except FloodWaitError as e:
                wait_time = e.seconds
                print(f"Flood wait error: необходимо подождать {wait_time} секунд.")
                await asyncio.sleep(wait_time)

            except Exception as e:
                print(f"Ошибка при отправке жалобы через сессию {session}: {e}")
                failed_reports += 1

            finally:
                await client.disconnect()

        except Exception as e:
            print(f"Ошибка при инициализации сессии {session}: {e}")
            failed_reports += 1

    return successful_reports, failed_reports

在await client.report(entity, message_id, report_reason, message=report_reasons)中 - 客户端中没有报告方法。有人告诉我可以通过 ReportRequest 发送,但尝试后,没有参数选择投诉类型,我不明白如何实现将投诉发送到具有所选投诉类型的消息。

python bots telegram telethon
1个回答
0
投票

Telegram 引入了动态报告原因,从 Telethon 版本 > 1.37 开始,这些原因可以更改报告的每个帖子。因此,在尝试使用之前,要么锚定到该版本,要么阅读最新的 api 参考:https://tl.telethon.dev/methods/messages/report.html

您可能会注意到,

reason
不再存在。只有
option
需要字节

您使用空字节发出第一个请求:

available_reasons = await client(ReportRequest(
        peer=entity,
        id=[message_id],
        option=b'',
        message=report_reason
    )
)

print(available_reasons.stringify())

服务器必须给你 ReportResultChooseOption 对象

您选择一个并用它提出下一个请求:

first_choice = available_reasons.options[0].option

list_of_reasons = await client(ReportRequest(
        peer=entity,
        id=[message_id],
        option=first_choice,
        message=report_reason
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.