Загрузка...

Получаем удалённые и отредактированные сообщения Telegram без скачивания клиентов

Тема в разделе Статьи создана пользователем llimonix 17 май 2024. (поднята Воскресенье в 23:46) 2498 просмотров

Загрузка...
  1. llimonix
    llimonix Автор темы 17 май 2024 :kirbi: стримлю - https://www.twitch.tv/llimonix 21 750 20 янв 2020
    В данной статье предоставлентестовый код, которая не включает в себя отслеживания сообщений с фотографиями или документами. Этот код сделан лишь для того, чтобы показать как можно реализовать новые фишки Telegram Premium.

    1. Покупаем Telegram Premium, если его у вас еще нет
    2. Создаем бота в https://t.me/BotFather и включаем в нём
    Business mode:
    [IMG]
    [IMG]
    3. Подключаем своего бота к профилю Telegram и выбираем чаты, где он будет работать (или же ничего не делаем и он будет отвечать всем кто ему пишет):
    [IMG]
    [IMG]
    [IMG]
    [IMG]
    Пишем код на Python
    1. Скачиваем Python: https://www.python.org/downloads/ (у меня установлена версия Python 3.11.6) (ПРИ УСТАНОВКЕ PYTHON НЕ ЗАБУДЬТЕ ПОСТАВИТЬ ГАЛОЧКУ ADD TO PATH)
    2. Открываем консоль и устанавливаем необходимые модули (если чего-то не хватаем докачиваем точно так же):
    Python
    pip install aiogram pip install pydantic

    3. Создаем файл
    ⁡main.py
    и вставляем мой тестовый код:
    Python
    import configparser import json from typing import Union import asyncio from aiogram import (Router, Bot, Dispatcher, F, types) import logging from database import Messagesx router = Router(name=__name__) logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) config = configparser.ConfigParser() config.read("config.ini") TOKEN = config["main"]["bot_token"] USER_ID = config["main"]["user"] async def send_msg(message_old: str, message_new: Union[str, None], user_fullname: str, user_id: int, bot: Bot = None): if message_new is None: msg = (f' <b>Пользователь {user_fullname} ({user_id})</b>\n' f' <b>Сообщение удалено:</b>\n' f' Сообщение:\n<code>{message_old}</code>\n') else: msg = (f' <b>Пользователь {user_fullname} ({user_id})</b>\n' f'✏ <b>Сообщение изменено:</b>\n' f' Старое сообщение:\n<code>{message_old}</code>\n' f' Новое сообщение:\n<code>{message_new}</code>') await bot.send_message(USER_ID, msg, parse_mode='html') @router.edited_business_message() async def edited_business_message(message: types.Message): if message.from_user.id == message.chat.id: user_msg = Messagesx.get(user_id=message.from_user.id) data = {message.message_id: message.text} if user_msg is None: Messagesx.add(user_id=message.from_user.id, message_history=json.dumps(data)) else: msg_history = json.loads(user_msg.message_history) if str(message.message_id) in msg_history: await send_msg(message_old=msg_history[str(message.message_id)], message_new=message.text, user_fullname=message.from_user.full_name, user_id=message.chat.id, bot=message.bot) data = {**msg_history, **data} Messagesx.update(user_id=message.from_user.id, message_history=json.dumps(data)) @router.deleted_business_messages() async def deleted_business_messages(message: types.Message): user_msg = Messagesx.get(user_id=message.chat.id) if user_msg is not None: msg_history = json.loads(user_msg.message_history) for msg_id in message.message_ids: if str(msg_id) in msg_history: await send_msg(message_old=msg_history[str(msg_id)], message_new=None, user_fullname=message.chat.full_name, user_id=message.chat.id, bot=message.bot) msg_history.pop(str(msg_id)) Messagesx.update(user_id=message.chat.id, message_history=json.dumps(msg_history)) @router.business_message(F.text) async def business_message(message: types.Message): if message.from_user.id == message.chat.id: user_msg = Messagesx.get(user_id=message.from_user.id) data = {message.message_id: message.text} if user_msg is None: Messagesx.add(user_id=message.from_user.id, message_history=json.dumps(data)) else: msg_history = json.loads(user_msg.message_history) data = {**msg_history, **data} Messagesx.update(user_id=message.from_user.id, message_history=json.dumps(data)) async def main() -> None: Messagesx.create_db() bot = Bot(token=TOKEN) dp = Dispatcher() dp.include_router(router) await bot.delete_webhook(drop_pending_updates=True) await dp.start_polling(bot) asyncio.run(main())
    4. Создаем файл
    ⁡database.py
    и вставляем мой код с работой базы данных:
    Python
    from pydantic import BaseModel import sqlite3 def dict_factory(cursor, row) -> dict: save_dict = {} for idx, col in enumerate(cursor.description): save_dict[col[0]] = row[idx] return save_dict def update_format(sql, parameters: dict) -> tuple[str, list]: values = ", ".join([ f"{item} = ?" for item in parameters ]) sql += f" {values}" return sql, list(parameters.values()) def update_format_where(sql, parameters: dict) -> tuple[str, list]: sql += " WHERE " sql += " AND ".join([ f"{item} = ?" for item in parameters ]) return sql, list(parameters.values()) class MessageRecord(BaseModel): user_id: int message_history: str # Работа с юзером class Messagesx: storage_name = "messages" PATH_DATABASE = "messages.db" @staticmethod def create_db(): with sqlite3.connect('messages.db') as conn: cursor = conn.cursor() cursor.execute('''CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY, user_id INTEGER, message_history TEXT)''') # Добавление записи @staticmethod def add( user_id: int, message_history: str, ): with sqlite3.connect(Messagesx.PATH_DATABASE) as con: con.row_factory = dict_factory con.execute( f""" INSERT INTO {Messagesx.storage_name} ( user_id, message_history ) VALUES (?, ?) """, [ user_id, message_history, ], ) # Получение записи @staticmethod def get(**kwargs) -> MessageRecord: with sqlite3.connect(Messagesx.PATH_DATABASE) as con: con.row_factory = dict_factory sql = f"SELECT * FROM {Messagesx.storage_name}" sql, parameters = update_format_where(sql, kwargs) response = con.execute(sql, parameters).fetchone() if response is not None: response = MessageRecord(**response) return response # Получение записей @staticmethod def gets(**kwargs) -> list[MessageRecord]: with sqlite3.connect(Messagesx.PATH_DATABASE) as con: con.row_factory = dict_factory sql = f"SELECT * FROM {Messagesx.storage_name}" sql, parameters = update_format_where(sql, kwargs) response = con.execute(sql, parameters).fetchall() if len(response) >= 1: response = [MessageRecord(**cache_object) for cache_object in response] return response # Получение всех записей @staticmethod def get_all() -> list[MessageRecord]: with sqlite3.connect(Messagesx.PATH_DATABASE) as con: con.row_factory = dict_factory sql = f"SELECT * FROM {Messagesx.storage_name}" response = con.execute(sql).fetchall() if len(response) >= 1: response = [MessageRecord(**cache_object) for cache_object in response] return response # Редактирование записи @staticmethod def update(user_id, **kwargs): with sqlite3.connect(Messagesx.PATH_DATABASE) as con: con.row_factory = dict_factory sql = f"UPDATE {Messagesx.storage_name} SET" sql, parameters = update_format(sql, kwargs) parameters.append(user_id) con.execute(sql + "WHERE user_id = ?", parameters) # Удаление записи @staticmethod def delete(**kwargs): with sqlite3.connect(Messagesx.PATH_DATABASE) as con: con.row_factory = dict_factory sql = f"DELETE FROM {Messagesx.storage_name}" sql, parameters = update_format_where(sql, kwargs) con.execute(sql, parameters) # Очистка всех записей @staticmethod def clear(): with sqlite3.connect(Messagesx.PATH_DATABASE) as con: con.row_factory = dict_factory sql = f"DELETE FROM {Messagesx.storage_name}" con.execute(sql)
    5. Создаем файл config.ini и вставляем мой текст, но изменяем токен бота и ставим свой user_id (его можно получить в боте: https://t.me/userinfobot ):
    Код
    [main] bot_token=6095..... user=80....
    6. Вместо
    ⁡6095.....
    ⁡ и
    ⁡80....
    ⁡ , там где
    bot_token - вставляем токен вашего бота, который вы получили у BotFather. И в user нужно вставить user_id из пункта 5! (У других бот будет отправлять уведомления вам, если они подключат вашего бота. У telegram не выводит кому было отправлено сообщение, так что узнать ваш ID никак нельзя)
    7. Запускаем скрипт и проверяем. Можно написать с другого аккаунта и удалить или изменить сообщение.
    [IMG]
    Обязательно выберите чата где это будет работать или оставьте все и не забудьте включить бота
    [IMG]
    [IMG]
    Там хранится id пользователя и история сообщений после включения бота ( message_id: text )
    Важно! Функционал работает только с теми сообщениями, что были получены во время использования данного бота!

    Можете подключить уже готового бота: https://t.me/BusDetectBot
     
    Этот материал оказался полезным?
    Вы можете отблагодарить автора темы путем перевода средств на баланс
    Отблагодарить автора
    17 май 2024 Изменено
    1. Signal
      llimonix, а доделать бот чтобы он полностью вел **** сложно будет?
    2. llimonix Автор темы
      Signal, ну потратить время нужно будет, но меня в армию забирают, так что мне лень
  2. llimonix
    llimonix Автор темы 20 май 2024 :kirbi: стримлю - https://www.twitch.tv/llimonix 21 750 20 янв 2020
    https://t.me/BusDetectBot

    Поднял бота для автоматического отслеживания ивентов редактирования и удаления. В скором времени добавлю так же обработку для файлов, фотографий и тд

    Перед началом подключения бота для бизнес чатов, напишите ему /start и все. Потом добавляйте его как бота, для бизнес чатов из гайда в теме! Бот будет присылать вам все замеченные изменения с момента подключения его к чатам
     
    20 май 2024 Изменено
    1. llimonix Автор темы
      llimonix, Не ворк, был отключен из за ненадобности
  3. padayu
    видел в ютуб шортсах недавно
     
    1. Посмотреть предыдущие комментарии (1)
    2. МВД
      llimonix, А кто тик т0к тогда смотрит?
    3. МВД
      Lilith, Тогда ты няшный милашка :stitchsad:
  4. A665521498
    A665521498 20 май 2024 3 22 июл 2023
    А можно видео гайд? куда блять в конце тыкать?
     
    1. Посмотреть предыдущие комментарии (1)
    2. llimonix Автор темы
      A665521498, что тыкать, куда тыкать
  5. Signal
    Signal 26 май 2024 ворк по ру не предлагать - могу не отказаться 1515 20 янв 2019
    Код
    Traceback (most recent call last): File "C:\Users\Administrator\Desktop\****\main.py", line 39, in <module> @router.edited_business_message() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'Router' object has no attribute 'edited_business_message'
    такие дела
     
    26 май 2024 Изменено
    1. Посмотреть предыдущие комментарии (1)
    2. Signal
      llimonix, так а как его обновить
    3. Signal
      pip uninstall aiogram
      и потом
      pip install aiogram
    4. llimonix Автор темы
      Signal, можно было просто pip install -U aiogram
  6. Olegovich_007
    подскажи,что и где удалить что бы не было возможности достать старые сообщения))
     
    1. llimonix Автор темы
  7. Lyvironix
    Lyvironix 11 июн 2024 АААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААА 1363 23 фев 2019
    Статья говно если честно. Смысл этой ебли в жопу, по другому не назвать, если есть 1001 клиент которые эти функции поддерживают...
     
    11 июн 2024 Изменено
    1. Signal
  8. SexExchange
    SexExchange 26 июн 2024 https://t.me/thetruthlzt ЛУЧШИЙ ТГ КАНАЛ 12 930 25 окт 2021
    как прелестно видеть это статью, когда у тебя 15 минут назад спиздили тг акк...
     
  9. СМАК
    какая версия аиограма используется?
     
Top
JavaScript error: