Или история о том, как я превратил свой Telegram в файловую систему и почему мой компьютер теперь обижается на меня.
Всем привет! Сегодня я расскажу вам о том, как из обычного скучного дня вырос проект, который превратил мой Telegram в персональную файловую систему. Если вы когда-нибудь хотели почувствовать себя системным администратором в мессенджере или просто ищете способ спрятать файлы от самого себя, то эта статья для вас.
Предыстория
Всё началось с того, что мой жесткий диск стал напоминать шкаф с несвежими носками: места мало, найти ничего нельзя, и где-то там спрятан подарок от прошлого Нового года, а хранить все файлы в "избранных" это как-то фу-фу-фу. Я люблю искать нестандартные решения обычных проблем. Решение пришло само собой - перенести всё в облако! Но где найти такое место, чтобы и доступ был всегда под рукой, и чтобы никто не догадался заглянуть, и оно было БЕСПЛАТНОЕ? Конечно же, Telegram!
Идея бота
Цель была проста - создать бота, который позволит сохранять файлы, организовывать их по папкам и при необходимости делиться ими с другими пользователями. И всё это с минимальными затратами усилий (и максимальными затратами времени). Ведь кто сказал, что хранение файлов должно быть скучным?
Архитектура проекта
Проект состоит из нескольких основных модулей:
config.py: файл конфигурации (здесь хранится токен бота).
utils/: вспомогательные функции для работы с данными и навигацией.
handlers/: обработчики команд, сообщений и колбэков.
bot.py: основной файл для запуска бота.
requirements.txt: зависимости проекта.
Давайте подробнее рассмотрим каждый компонент.
Файл config.py
Начнём с простого. Здесь мы храним конфигурацию бота и основные настройки.
# config.py
BOT_TOKEN = "ВАШ_ТОКЕН_ОТ_TELEGRAM"
DATA_FILE = 'user_data.json'
Не забудьте заменить "ВАШ_ТОКЕН_ОТ_TELEGRAM" на реальный токен, который можно получить у @BotFather. Файл DATA_FILE используется для хранения данных пользователей. **Почему JSON? Потому что зачем заморачиваться с базой данных, когда можно оставить всё на честном слове и JSON-файле? Ведь кто вообще использует базы данных для Telegram-ботов в 2024 году? (Спойлер: все, кроме меня.)
Вспомогательные модули
utils/data_manager.py
Этот модуль отвечает за загрузку и сохранение данных пользователей.
# utils/data_manager.py
import json
import os
from config import DATA_FILE
def load_data():
if not os.path.exists(DATA_FILE):
return {"users": {}, "shared_folders": {}}
with open(DATA_FILE, 'r', encoding='utf-8') as file:
return json.load(file)
def save_data(data):
with open(DATA_FILE, 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
def init_user(data, user_id):
if user_id not in data["users"]:
data["users"][user_id] = {
"current_path": [],
"structure": {
"folders": {},
"files": []
},
"file_mappings": {} # Сопоставление short_id и file_id
}
Использование JSON-файла вместо базы данных — это как хранить семейные реликвии в картонной коробке. Надёжно? Возможно нет. Зато быстро и без лишних сложностей!
utils/navigation.py
Функции для навигации по файловой структуре.
# utils/navigation.py
def navigate_to_path(structure, path):
current = structure
for folder in path:
current = current["folders"][folder]
return current
Эта функция — наш проводник по виртуальному файловому лабиринту. Без неё мы бы заблудились в трёх соснах... то есть, в трёх папках.
utils/keyboards.py
Генерация клавиатур для навигации по папкам и файлам.
# utils/keyboards.py
from telebot import types
import uuid
import logging
logger = logging.getLogger(__name__)
def generate_markup(current, path, shared_key=None):
markup = types.InlineKeyboardMarkup()
# Кнопка "Вверх", если мы не в корне
if path:
callback_data = "up" if not shared_key else f"shared_up:{shared_key}"
markup.add(types.InlineKeyboardButton("⬆️ Вверх", callback_data=callback_data))
# Кнопки для папок
for folder in current["folders"]:
callback_data = f"folder:{folder}" if not shared_key else f"shared_folder:{shared_key}:{folder}"
markup.add(types.InlineKeyboardButton(f" 