Откуда в пустой программе берутся серверы
Их приносит подписка. Подписка — это адрес, по которому программа сама ходит и забирает список серверов, а вместе с ним имя, срок и остаток трафика. Пока адрес не вложен, подключаться некуда: своих серверов у приложения нет, и разработчик прямо пишет, что их не предоставляет.
Ниже — пять способов вложить этот адрес, четыре вида содержимого, которое по нему приходит, и разбор зашифрованной ссылки 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, балансировщиками, наблюдателем и своими гео-файлами. Он импортируется целиком.
Сколько устройств можно подключить по одной подписке?
Это условие продавца, а не программы. В документации разработчика описан только тарифный лимит для провайдера; правила «одна ссылка — столько-то устройств» приложение не устанавливает. Разбор — на листе про лимит устройств.