Оформить доступ
Лист 6 · Подписка

Откуда в пустой программе берутся серверы

Их приносит подписка. Подписка — это адрес, по которому программа сама ходит и забирает список серверов, а вместе с ним имя, срок и остаток трафика. Пока адрес не вложен, подключаться некуда: своих серверов у приложения нет, и разработчик прямо пишет, что их не предоставляет.

Ниже — пять способов вложить этот адрес, четыре вида содержимого, которое по нему приходит, и разбор зашифрованной ссылки incy://crypt1/….

Что такое подписка и почему без неё пусто

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

  • Пустой экран после первого запуска — норма, а не сбой. В обоих магазинах приложение описано одинаково: оно работает с конфигурациями и подписками, которые пользователь добавляет сам.
  • Серверов у разработчика нет. В разделе Legal у его же репозитория сказано прямо: VPN-серверы он не предоставляет, за них отвечает владелец подписки. В карточках магазинов та же строка своими словами.
  • Адрес вкладывается пятью способами — ссылкой, QR-кодом, готовой share-строкой, командой схемы incy:// и зашифрованным вариантом той же команды.
  • Список обновляется сам. Как часто — решает не приложение, а тот, кто выдал подписку: он присылает интервал в часах.
  • Вместе с серверами приезжает подпись карточки — имя, описание, срок, счётчик трафика и объявление продавца. Это данные из подписки, а не собственные сообщения программы.

Как устроен ответ подписки

Слева — программа сразу после запуска. Справа — то, что вы видите в списке. Между ними всего один запрос по адресу.

Заголовок ответа сильнее строки в теле: одно и то же имя, присланное дважды, программа возьмёт из заголовка.

Как адрес подписки попадает в программу

Пятью способами — и все они кладут внутрь один и тот же адрес. Разница только в том, чем вы его переносите: буфером обмена, камерой или нажатием на ссылку.

  • Ссылка-URL. Обычный веб-адрес. Программа опрашивает его и перечитывает по расписанию — это и называется автообновлением подписки.
  • QR-код. Для него нужна камера: в манифесте Android разрешение CAMERA объявлено необязательным и заведено ровно под сканирование кода.
  • Share-ссылка. Готовая строка с сервером или набором серверов, которой делятся в переписке.
  • Команда схемы incy://. incy://add/{адрес} добавляет подписку по адресу. incy://import/{данные} принимает данные как есть и сам определяет, что ему дали, — вплоть до сырого конфига WireGuard или AmneziaWG, в том числе завёрнутого в base64.
  • Зашифрованная команда incy://crypt1/… — тот же add, только нечитаемый снаружи. Разбор — ниже на этой странице.

Почему ссылка сервера из переписки открывается сразу в приложении

Потому что на Android программа объявляет себя обработчиком пяти схем сразу: incy, vless, vmess, trojan и ss. Система знает, кому отдавать такие ссылки, и предлагает открыть их именно здесь.

Схема умеет не только импорт: у неё есть и команды управления — connect, open, disconnect, close, toggle, status. Их обычно используют не руками, а из ярлыков и сценариев автоматизации.

Что именно лежит по адресу подписки

Один из четырёх видов содержимого. Программа принимает любой, поэтому «непонятная каша по ссылке» — обычно не поломка.

  • Строки в base64. Ссылки серверов, склеенные в столбик и закодированные. Понимается и адресный вариант кодирования: - читается как +, _ — как /.
  • Открытые ссылки построчно. То же самое, но без кодирования: каждую строку видно глазами.
  • JSON с полным конфигом ядра. Либо список конфигов, либо один целиком, с секциями inbounds и outbounds. Такой конфиг забирается целиком — вместе с балансировщиками, наблюдателем и собственными гео-файлами.
  • Смешанный вид. Часть строк открытая, часть закодированная — в одном и том же ответе.

Зачем это знать обычному человеку

Затем, что подписку можно открыть в браузере и посмотреть своими глазами. Сплошная стена букв и цифр без пробелов — это base64, нормальный ответ. Пустая страница, страница входа или сообщение об ошибке — ответ, из которого программе брать нечего, и вопрос тут к тому, кто выдал ссылку.

И ещё одно: список серверов в теле мог приехать целиком, а появиться в программе не полностью. Это отдельный сюжет, и он про формат самих ссылок — разобран на листе что программа понимает в ссылке на сервер.

Что подписка сообщает приложению, кроме серверов

Левая колонка — то, что видит человек. Правая — как это называется у того, кто подписку выдаёт. Полезно, если вы сверяете свою карточку с обещаниями продавца.

