Задача простая: снять с телефона фото и видео и получить их на ПК с Windows без кабеля, облака и установки чего-либо на телефон. Готовые решения либо требуют приложение на обе стороны, либо гоняют файлы через чужой сервер, либо жмут видео в мессенджере. Я сделал «Тропку»: ПК поднимает у себя маленький HTTPS-сайт, телефон открывает его в обычном браузере по адресу из QR-кода.

Схема

ПК запускает веб-сервер на порту 47321. В окне программы показывается QR-код с адресом вида https://192.168.1.5:47321/?k=PIN. Телефон переходит по ссылке, сервер проверяет PIN, ставит cookie и перенаправляет на /, где живёт страница с лентой. Файлы идут напрямую по локальной сети, через интернет ничего не проходит.

Стек: Python 3.12, aiohttp (сервер), cryptography (сертификат), qrcode, PySide6 (окно), pystray (трей), SQLite (лента и список телефонов), PyInstaller (один .exe). Страница телефона — чистые HTML/JS/CSS без внешних библиотек.

Сертификат: HTTPS без домена

Некоторые возможности браузера (например, Wake Lock, который не даёт экрану телефона погаснуть во время передачи) работают только в безопасном контексте, поэтому голый HTTP не подходит. Домена у локального IP нет, значит, остаётся самоподписанный сертификат. Программа создаёт его при первом запуске: ключ EC P-256, в SAN попадает IP ПК. Если у компьютера сменился адрес, сертификат пересоздаётся.

Платить за это приходится одним предупреждением: «Подключение не защищено» на Android и «Это соединение не является частным» на iPhone. Соединение при этом шифруется. Chrome помнит исключение примерно неделю, потом спрашивает снова. Убрать предупреждение можно только установкой собственного корневого сертификата на телефон, что для сценария «отсканировал и пользуйся» слишком тяжело.

Доступ: QR с PIN и cookie

Сервер слушает 0.0.0.0, поэтому открыть его мог бы любой в той же сети. Защита такая: PIN зашит в QR (?k=PIN), сервер проверяет его, ставит cookie сессии и редиректит на /. Пять неверных PIN подряд блокируют IP на минуту. Кнопка «Новый PIN» выдаёт другой.

Есть тонкость с cookie: SameSite=Strict здесь не работает. Вход по QR — это переход из приложения камеры, а Strict-cookie теряется на таком редиректе, поэтому стоит SameSite=Lax.

Ещё одно ограничение — CSP default-src 'self': на странице телефона нет ни inline-скриптов, ни внешних CDN, только свои файлы.

Приём файла без порчи

Файл с телефона отправляется PUT-запросом на /api/upload. Сервер пишет его во временный .most-<id>.part и только после завершения переименовывает в свободное имя: если а.txt уже есть, получится а (1).txt. Так оборванная передача не оставит в «Загрузках» битый файл. Деталь Windows: os.rename там не перезаписывает существующий файл, поэтому свободное имя подбирается заранее.

События (телефон подключился, файл принят, текст получен) идут через внутреннюю шину: на страницу телефона — по SSE (/api/events), в окно — через Qt-сигнал. Шина вызывается в потоке сервера, а виджеты PySide6 трогать можно только из GUI-потока, поэтому между ними стоит ретранслятор.

Брандмауэр Windows

Самое неприятное место для пользователя: при первом запуске Windows показывает свой запрос брандмауэра, и если нажать «Отмена», создаётся запрещающее правило, после чего телефон не может открыть страницу. Поэтому программа сама проверяет, пустит ли Windows телефон: есть ли правило для exe (netsh advfirewall firewall show rule, права администратора для проверки не нужны) и не «общедоступная» ли сеть (Get-NetConnectionProfile через PowerShell). Если не пустит, в окне QR появляется красное предупреждение и кнопка «Разрешить доступ телефону». Она одним запросом UAC удаляет старые правила для этого exe, добавляет разрешающее для частной сети и переключает сеть в «Частную».

Сборка в один exe

PyInstaller собирает один Tropka.exe примерно на 41 МБ. Значок и свойства файла (версия берётся из version) генерируются отдельным скриптом перед сборкой. Антивирусы иногда подозрительно относятся к программам, собранным PyInstaller, а Windows SmartScreen встречает любую неподписанную программу синим окном «Система Windows защитила ваш компьютер» — в README этому посвящён отдельный раздел.

pip install -r requirements.txt
powershell -ExecutionPolicy Bypass -File build.ps1

Запуск из исходников и режим отладки без HTTPS и брандмауэра:

python -m most
python -m most --host 127.0.0.1 --no-tls --port 8080

Что не получилось (пока)

  • Только одна сеть: ПК и телефон должны быть в одной Wi-Fi сети. Через мобильный интернет без сервера-посредника не выйдет, а делать такой сервер я не хотел.

  • Страница держит экран телефона включённым через Wake Lock, но если телефон всё же заблокировали или браузер надолго свернули, передача обрывается.

  • Нет фоновых уведомлений: новые файлы видно, только когда страница открыта.

  • Пакет по историческим причинам называется most: проект переименовали из «Мост» в «Тропку».

Телефон → телефон

Если ПК не нужен, есть соседний проект «Тропка Онлайн»: страница на GitHub Pages, где телефоны находят друг друга через публичные серверы сообщений и дальше передают файлы по WebRTC напрямую. Служебные сообщения шифруются ключом, который лежит в части ссылки после #, поэтому серверы видят только шифртекст.

