Загрузка...

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

Тема в разделе Статьи создана пользователем ллимоникс 17 май 2024. (поднята 26 май 2025) 2871 просмотр

  1. ллимоникс
    ллимоникс Автор темы 17 май 2024 lolz.live/threads/8634402/ - Лучшие телеграмм аккаунты :+rep: 23 977 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
      ллимоникс, а доделать бот чтобы он полностью вел **** сложно будет?
    2. ллимоникс Автор темы
      Signal, ну потратить время нужно будет, но меня в армию забирают, так что мне лень
  2. ллимоникс
    ллимоникс Автор темы 20 май 2024 lolz.live/threads/8634402/ - Лучшие телеграмм аккаунты :+rep: 23 977 20 янв 2020
    https://t.me/BusDetectBot

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

    Перед началом подключения бота для бизнес чатов, напишите ему /start и все. Потом добавляйте его как бота, для бизнес чатов из гайда в теме! Бот будет присылать вам все замеченные изменения с момента подключения его к чатам
     
    20 май 2024 Изменено
    1. ллимоникс Автор темы
      ллимоникс, Не ворк, был отключен из за ненадобности
  3. 11111111
    11111111 17 май 2024 небо поможет нам
    видел в ютуб шортсах недавно
     
    1. Посмотреть предыдущие комментарии (1)
    2. МВД
    3. МВД
      Lilith, Тогда ты няшный милашка :stitchsad:
  4. MRAC
    MRAC 20 май 2024 SCM MRAC / SCM O.Mra C. 296 22 июл 2023
    А можно видео гайд? куда блять в конце тыкать?
     
    1. Посмотреть предыдущие комментарии (1)
    2. ллимоникс Автор темы
      MRAC, что тыкать, куда тыкать
  5. Signal
    Signal 26 май 2024 ворк по ру не предлагать - могу не отказаться 1516 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
    3. Signal
      pip uninstall aiogram
      и потом
      pip install aiogram
    4. ллимоникс Автор темы
      Signal, можно было просто pip install -U aiogram
  6. Olegovich_007
    подскажи,что и где удалить что бы не было возможности достать старые сообщения))
     
    1. ллимоникс Автор темы
  7. Lyvironix
    Lyvironix 11 июн 2024 1369 23 фев 2019
    Статья говно если честно. Смысл этой ебли в жопу, по другому не назвать, если есть 1001 клиент которые эти функции поддерживают...
     
    11 июн 2024 Изменено
    1. Signal
  8. Siski_piski
    Siski_piski 26 июн 2024 ПИЗДАТЫЙ ДИЗАЙН - https://lolz.live/threads/4141368/ :muscle: 14 568 25 окт 2021
    как прелестно видеть это статью, когда у тебя 15 минут назад спиздили тг акк...
     
  9. СМАК
    какая версия аиограма используется?
     
Загрузка...
Top