Что видно в приложенииЧем это присланоУточнение
Название подписки в спискеprofile-titleне длиннее 25 символов; если его нет, имя ищется в subscription-name и content-disposition
Строка описания под названиемprofile-descriptionсвободный текст от продавца
Сколько осталось дней и гигабайтsubscription-userinfoчетыре числа: upload, download, total, expire
Сообщение от продавца в карточкеannounce и announce-urlтекст объявления — до 200 символов
Список сам освежаетсяprofile-update-intervalинтервал задаётся в часах
Кнопки поддержки и сайтаsupport-url, support-email, profile-web-page-urlконтакты продавца, а не разработчика программы
Порядок серверов и оформление карточкиsort-order, группа banner-*, premium-urlоформлением распоряжается тот, кто выдал подписку
Правила маршрутов приехали вместе с доступомautorouting и routingразбор — на листе маршрутизация

Откуда программа берёт эти данные и что с ними делает

Из двух мест сразу: из заголовков HTTP-ответа и из строк тела, начинающихся с #. Если одно и то же сказано и там и там, побеждает заголовок.

  • Имя, описание и объявление могут приехать закодированными — с префиксом base64: перед текстом. Это способ провезти кириллицу через заголовок, а не защита.
  • Срок приходит числом. Это секунды Unix. Если число больше 32 000 000 000, оно считается миллисекундами — так подписки на разных панелях не путают единицы.
  • Отдельный баннер показывают не всем. Он появляется только у тех, у кого до конца подписки осталось три дня или меньше.
  • Адрес подписки может смениться сам. У продавца есть флаг «нужна синхронизация» и поле с новым доменом: программа перепишет адрес подписки у себя, ничего не спрашивая.

Сообщение «ключ перенесли на другой сервер» — это не ошибка программы

Это объявление продавца, доставленное через подписку тем самым полем announce. Программа только показывает присланный текст. По той же причине не стоит нести такие сообщения разработчику приложения: он их не писал.

Дословные строки, которые люди принимают за ошибки приложения, собраны отдельно — лист про ошибки.

Что означает ссылка incy://crypt1/…

Это обычная команда «добавь подписку», спрятанная от автоматики. Внутри — шифрование AES-256-GCM, снаружи — кодирование base64url, и получившаяся строка не похожа на адрес VPN-подписки. Смысл ровно один: чтобы ссылку не опознали сканеры и модерация мессенджера.

  • Что внутри. После расшифровки это короткий JSON: сам адрес url, номер версии v (сейчас 1) и необязательное поле n — имя провайдера, которое программа покажет в окне подтверждения импорта.
  • Кто такие ссылки собирает. Продавец доступа. Есть страница incy.cc/encrypt, которая делает это прямо в браузере средствами Web Crypto API, и открытый кодировщик incy-link-encoder под лицензией MIT с портом на PHP.
  • Что будет, если ключ утечёт. Обещана версия crypt2/, а старые ссылки crypt1/ продолжат открываться: старые схемы из декодера не убирают.

crypt1 — это маскировка, а не защита

Так это называет сама документация разработчика: обфускация, а не криптография. Ключ шифрования один на всех, зашит в приложениях и вдобавок опубликован в npm-пакете @incy/link-encoder; извлечение ключа из сборки документация оценивает примерно в час работы.

Практический вывод: crypt1 прячет ссылку от автоматических фильтров, но не от человека, который решит её прочитать. Считать такую ссылку секретной и пересылать её кому попало — ошибка.

Программа на месте, а вкладывать нечего

Без подписки приложение не делает ничего: ни один пункт этой страницы не сработает, потому что подключаться ему некуда. Заодно рабочая подписка — самый быстрый способ разделить два разных вопроса: вложите её в ту же программу, и если список серверов появился и подключение пошло, приложение исправно, а разбираться надо было с прежней ссылкой.

Оформить доступ

Частые вопросы про подписку

Программа пустая — я что-то сделал не так?

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

Ключ и подписка — это одно и то же?

Обычно да: «ключом» продавцы называют ту самую ссылку. Формально приложение различает две вещи — адрес подписки, который оно перечитывает по расписанию, и одиночную ссылку сервера, которая просто добавляется в список и сама не обновляется.

Обязательно ли вводить длинный адрес руками?

Нет. Тот же адрес переносится QR-кодом через камеру или ссылкой incy://add/…, по которой достаточно нажать. Ручной ввод — самый неудобный из пяти способов.

Кто решает, как часто обновляется список серверов?

Тот, кто выдал подписку: интервал приезжает в её заголовках и считается в часах. Приложение этот интервал исполняет, а не выбирает.

Можно ли по подписке передать сразу весь конфиг, а не список серверов?

Да. В теле подписки принимается полный конфиг ядра в JSON — с секциями inbounds и outbounds, балансировщиками, наблюдателем и своими гео-файлами. Он импортируется целиком.

Сколько устройств можно подключить по одной подписке?

Это условие продавца, а не программы. В документации разработчика описан только тарифный лимит для провайдера; правила «одна ссылка — столько-то устройств» приложение не устанавливает. Разбор — на листе про лимит устройств.