Как я создал Telegram-бота для хранения файлов и чуть не стал библиотекарем

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Или история о том, как я превратил свой 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"						
Источник: https://habr.com/ru/articles/862434/


Интересные статьи

Интересные статьи

Всем привет. Хочу поделиться своим отношением к рабочему и личному времени, а точней к отношению к переработкам.Переработка это не задержаться раз в неделю на час. Переработка это на протяжении долгог...
В данной статье мы рассмотрим систему аутентификации пользователей и внешних систем в личном кабинете через сервер аутентификации Blitz Identity Provider. Согласно требованиям проекта, который мы...
Автомобильные и технологические компании лихорадочно занимаются системами безопасности, которые могут обнаруживать различные объекты и избегать столкновения с ними. Но занимается ли к...
Всем привет. Если вы когда-либо работали с универсальными списками в Битрикс24, то, наверное, в курсе, что страница детального просмотра элемента полностью идентична странице редак...
Те, кто собираются открывать интернет-магазин, предварительно начитавшись в интернете о важности уникального контента, о фильтрах, накладываемых поисковиками за копирование материалов с других ресурсо...