• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Прослушка чата для Telegram с сохранением в БД и Web-интерфейсом (Telethon, Sqllite, Flask)

rand

CooL-Lamer
Эксперт
Регистрация
24.05.2023
Сообщения
581
Реакции
1 152
Депозит
0.07 Ł и др.
Написал: rand
Эксклюзивно для: xss.pro
Версия Python 3.12, Flask 3.0.3, Telethon 1.6.1, asqlite 1.1.0

Всем привет, давно ничего не выкладывал, возможно кому-то будет полезно. В некоторых интересных чатах телеги иногда проскакивает очень интересная информация, которая может быть удалена. В таком случае нам ничего не мешает установить своего клиентского бота и прослушивать чат, сохраняя все текстовые сообщения в бд, а для удобства отображения таблицы в БД, я сделал клиента на Flask. Пишу в БД только дату сообщения, id пользователя, username, nickname, message (при желании можно ещё добавить столбец с телефоном при его открытости у юзера).

Софт состоит из серверной и клиентской части.

Получается как-то так:
1725431326616.png

Для запуска устанавливаем:
Bash:
pip install telethon==1.6.1
pip install aiosqlite==1.1.0
pip install flask==3.0.3

Сначала запускаем серверную часть и начинаем собирать информацию, это у нас server.py , подробности по запуску читайте в комментариях к коду, там ничего сложного:
Python:
import aiosqlite
import datetime
from telethon import TelegramClient, events
from telethon.errors import SessionPasswordNeededError

# Получаем параметры для подключения к API по адресу:
# api_hash from https://my.telegram.org, under API Development, данные в переменных ниже указаны левые для понимания что нужно вписывать.
api_id = 24555555
api_hash = '1eabd90d39d2977fc66894e3a1355555'
chat = 4581555555 # Чат айди сами загуглите как искать (или с клиента Telegram на PC заходите в продвинутые настройки-экспериментальные настройки-включаете отображение ID в профиле и прибавляете -100 в начале, если не сработает прописываете айди которое указано в профиле)

client = TelegramClient('komandos_kolya', api_id, api_hash, device_model="AMD B550", system_version="Windows 10")
client.connect()
phone = input("Enter phone: ")
client.send_code_request(phone, force_sms=False)
value = input("Enter login code: ")
try:
    me = client.sign_in(phone, code=value)
# Если на акке выставленно 2Ф, будет запрос на авторизацию
except SessionPasswordNeededError:
    password = input("Enter password: ")
    me = client.sign_in(password=password)

# Создаем декоратор на событие в чате
@client.on(events.NewMessage(chats=[chat]))
async def handler(event):
    # Получаем дату и время сообщения
    message_datetime = datetime.datetime.now()
    #message_datetime = event.message.to_dict()['date'] # Не спрашивайте меня почему я не сделал так =)
    # Получаем дату и время сообщения

    user_id = event.sender_id # Получаем ID пользователя
    user_text = event.raw_text # Получаем текст сообщения

    # Получаем имя пользователя @mmmm, first name, lastname
    user_entity = await client.get_entity(user_id)
    if user_entity.username:
        user_name = user_entity.username
    else:
        user_name = "Имени нет"
    user_nick = user_entity.first_name + " " + user_entity.last_name
    # Получаем имя пользователя @mmmm, first name, lastname, дату сообщения
    ### Для отладки
    #print(message_datetime)
    #print(user_id)
    #print(user_name)
    #print(user_nick)
    #print(user_text)
    ### Для отладки
    # Пишем переменные в БД
    await insert_message_table(message_datetime, user_id, user_name, user_nick, user_text)

# Работаем с бд (использую асинхронный драйвер aiosqlite)
async def insert_message_table(message_datetime, user_id, user_name, user_nick, user_text):
    try:
        sqlite_connection = await aiosqlite.connect('chat_tg.db') # Подключаемся к базе
        cursor = await sqlite_connection.cursor() # Курсор для работы с БД
        print("Подключен к SQLite")

        # Вставляем переменные сообщения в БД
        sqlite_insert_with_param = """INSERT INTO message
                              (message_date, user_id, user_name, user_nickname, message_text)
                              VALUES (?, ?, ?, ?, ?);""" # Запрос на запись в бд переменных сообщения

        data_tuple = (message_datetime, user_id, user_name, user_nick, user_text)
        await cursor.execute(sqlite_insert_with_param, data_tuple)
        await sqlite_connection.commit()
        print("Данные сообщения успешно вставлены в таблицу message")
        await cursor.close()

    except aiosqlite.Error as error:
        print("Ошибка при работе с SQLite", error)
    finally:
        if sqlite_connection:
            await sqlite_connection.close()
            print("Соединение с SQLite закрыто")
