fix: get_message_link

fix: работа с изменёнными сообщениями
теперь новый текст тоже проверятся на совпадение
и соответсвенно пересылвается или удаляется
This commit is contained in:
Евгений Панков 2025-08-21 01:00:34 +03:00
parent 5a4fe0ae94
commit 0055684b34

47
main.py
View File

@ -2,7 +2,7 @@
# from __future__ import annotations
from telethon import TelegramClient, events
from telethon.tl.types import PeerUser, PeerChat, PeerChannel, Message
from telethon.tl.types import PeerUser, PeerChat, Chat, PeerChannel, Channel, Message
import re
import os
import json
@ -159,6 +159,39 @@ async def prepare_entities(target_groups: list) -> list:
print(f"Неизвестная ошибка при обработке {item}: {e}")
async def get_message_link(client, message):
"""
Генерирует ссылку на сообщение вида https://t.me/username/123 или https://t.me/c/123456789/123
Работает с любыми чатами: личка, группа, канал (публичный/приватный).
"""
msg_id = message.id
# Шаг 1: Пытаемся использовать message.chat, если он загружен и имеет username
if message.chat and getattr(message.chat, 'username', None):
return f"https://t.me/{message.chat.username}/{msg_id}"
# Шаг 2: Используем peer_id для получения сущности
try:
chat = await client.get_entity(message.peer_id)
except Exception as e:
print(f"Failed to get entity from peer_id: {e}")
return None
# Шаг 3: Строим ссылку
if getattr(chat, 'username', None):
return f"https://t.me/{chat.username}/{msg_id}"
# Для приватных чатов и каналов: используем формат t.me/c/{id}/{msg_id}
chat_id = str(chat.id)
if isinstance(chat, (Channel, Chat)) and chat_id.startswith('-100'):
base_id = chat_id[4:] # Убираем -100
return f"https://t.me/c/{base_id}/{msg_id}"
# На всякий случай (редкий случай)
return f"https://t.me/c/{chat_id}/{msg_id}"
async def forward_to_targets(
message: Message,
targets: Optional[list[str | int]] = None,
@ -172,7 +205,7 @@ async def forward_to_targets(
if source_reply_to_msg_id and (forwarded_info:=source_messages.get(str(source_reply_to_msg_id))):
for str_chat_id, target_msg_id in forwarded_info['forwarded_msg_id'].items():
if str_chat_id == str(entity.id):
link = await client.get_message_link(message)
link = await get_message_link(message)
text = f'Переслано из [{message.chat.title}]({link})\n{message.text}'
new_msg = await client.send_message(str_chat_id, text, reply_to=target_msg_id, parse_mode='markdown')
else:
@ -237,7 +270,17 @@ async def handler_NewMessages(event: events.NewMessage.Event):
@client.on(events.MessageEdited(chats=source_channel_username))
async def handler_edited(event: events.MessageEdited.Event):
stored_m_info = source_messages.get(str(event.message.id))
if not stored_m_info:
if check(event.message.text):
log.info(f"📝 Изменённое с новым триггером, пересылаю: {shorten(event.message.text)}")
await forward_to_targets(event.message)
if stored_m_info and stored_m_info['text'] != event.message.text:
if not check(event.message.text):
log.info(f"📝 Сообщение изменено, не попадает в фильтр - удаляю: {shorten(stored_m_info['text'])}{shorten(event.message.text)}")
for str_chat_id, msg_id in stored_m_info['forwarded_msg_id'].items():
chat_id = int(str_chat_id)
await client.delete_messages(chat_id, msg_id)
else:
log.info(f"📝 Сообщение изменено: {shorten(stored_m_info['text'])}{shorten(event.message.text)}")
# Редактируем пересланное сообщение
for str_chat_id, msg_id in stored_m_info['forwarded_msg_id'].items():