我的代码:
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 发送,但尝试后,没有参数选择投诉类型,我不明白如何实现将投诉发送到具有所选投诉类型的消息。
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
)
)