# Работаем с бд (использую асинхронный драйвер aiosqlite)

client.start()
client.run_until_disconnected()

Клиентская часть на Flask состоит из 3-х файлов (client.py, base.html, basic_table.html)
client.py:
Python:
from flask import Flask, render_template
import sqlite3

# Создание экземпляра Flask
app = Flask(__name__)

# Делаю маршрут URL по умолчанию
@app.route('/')
def home():
    # Подключаемся к бд "chat_tg.db"
    conn = sqlite3.connect('chat_tg.db')
    # Создаем курсор для выполнения запросов к SQL
    c = conn.cursor()
    # Выполняем запрос к таблице
    c.execute('SELECT * FROM message')
    # Получаем все данные из таблицы message
    messages = c.fetchall()
    # Закрываем соединение с БД
    conn.close()
    # Визуализируем таблицу бд в index.html
    return render_template('basic_table.html', messages=messages)


if __name__ == '__main__':
    app.run(debug=True)

base.html:
HTML:
<!doctype html>
<html>
  <head>
    <title>Прослушка чата by xss.pro</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
    <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.25/css/dataTables.bootstrap5.css">
  </head>
  <body>
    <div class="container">
      <h1>Прослушка чата: test</h1>
      <hr>
      {% block content %}{% endblock %}
    </div>
    <script type="text/javascript" charset="utf8" src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.25/js/jquery.dataTables.js"></script>
    <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.25/js/dataTables.bootstrap5.js"></script>
    {% block scripts %}{% endblock %}
  </body>
</html>
basic_table.html:
HTML:
{% extends "base.html" %}

{% block content %}
  <table id="data" class="table table-striped">
    <thead>
      <tr>
        <th></th>
        <th>Date</th>
        <th>ID</th>
        <th>Username</th>
        <th>Nickname</th>
        <th>Message</th>
      </tr>
    </thead>
    <tbody>
      {% for message in messages %}
        <tr>
          <td>{{ loop.index }}</td>
          <td>{{ message[0] }}</td>
          <td>{{ message[1] }}</td>
          <td>{{ message[2] }}</td>
          <td>{{ message[3] }}</td>
          <td>{{ message[4] }}</td>
        </tr>
      {% endfor %}
    </tbody>
  </table>
{% endblock %}

{% block scripts %}
  <script>
    $(document).ready(function () {
      $('#data').DataTable({
      });
    });
  </script>
{% endblock %}

P.S. Полный исходник с БД и со всей правильной структурой прикрепил в ZIP.
 

Вложения

  • bot-proslushka.zip
    6.2 КБ · Просмотры: 74
Последнее редактирование:
Сделай практическое демо видео
Зачем? Не хочу заморачиваться. Тут и первокласснику всё понятно должно быть. Скрипты работают, протестировано.
Если у кого будут какие трудности по запуску, пишите в ПМ, помогу.
 
А зачем Flask? из-за БД, и панельки?
Ведь на чистом пайтоне можно просто писать файлы +дата?
 
А зачем Flask? из-за БД, и панельки?
Ведь на чистом пайтоне можно просто писать файлы +дата?
для удобства отображения таблицы БД, я сделал клиента на Flask
 
расскажите лучше, как юзать и где брать акки под api id, api hash.
Пробовал покупать, бан на второй запуск скрипта "хэлло ворлд". пробовал регать сам, тоже самое. пробовал юзать прокси тоже через 2 запуска бан аккаунта.
Может что то делают не так, или есть какой то секрет? видел что нужно указывать рандомный system_version или что то вроде того. но не уверен что это инфа актуальна на текущий день
 
Если кому-то панель нужна в темном стиле:
1725608679411.png

