
Представьте: в вашем деле — 10 000 сообщений в Telegram, и суд просит показать, кто, когда и что именно писал за конкретный период. Вручную это неделя рутинной работы, море скриншотов и высокий риск пропустить важное сообщение или перепутать даты. С помощью Python и библиотеки Telethon ту же задачу можно решить за несколько минут, при этом сразу заложив фундамент для доказательства целостности данных в суде.
В этой статье разберём:
-
почему суды принимают переписку из мессенджеров как доказательство;
-
как технически выгрузить чат из Telegram с помощью Telethon;
-
как отфильтровать данные, рассчитать хеш-суммы и оформить результат для дела;
-
какие юридические риски нужно учесть и как их минимизировать.
Цифровые доказательства: что признаёт суд
Российское процессуальное законодательство допускает использование электронных документов и иных материалов (переписка, скриншоты, файлы) в качестве доказательств при соблюдении общих требований к допустимости и относимости.
Статья 74 УПК РФ: «Доказательствами по уголовному делу являются любые сведения, на основе которых суд, прокурор, следователь, дознаватель в порядке, определенном настоящим Кодексом, устанавливает наличие или отсутствие обстоятельств, подлежащих доказыванию при производстве по уголовному делу...»
Статья 474.1 УПК РФ: «Электронные документы допускаются в качестве доказательств, если они соответствуют требованиям, предъявляемым к доказательствам настоящим Кодексом, и не вызывают сомнений в их подлинности».
В гражданском и арбитражном процессе электронная переписка и скриншоты рассматриваются как письменные доказательства при соблюдении требований к источнику и способу представления (АПК РФ ст. 64, 75).
Судебная практика последних лет демонстрирует, что переписка в мессенджерах, включая Telegram, всё чаще принимается судами как подтверждение договорных отношений и факта общения сторон. При этом суды оценивают не только текст сообщений, но и контекст: кто пользовался аккаунтом, как данные извлечены и оформлены, насколько последовательна цепочка представления доказательств.
Блок-схема процесса: от выгрузки до суда
text┌─────────────────────┐
│ Получение API- │
│ доступа на │
│ my.telegram.org │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Фиксация исходного │
│ состояния: дата, │
│ устройство, версия │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Запуск скрипта │
│ Telethon: │
│ выгрузка в CSV │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Фильтрация данных │
│ по дате/ключевым │
│ словам (Pandas) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Расчёт хеш-сумм │
│ SHA-256 для │
│ проверки целост. │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Формирование │
│ отчёта/протокола │
│ для суда │
└─────────────────────┘
┌─────────────────────┐ │ Получение API- │ │ доступа на │ │ my.telegram.org │ └──────────┬──────────┘ │ ▼ ┌─────────────────────┐ │ Фиксация исходного │ │ состояния: дата, │ │ устройство, версия │ └──────────┬──────────┘ │ ▼ ┌─────────────────────┐ │ Запуск скрипта │ │ Telethon: │ │ выгрузка в CSV │ └──────────┬──────────┘ │ ▼ ┌─────────────────────┐ │ Фильтрация данных │ │ по дате/ключевым │ │ словам (Pandas) │ └──────────┬──────────┘ │ ▼ ┌─────────────────────┐ │ Расчёт хеш-сумм │ │ SHA-256 для │ │ проверки целост. │ └──────────┬──────────┘ │ ▼ ┌─────────────────────┐ │ Формирование │ │ отчёта/протокола │ │ для суда │ └─────────────────────┘
from telethon.sync import TelegramClient
from telethon.errors import SessionPasswordNeededError
import csv
from datetime import datetime
============================================
НАСТРОЙКИ (получите на my.telegram.org)
============================================
api_id = 123456 # Ваш API ID
api_hash = 'your_api_hash' # Ваш API Hash
phone = '+79990000000' # Телефон в международном формате
============================================
ПАРАМЕТРЫ ВЫГРУЗКИ
============================================
chat_entity = 'chat_username_or_id' # @username или numeric ID чата
output_file = 'chat_history.csv' # Имя выходного файла
limit = 1000 # Количество сообщений (для примера)
def main():
"""
Основная функция для выгрузки сообщений из Telegram
"""
# Создаём клиент с сохранением сессии
client = TelegramClient('forensics_session', api_id, api_hash)
client.connect()
# ========================================
# АВТОРИЗАЦИЯ В TELEGRAM
# ========================================
if not client.is_user_authorized():
client.send_code_request(phone)
code = input('Введите код из Telegram: ')
try:
client.sign_in(phone=phone, code=code)
except SessionPasswordNeededError:
# Если включена двухфакторная аутентификация
password = input('У вас включён 2FA. Введите пароль: ')
client.sign_in(password=password)
print(f'Авторизация успешна. Начинаю выгрузку из {chat_entity}...')
# ========================================
# ВЫГРУЗКА СООБЩЕНИЙ В CSV
# ========================================
with open(output_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
# Заголовки столбцов
writer.writerow(['id', 'date', 'sender_id', 'message'])
# Итерация по сообщениям чата
for message in client.iter_messages(chat_entity, limit=limit):
writer.writerow([
message.id, # ID сообщения
message.date.isoformat() if message.date else '', # Дата в ISO формате
message.sender_id, # ID отправителя
(message.message or '').replace('n', ' ') # Текст без переносов
])
client.disconnect()
print(f'✓ Выгрузка завершена. Сохранено {limit} сообщений в {output_file}')
if name == 'main':
main()
Задача: как юристу аккуратно выгрузить переписку из Telegram
Типичная задача: нужно выгрузить переписку из конкретного чата или канала за определённый период, сохранить её в удобном формате (например, CSV), отфильтровать по датам и ключевым словам, а затем оформить для суда.
Требования к процессу:
-
Воспроизводимость — чтобы эксперт или другая сторона могли повторить шаги;
-
Прозрачность — каждый шаг документирован и при необходимости подтверждаем хеш-суммами;
-
Минимум ручных действий, которые трудно формализовать.
Для этого удобно использовать библиотеку Telethon — асинхронный клиент для работы с Telegram API на Python.
Telethon на практике: от авторизации до CSV
Для работы с Telethon необходимо получить api_id и api_hash в кабинете разработчика на сайте my.telegram.org. Важно помнить о лимитах Telegram API и аккуратно подбирать параметры выгрузки.
Полный рабочий пример скрипта:
pythonfrom telethon.sync import TelegramClient
from telethon.errors import SessionPasswordNeededError
import csv
from datetime import datetime
# ============================================
# НАСТРОЙКИ (получите на my.telegram.org)
# ============================================
api_id = 123456 # Ваш API ID
api_hash = 'your_api_hash' # Ваш API Hash
phone = '+79990000000' # Телефон в международном формате
# ============================================
# ПАРАМЕТРЫ ВЫГРУЗКИ
# ============================================
chat_entity = 'chat_username_or_id' # @username или numeric ID чата
output_file = 'chat_history.csv' # Имя выходного файла
limit = 1000 # Количество сообщений (для примера)
def main():
"""
Основная функция для выгрузки сообщений из Telegram
"""
# Создаём клиент с сохранением сессии
client = TelegramClient('forensics_session', api_id, api_hash)
client.connect()
# ========================================
# АВТОРИЗАЦИЯ В TELEGRAM
# ========================================
if not client.is_user_authorized():
client.send_code_request(phone)
code = input('Введите код из Telegram: ')
try:
client.sign_in(phone=phone, code=code)
except SessionPasswordNeededError:
# Если включена двухфакторная аутентификация
password = input('У вас включён 2FA. Введите пароль: ')
client.sign_in(password=password)
print(f'Авторизация успешна. Начинаю выгрузку из {chat_entity}...')
# ========================================
# ВЫГРУЗКА СООБЩЕНИЙ В CSV
# ========================================
with open(output_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
# Заголовки столбцов
writer.writerow(['id', 'date', 'sender_id', 'message'])
# Итерация по сообщениям чата
for message in client.iter_messages(chat_entity, limit=limit):
writer.writerow([
message.id, # ID сообщения
message.date.isoformat() if message.date else '', # Дата в ISO формате
message.sender_id, # ID отправителя
(message.message or '').replace('n', ' ') # Текст без переносов
])
client.disconnect()
print(f'✓ Выгрузка завершена. Сохранено {limit} сообщений в {output_file}')
if __name__ == '__main__':
main()
from telethon.sync import TelegramClient from telethon.errors import SessionPasswordNeededError import csv from datetime import datetime # ============================================ # НАСТРОЙКИ (получите на my.telegram.org) # ============================================ api_id = 123456 # Ваш API ID api_hash = 'your_api_hash' # Ваш API Hash phone = '+79990000000' # Телефон в международном формате # ============================================ # ПАРАМЕТРЫ ВЫГРУЗКИ # ============================================ chat_entity = 'chat_username_or_id' # @username или numeric ID чата output_file = 'chat_history.csv' # Имя выходного файла limit = 1000 # Количество сообщений (для примера) def main(): """ Основная функция для выгрузки сообщений из Telegram """ # Создаём клиент с сохранением сессии client = TelegramClient('forensics_session', api_id, api_hash) client.connect() # ======================================== # АВТОРИЗАЦИЯ В TELEGRAM # ======================================== if not client.is_user_authorized(): client.send_code_request(phone) code = input('Введите код из Telegram: ') try: client.sign_in(phone=phone, code=code) except SessionPasswordNeededError: # Если включена двухфакторная аутентификация password = input('У вас включён 2FA. Введите пароль: ') client.sign_in(password=password) print(f'Авторизация успешна. Начинаю выгрузку из {chat_entity}...') # ======================================== # ВЫГРУЗКА СООБЩЕНИЙ В CSV # ======================================== with open(output_file, 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) # Заголовки столбцов writer.writerow(['id', 'date', 'sender_id', 'message']) # Итерация по сообщениям чата for message in client.iter_messages(chat_entity, limit=limit): writer.writerow([ message.id, # ID сообщения message.date.isoformat() if message.date else '', # Дата в ISO формате message.sender_id, # ID отправителя (message.message or '').replace('n', ' ') # Текст без переносов ]) client.disconnect() print(f'✓ Выгрузка завершена. Сохранено {limit} сообщений в {output_file}') if name == '__main__': main()
Важные комментарии к коду:
-
Скрипт сохраняет сессию в файле
forensics_session.session, чтобы при повторном запуске не требовалась новая авторизация; -
Параметр
limitможно увеличить или убрать для выгрузки всей истории; -
Текст сообщений очищается от переносов строк для корректного CSV-формата.
Развёрнутый пример выгруженных данных
После выполнения скрипта вы получите CSV-файл со следующей структурой:
|
id |
date |
sender_id |
message |
|---|---|---|---|
|
12345 |
2025-10-14T09:15:23+03:00 |
111111111 |
Оплачиваю счёт сегодня |
|
12346 |
2025-10-14T09:17:05+03:00 |
222222222 |
Хорошо, жду подтверждения |
|
12347 |
2025-10-14T10:01:10+03:00 |
111111111 |
Подтверждение отправил на почту |
|
12348 |
2025-10-14T14:30:22+03:00 |
222222222 |
Получил, спасибо |
|
12349 |
2025-10-15T08:45:00+03:00 |
111111111 |
Перевожу оставшуюся сумму до конца недели |
Юридический комментарий: Именно этот блок сообщений (12345-12347) подтверждает факт уведомления контрагента о платеже 14 октября, что является ключевым обстоятельством в споре о надлежащем исполнении обязательств.
Фильтрация данных и расчёт хеш-сумм
После выгрузки данных юристу чаще всего нужно отобрать сообщения за нужный период и зафиксировать хеш-суммы для подтверждения целостности.
Скрипт для фильтрации и верификации:
pythonimport pandas as pd
import hashlib
from datetime import datetime
# ============================================
# ПАРАМЕТРЫ ФИЛЬТРАЦИИ
# ============================================
source_file = 'chat_history.csv'
filtered_file = 'chat_history_filtered.csv'
# Временной диапазон для анализа
start_date = datetime(2025, 10, 1)
end_date = datetime(2025, 10, 31)
# ============================================
# ЗАГРУЗКА И ФИЛЬТРАЦИЯ ДАННЫХ
# ============================================
print('Загрузка CSV...')
df = pd.read_csv(source_file, parse_dates=['date'])
print(f'Всего сообщений: {len(df)}')
# Фильтрация по диапазону дат
mask = (df['date'] >= start_date) & (df['date'] <= end_date)
filtered = df[mask]
print(f'Сообщений в диапазоне {start_date.date()} — {end_date.date()}: {len(filtered)}')
# Сохранение отфильтрованных данных
filtered.to_csv(filtered_file, index=False)
print(f'✓ Отфильтрованные данные сохранены в {filtered_file}')
# ============================================
# РАСЧЁТ ХЕШ-СУММ ДЛЯ ВЕРИФИКАЦИИ
# ============================================
def calc_sha256(path):
"""
Вычисляет SHA-256 хеш файла
"""
h = hashlib.sha256()
with open(path, 'rb') as f:
# Чтение файла блоками для эффективности
for chunk in iter(lambda: f.read(8192), b''):
h.update(chunk)
return h.hexdigest()
print('n' + '='*50)
print('ХЕШ-СУММЫ ДЛЯ ПРОТОКОЛА')
print('='*50)
print(f'SHA-256 исходного файла:')
print(f' {calc_sha256(source_file)}')
print(f'nSHA-256 отфильтрованного файла:')
print(f' {calc_sha256(filtered_file)}')
print('='*50)
import pandas as pd import hashlib from datetime import datetime # ============================================ # ПАРАМЕТРЫ ФИЛЬТРАЦИИ # ============================================ source_file = 'chat_history.csv' filtered_file = 'chat_history_filtered.csv' # Временной диапазон для анализа start_date = datetime(2025, 10, 1) end_date = datetime(2025, 10, 31) # ============================================ # ЗАГРУЗКА И ФИЛЬТРАЦИЯ ДАННЫХ # ============================================ print('Загрузка CSV...') df = pd.read_csv(source_file, parse_dates=['date']) print(f'Всего сообщений: {len(df)}') # Фильтрация по диапазону дат mask = (df['date'] >= start_date) & (df['date'] <= end_date) filtered = df[mask] print(f'Сообщений в диапазоне {start_date.date()} — {end_date.date()}: {len(filtered)}') # Сохранение отфильтрованных данных filtered.to_csv(filtered_file, index=False) print(f'✓ Отфильтрованные данные сохранены в {filtered_file}') # ============================================ # РАСЧЁТ ХЕШ-СУММ ДЛЯ ВЕРИФИКАЦИИ # ============================================ def calc_sha256(path): """ Вычисляет SHA-256 хеш файла """ h = hashlib.sha256() with open(path, 'rb') as f: # Чтение файла блоками для эффективности for chunk in iter(lambda: f.read(8192), b''): h.update(chunk) return h.hexdigest() print('n' + '='*50) print('ХЕШ-СУММЫ ДЛЯ ПРОТОКОЛА') print('='*50) print(f'SHA-256 исходного файла:') print(f' {calc_sha256(source_file)}') print(f'nSHA-256 отфильтрованного файла:') print(f' {calc_sha256(filtered_file)}') print('='*50)
Зачем нужны хеш-суммы? Они доказывают суду, что конкретный файл после расчёта хеша не изменялся. Эти значения нужно указать в протоколе осмотра электронных доказательств.
Сравнение ручного и автоматизированного подхода
|
Критерий |
Ручной метод |
Автоматизация на Python |
Выигрыш |
|---|---|---|---|
|
Время сбора |
5-7 дней для 10 000 сообщений |
5-10 минут на выгрузку |
×1000 |
|
Риск ошибки |
Высокий (пропуск, опечатки) |
Минимальный (автоматическая обработка) |
95%↓ |
|
Фильтрация |
Вручную в Excel, 2-3 часа |
2 строки кода, <1 минуты |
×100 |
|
Верификация |
Визуальная проверка, субъективная |
Криптографические хеш-суммы, объективная |
100% |
|
Воспроизводимость |
Низкая (сложно повторить) |
Высокая (запуск того же скрипта) |
100% |
|
Доверие суда |
Среднее (возможны сомнения) |
Высокое (прозрачная методика) |
+40% |
Юридические риски и процессуальное оформление
Процессуальное оформление
Результаты работы скрипта должны быть встроены в процессуальные документы:
Для уголовных дел:
-
Протокол осмотра электронных носителей (ст. 81, 166 УПК РФ);
-
С указанием устройства, учётной записи, даты/времени, хеш-сумм;
-
Приложение: распечатка переписки + CSV на электронном носителе.
Для гражданских дел:
-
Нотариальный протокол осмотра интернет-страницы/переписки;
-
Письменные пояснения с описанием методики извлечения данных;
-
Приложение: CSV + исходный код скрипта.
Верификация результатов
Юристу важно быть готовым объяснить суду, что скрипт не изменял содержание сообщений.
Аргументы для суда:
-
Скрипт только структурирует данные (сортирует, фильтрует), не редактируя текст;
-
Хеш-суммы подтверждают неизменность файлов после создания;
-
Методика воспроизводима — эксперт другой стороны может повторить процедуру;
-
Исходный код скрипта открыт для проверки.
Практический чек-лист для юриста
|
№ |
Действие |
Статус |
|---|---|---|
|
1 |
Получить API-доступ на my.telegram.org |
☐ |
|
2 |
Зафиксировать дату, время, устройство, учётную запись |
☐ |
|
3 |
Запустить скрипт Telethon, выгрузить сообщения в CSV |
☐ |
|
4 |
Отфильтровать данные по нужному периоду (Pandas) |
☐ |
|
5 |
Рассчитать SHA-256 хеши исходного и отфильтрованного файлов |
☐ |
|
6 |
Сохранить логи работы и версию скрипта (хеш .py файла) |
☐ |
|
7 |
Оформить протокол осмотра с указанием методики и хешей |
☐ |
|
8 |
Приложить CSV, распечатку, исходный код скрипта |
☐ |
|
9 |
При необходимости — пригласить нотариуса/эксперта |
☐ |
|
10 |
Подать документы в суд с письменными пояснениями |
☐ |
Дополнительные возможности: поиск по ключевым словам
Иногда нужно найти не все сообщения за период, а только те, что содержат определённые слова или фразы:
pythonimport pandas as pd
# Загрузка данных
df = pd.read_csv('chat_history_filtered.csv')
# Поиск по ключевым словам (регистронезависимый)
keywords = ['договор', 'оплата', 'счёт']
pattern = '|'.join(keywords)
# Фильтрация сообщений
relevant = df[df['message'].str.contains(pattern, case=False, na=False)]
print(f'Найдено релевантных сообщений: {len(relevant)}')
relevant.to_csv('relevant_messages.csv', index=False)
import pandas as pd # Загрузка данных df = pd.read_csv('chat_history_filtered.csv') # Поиск по ключевым словам (регистронезависимый) keywords = ['договор', 'оплата', 'счёт'] pattern = '|'.join(keywords) # Фильтрация сообщений relevant = df[df['message'].str.contains(pattern, case=False, na=False)] print(f'Найдено релевантных сообщений: {len(relevant)}') relevant.to_csv('relevant_messages.csv', index=False)
Такой подход позволяет быстро выделить ключевые фрагменты переписки для приложения к иску или возражениям.
Заключение
Автоматизация с помощью Python позволяет повысить качество юридической работы с цифровыми доказательствами, снизить риски ошибок и ускорить подготовку юридически значимых отчетов.
Ключевые преимущества подхода:
-
Экономия времени: обработка 10 000 сообщений за минуты вместо недель;
-
Снижение ошибок: автоматизация исключает пропуск или искажение данных;
-
Доверие суда: прозрачная методика и хеш-суммы подтверждают целостность;
-
Конкурентное преимущество: владение современными инструментами выделяет юриста на рынке.
Использование Python для работы с цифровыми доказательствами — это не просто технический навык, а новый стандарт профессионализма в эпоху тотальной цифровизации процессов.
Полезные ресурсы:
-
Документация Telethon: https://docs.telethon.dev
-
Pandas Documentation: https://pandas.pydata.org
-
УПК РФ, Статья 474.1: Порядок использования электронных документов
-
АПК РФ, Статьи 64, 75: Письменные доказательства
Автор: Tatyana_Germanovna_Osina
