Добавить в корзинуПозвонить
Найти в Дзене

«Как я Pythonом флешки пас: или инструкция по созданию программы-шпиона для своих же файлов»

Знаете это чувство, когда даёшь другу флешку с важными файлами, а он потом говорит: «Ой, я там случайно папку с мемами перезаписал»? Или когда начальник просит скопировать отчёт, а ты потом не помнишь — копировал вообще или просто «подумал и забыл»? Вот и я с этим столкнулся. А ещё я параноик. Полезный параноик, который умеет программировать на Python. И теперь я расскажу вам, как написать программу, которая будет контролировать копирование файлов как строгая учительница на контрольной. Ни одна копия не пройдёт незамеченной! 🕵️ Спойлер: она умеет всё, кроме... ну, кроме того, чтобы написать себя сама. Пока что.
Наш будущий шедевр будет: ✅ Отслеживать — когда и куда скопировали файл
✅ Проверять — не повредилась ли копия по пути (хеширование, детка!)
✅ Логировать — вести досье на каждую копию
✅ Сигнализировать — если что-то пошло не так
✅ Определять — флешка это или обычный диск (потому что флешки любят «теряться») Звучит как программа из «Шпионских игр»? Ага. Но писать будем мы, а
Оглавление

Вступление: Почему я решил написать эту программу?

Знаете это чувство, когда даёшь другу флешку с важными файлами, а он потом говорит: «Ой, я там случайно папку с мемами перезаписал»? Или когда начальник просит скопировать отчёт, а ты потом не помнишь — копировал вообще или просто «подумал и забыл»?

Вот и я с этим столкнулся. А ещё я параноик. Полезный параноик, который умеет программировать на Python.

И теперь я расскажу вам, как написать программу, которая будет контролировать копирование файлов как строгая учительница на контрольной. Ни одна копия не пройдёт незамеченной! 🕵️

Что умеет наша программа?

-2

Спойлер: она умеет всё, кроме... ну, кроме того, чтобы написать себя сама. Пока что.

Наш будущий шедевр будет:

Отслеживать — когда и куда скопировали файл
Проверять — не повредилась ли копия по пути (хеширование, детка!)
Логировать — вести досье на каждую копию
Сигнализировать — если что-то пошло не так
Определять — флешка это или обычный диск (потому что флешки любят «теряться»)

Звучит как программа из «Шпионских игр»? Ага. Но писать будем мы, а не спецагенты.

Шаг 1: Готовим инструменты

Для начала установим нужные библиотеки. Открываем терминал (или командную строку, если вы ещё не перешли на тёмную сторону) и пишем:

bash

pip install psutil watchdog pywin32

Что за звери?

  • psutil — крутая штука, которая видит всё про диски и процессы
  • watchdog — наблюдает за папками как кошка за лазерной указкой
  • pywin32 — только для Windows, помогает отличать флешки от обычных дисков

Пользователи Linux и macOS — не грустите, у вас тоже всё будет работать. Просто чуть-чуть по-другому. Как борщ без свеклы — можно, но не то.

Шаг 2: Пишем ядро системы (и не взорвётся)

Часть 1. Определяем, флешка перед нами или нет

Начнём с магии. Как компьютер понимает, что перед ним флешка, а не, скажем, бутерброд?

-3

import platform
import win32file # если вы на Windows

def is_usb_drive(path):
"""Проверяет, является ли диск USB-накопителем"""
if platform.system() == 'Windows':
drive_letter = path[0].upper()
drive_type = win32file.GetDriveType(f"{drive_letter}:\\")
# 2 = DRIVE_REMOVABLE (съёмный диск)
return drive_type == 2
elif platform.system() == 'Linux':
# Тут код для либосов (шучу, для Linux)
import subprocess
result = subprocess.run(['lsblk', '-o', 'MOUNTPOINT,TYPE'],
capture_output=True, text=True)
return 'usb' in result.stdout.lower()
else:
return False # Может, это вообще не диск, а овсянка, сэр!

Юмористический комментарий: Если программа вернёт True на вопросе «это флешка?», значит, всё ок. Если False — возможно, вы подключили к компьютеру тостер. Но не гарантирую.

Часть 2. Хеширование — наша новая любовь

-4

Что такое хеш? Если просто — это такой цифровой «отпечаток пальца» файла. Чуть-чуть изменил файл — хеш полностью поменялся. Идеально для контроля!

import hashlib

def calculate_hash(file_path):
"""Считаем хеш файла (лениво, но надёжно)"""
sha256 = hashlib.sha256()
try:
with open(file_path, 'rb') as f:
# Читаем кусочками по 8 КБ, чтобы не подавиться
for chunk in iter(lambda: f.read(8192), b''):
sha256.update(chunk)
return sha256.hexdigest()
except Exception as e:
print(f"Ошибка: файл {file_path} не хочет давать свой отпечаток!")
return None

Почему 8192 байта? Потому что красивое число. А если серьёзно — оптимальный размер для чтения. Как ложка для обеда: не маленькая, не большая, а в самый раз.

Часть 3. Копирование с контролем

Самое мясо! Копируем, проверяем, ругаемся, если что-то не так.

import shutil
from pathlib import Path

def smart_copy(source, destination):
"""Копирует файл, но с проверкой, что всё честно"""
source_path = Path(source)

# Если destination — папка, добавляем имя файла
if Path(destination).is_dir():
dest_path = Path(destination) / source_path.name
else:
dest_path = Path(destination)

# Получаем "отпечаток" исходника
source_hash = calculate_hash(source)
if not source_hash:
return False, "Не могу прочитать исходный файл (может, он привидение?)"