Меняем в base.html на следующий код:
HTML:
<!doctype html>
<html data-bs-theme="dark">
  <head>
    <title>Прослушка чата by xss.pro</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/2.1.5/css/dataTables.dataTables.min.css">
  </head>
  <body>
    <div class="container">
      <h1>Прослушка чата: test</h1>
      <hr>
      {% block content %}{% endblock %}
    </div>
    <script type="text/javascript" charset="utf8" src="https://code.jquery.com/jquery-3.7.1.min.js"
              integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="
              crossorigin="anonymous"></script>
    <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/2.1.5/js/dataTables.jqueryui.js"></script>
    <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/2.1.5/js/dataTables.min.js"></script>
    {% block scripts %}{% endblock %}
  </body>
</html>
 
расскажите лучше, как юзать и где брать акки под api id, api hash.
Пробовал покупать, бан на второй запуск скрипта "хэлло ворлд". пробовал регать сам, тоже самое. пробовал юзать прокси тоже через 2 запуска бан аккаунта.
Может что то делают не так, или есть какой то секрет? видел что нужно указывать рандомный system_version или что то вроде того. но не уверен что это инфа актуальна на текущий день
Акк прогретый и с отлежкой купить. Новый/саморег отлетит. Открыть десктоп телегу на белом айпи. Айпи должен соответствовать стране номера. Там же, с того же айпи получить апп ид и хэш. Там же запускать скрипт и смотреть чтобы не было частых запросов,
 
Акк прогретый и с отлежкой купить. Новый/саморег отлетит. Открыть десктоп телегу на белом айпи. Айпи должен соответствовать стране номера. Там же, с того же айпи получить апп ид и хэш. Там же запускать скрипт и смотреть чтобы не было частых запросов,
Лучше конечно не разводить тут флейм, а перенести это в отдельную ветку, но я добавлю кое-что от себя, если поднимаешь сессию с телетона (чего не указано в доке), чтобы сократить вероятность улететь на банановые острова, надо в сессию подключения передавать какие-то параметры, например:
Python:
client = TelegramClient('komandos_kolya', api_id, api_hash, device_model="AMD B550", system_version="Windows 10")
 
Hi it looks great tool. But i didn't understand how can i use that. First i will setup this tool on my system then ? should i input the client number or something else?
Сначала поднимаешь серверную часть и слушаешь чат с сохранением в базу данных (можно не отключая), отдельным процессом через клиент смотришь всё что там понаписали. Вроде всё понятно должно быть. Потом запишу видео по запуску. Слишком много вопросов.... Читайте комментарии к коду.

Всё что нужно передать для запуска скрипта в этих переменных:

Python:
api_id = 24555555
api_hash = '1eabd90d39d2977fc66894e3a1355555'
chat = 4581555555 # Чат айди сами загуглите как искать (или с клиента Telegram на PC заходите в продвинутые настройки-экспериментальные настройки-включаете отображение ID в профиле и прибавляете -100 в начале, если не сработает прописываете айди которое указано в профиле)
 
Последнее редактирование:
Как что работает, это понятно. Но сам бот должен быть участником в нужном чате с правами администратора, или же произвольно получает доступ к любому чату с указанием id этого чата.?????
 
Но сам бот должен быть участником в нужном чате с правами администратора?
Конечно же нет, тогда смысл от этого бота? Это клиентская реализация API телеграма через библиотеку Telethon. Есть отдельный API для ботов. У телеги два API, клиентский и для ботов. Но участником (шпионом) чата быть нужно.=)
или же произвольно получает доступ к любому чату с указанием id этого чата?
Вступаешь в чат с акка на котором будешь запускать бота, и потом боту передаешь ID этого чата для того чтобы его слушать.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
удобная штука, даже если с фишей напрямую кидаешь сс-хи в чат с ботом, чтобы была удобная отчетнсть, спасибо, пригодиться
 
Интерфейс сделан: holynet
Это версия позволяет работать как мониторинг по по нескольким группам или всем, более красивее интерфейс:

1. При запуске server.py выбирайте чаты через запятую по номеру из списка, или вводите команду all если хотите писать все свои чаты на акке в базу.
при запуске server.py выбирайте чаты через запятую по номеру из списка, или вводите команду all если хотите писать все свои чаты на акке в базу.
1753807511498.png


2. Обновили Dashboard и добавил туда динамичное расширение для больших сообщений, статистику по активности в чатах, а также фильтр по чатам:
1753807581666.png


1753807696319.png
 

Вложения

  • TelegramMonitorfixbyrand.zip
    32 КБ · Просмотры: 5


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх