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.+)/(?P\d+)')
chat_link_pattern = re.compile(r'https://t.me/c/(?P\d+)/(?P\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
in await client.report(entity, message_id, report_reason, message=report_reasons) — в клиенте нет метода отчета. Мне сказали, что ее можно отправить через ReportRequest, но попробовав, нет аргумента для выбора типа жалобы, я не понимаю, как можно реализовать отправку жалобы на сообщение с выбранным типом жалобы.< /п>
# Проверка на приватный канал по ссылке 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
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
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 [/code] in await client.report(entity, message_id, report_reason, message=report_reasons) — в клиенте нет метода отчета. Мне сказали, что ее можно отправить через ReportRequest, но попробовав, нет аргумента для выбора типа жалобы, я не понимаю, как можно реализовать отправку жалобы на сообщение с выбранным типом жалобы.< /п>