# Копируем
try:
shutil.copy2(source, dest_path)
except Exception as e:
return False, f"Ошибка копирования: {e}"

# Проверяем копию
dest_hash = calculate_hash(dest_path)
if source_hash == dest_hash:
return True, "Файл скопирован и проверен!"
else:
return False, "Тревога! Файл повреждён при копировании!"

Важное примечание: если функция вернула False — бегите проверять флешку. Возможно, её грызли хомяки.

Часть 4. Логирование — чтобы было что показать начальнику

Согласитесь, без логов программа — как детектив без записной книжки. Мы будем записывать всё в файлик copy_log.json:

import json
from datetime import datetime

def log_copy_event(source, dest, success, message):
"""Логируем всё, что происходит (и немного того, чего не происходит)"""
log_file = "copy_log.json"

event = {
"timestamp": datetime.now().isoformat(),
"source": source,
"destination": dest,
"success": success,
"message": message
}

# Читаем старые логи
try:
with open(log_file, 'r', encoding='utf-8') as f:
logs = json.load(f)
except:
logs = []

# Добавляем новое событие
logs.append(event)

# Сохраняем обратно
with open(log_file, 'w', encoding='utf-8') as f:
json.dump(logs, f, ensure_ascii=False, indent=2)

print(f"[{datetime.now().strftime('%H:%M:%S')}] {message}")

Теперь у вас будет чёрный список файлов, которые не скопировались. Или красный? В общем, список.

Шаг 3: Пишем полноценного шпиона

Соединяем всё вместе и добавляем функцию, которая сама следит за папкой.

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class CopySpy(FileSystemEventHandler):
"""Шпион, который видит всё"""

def on_created(self, event):
if not event.is_directory:
print(f"🔍 Внимание! Появился новый файл: {event.src_path}")
# Тут можно добавить проверку, откуда он взялся
# Но мы пока просто логируем факт появления

def monitor_folder(folder_to_watch):
"""Запускает слежку за папкой (не шпионское ПО, честно)"""
event_handler = CopySpy()
observer = Observer()
observer.schedule(event_handler, folder_to_watch, recursive=True)
observer.start()

print(f"👁️ Начинаем слежку за папкой {folder_to_watch}")
print("Нажмите Ctrl+C, если хотите спать спокойно")

try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
print("\n😴 Слежка завершена. Можете выдохнуть.")

observer.join()

Шаг 4: Продвинутые фишки для тех, кто хочет в топ

Фишка 1: Отправка уведомлений в Telegram

import requests

def send_telegram_alert(message):
"""Отправляет паник-сообщение в Telegram"""
bot_token = "ВАШ_ТОКЕН_БОТА"
chat_id = "ВАШ_CHAT_ID"

url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
data = {"chat_id": chat_id, "text": f"🚨 ОПАСНОСТЬ! {message}"}

try:
requests.post(url, data=data)
except:
pass # Если не отправилось — ну и ладно, не век же вековать

Теперь бот будет писать вам: «Вася, тут файл копируют! Бегом смотреть!» Удобно же?

Фишка 2: Защита от дурака (или от себя)

def confirm_copy(source, dest):
"""Спрашивает разрешение перед копированием"""
answer = input(f"Копировать {source} на {dest}? (да/нет): ")
return answer.lower() in ['да', 'yes', 'lf', 'y'] # На любой вкус

Практический пример: как это всё запустить

def main():
print("=== СУПЕР-КОНТРОЛЛЕР КОПИРОВАНИЯ ФАЙЛОВ v1.0 ===")
print("(Создано бессонными ночами и чашками кофе)\n")

# Выбираем исходный файл
source = input("Введите путь к файлу: ")

# Выбираем папку назначения
dest = input("Введите папку для копирования: ")

# Проверяем, флешка ли это
if is_usb_drive(dest):
print("⚠️ ВНИМАНИЕ! Вы копируете на флешку! Будьте осторожны!")

confirm = input("Продолжить? (да/нет): ")
if confirm.lower() != 'да':
print("Копирование отменено. Флешка спасена!")
return

# Выполняем копирование
success, message = smart_copy(source, dest)

# Логируем результат
log_copy_event(source, dest, success, message)

# Отправляем уведомление
if not success:
send_telegram_alert(f"Ошибка копирования: {message}")

print(f"\nРезультат: {message}")

# Запускаем слежку за папкой, если нужно
monitor = input("\nЗапустить слежку за папкой? (да/нет): ")
if monitor.lower() == 'да':
monitor_folder(dest)

if __name__ == "__main__":
main()

Что в итоге?

Друзья, теперь у вас есть оружие массового поражения для контроля файлов. Вы можете:

✅ Знать, куда и когда копируются ваши файлы
✅ Проверять, не повредилась ли копия
✅ Отслеживать флешки (и ругать коллег, которые их теряют)
✅ Получать уведомления в Telegram
✅ Чувствовать себя хакером из фильмов про кибербезопасность

Честный эпилог

Эта программа не сделает из вас Мистера Робота. Но она сделает жизнь чуточку спокойнее. А ещё — это отличный способ прокачать свой Python и порадовать внутреннего параноика.

P.S. Если программа вдруг не заработает — перепроверьте пути к файлам. В 90% случаев проблема не в коде, а в том, что вы забыли создать папку или перепутали слеши / и \. Знаем, плавали.

P.P.S. А если заработает — поставьте лайк статье. Не за спасибо, а за то, чтобы я и дальше писал такие туториалы с чувством юмора и пользой!

P.P.P.S. Код полностью рабочий, проверено на кошках. Кошкам не понравилось, но файлы скопировались. 🐱