Ссылки

Windows 10/11, бесплатно, без рекламы и сбора данных. Критика архитектуры и найденные ошибки приветствуются в комментариях и в Issues на GitHub.

Комментарии (22)


  1. diakin
    02.11.2026 10:00

    Круто! Только что мучался с скачиванием с Tecno с раздолбанным разъемом.
    Следующий шаг - как перенести "все" со старого телефона на новый. Включая приложения, пароли и прочее. Ну так чтобы перенес, включил новый телефон, а там то же самое что и на старом и просто продолжаешь работать.


    1. haga777
      02.11.2026 10:00

      Local send


    1. punkWJ
      02.11.2026 10:00

      Google аккаунт же почти всё переносит...


    1. esasoft
      02.11.2026 10:00

      Если есть рут - Titanium Backup.


  1. alexs963
    02.11.2026 10:00

    PairDrop просто существует.


    1. fixator10
      02.11.2026 10:00

      CopyParty, LocalSend тудаже


      1. Jubilus
        02.11.2026 10:00

        Опенсорсных аналогов на самом деле полно, велосипед изобретается не в первый раз

        Но все эти приложения требуют установки на обеих сторонах, а это лишние движения, если надо просто быстро скинуть пару фоток с чужого смартфона


        1. fixator10
          02.11.2026 10:00

          CopyParty поднимает "мульти"сервер на машине, на которой запущен, там и веб, и ftp и всё что можно придумать.
          LocalSend имеет вебверсию, которая работает только с вебверсией, сейчас подружить её с приложениями нельзя.

          CopyParty на ПК
          CopyParty на ПК
          web-сервер открытый на телефоне в браузере, по qr-коду из скриншота выше
          web-сервер открытый на телефоне в браузере, по qr-коду из скриншота выше


  1. esasoft
    02.11.2026 10:00

    Total Commander с плагином LAN полностью решает проблему безо всяких QR-кодов, мини-серверов на ПК и прочих глупостей.

    Добавил в настройках в телефоне свой ПК (прописал IP, логин/пароль), и всё - копируй в/из расшаренных папок/дисков всё, что душе угодно.


    1. lv333
      02.11.2026 10:00

      X-plore, все в одном и без плагинов. Есть сервер на телефоне отдельно даже. Тотал ну такое, если сильно хочется именно тотал...

      Да ещё забыл у x-plore даже синк встроен и планировщик... Там сложно сказать чего нет в этом приложении, а не что там есть))


      1. Jubilus
        02.11.2026 10:00

        Опять же, это требует установки софта на телефон. Автор статьи решал задачу именно без лишних аппок на мобилке


        1. esasoft
          02.11.2026 10:00

          А "без лишних аппок" на ПК он тоже задачу решил?


      1. esasoft
        02.11.2026 10:00

        Ну, тут вопрос вкуса уже, скорее.

        Когда-то сам использовал только X-Plore, на старых версиях Android. Но со временем перешёл на TC, он просто стал для меня удобнее.


        1. lv333
          02.11.2026 10:00

          С старых андроид? Я вот еще с симбиан...


  1. VlygIO
    02.11.2026 10:00

    И правда, без приложения


  1. checkpoint
    02.11.2026 10:00

    Подскажу дедовский метод который работает для меня уже пару десятков лет:

    1. На ПК расшариваете каталог (файл) через SMB - стандартное решение в Windows, на Linux-е или FreeBSD придется установить Samba.

    2. На Андроид устанавливаете любой File Manager поддерживающий SMB протокол (Total commander, Ghost Commander, их сотни).

    3. Используя File Manager подключаетесь к расшаренному ресурсу по IP или по NetBIOS имени машины и копируете файлы туда-сюда сколько душе угодно.

    4. Профит.

    Работает через глобальную сеть или через VPN, позволяя из дома получить доступ к файлам на машинах в офисе.


    1. ea_oskolkov
      02.11.2026 10:00

      Предложенный Вами метод требует установки дополнительного ПО на смартфон, что далеко не всегда приемлемо (например, зашёл в гости друг/знакомый/коллега/сосед и надо перекинуть какие нибудь файлы на компьютер). Браузер есть у всех. А ещё у кого-то может быть и не Андроид...


      1. OlegChe77 Автор
        02.11.2026 10:00

        если вы это мне, то на телефон ничего ставить не надо, все идет через веб и для айфона тоже рабочий вариант


        1. ea_oskolkov
          02.11.2026 10:00

          Это был ответ для @checkpoint


  1. ivangalin
    02.11.2026 10:00

    Если для себя, то это явный overkill - себе любимому можно поставить любой менеджер файлов и использовать все что угодно, хоть SMB, хоть FTP и т.д.

    Для условных коллег и домашних (далеких от IT) - в принципе норм.

    Для совсем посторонних - не подходит совсем.

    Я для себя последний случай решил простейшим ботом для MAX


  1. Jubilus
    02.11.2026 10:00

    Жаль только, что мобильные браузеры постоянно закручивают гайки с самоподписанными сертификатами


  1. nikopsih
    02.11.2026 10:00

    Это настолько упорото, что я даже зарегистрировался чтобы написать этот комментарий.

    Человек, ты слышал об FTP?

    За 10 секунд можно скачать очень маленькое приложение и телефон становится FTP сервером, в одной сети с ПК ты сразу переходишь прямо в проводнике в память телефона и берешь/выкладываешь все что душе угодно на полной сетевой скорости.