Если вы когда-нибудь мечтали показать начальству «я ничего не писал», но при этом чтобы программа честно работала — вселенная услышала. Появился пакет no-code для Python, который превращает обычный скрипт в файл из одной строки # coding: no и набора невидимых символов, но код при этом по-прежнему запускается и делает всё то же самое. (GitHub)
Давайте разберёмся, как это устроено, зачем вообще нужно и какие у него «родственники» в мире эзотерического кода.
Что такое no-code для Python
no-code — это Python-пакет и команд-лайн утилита, которая: (GitHub)
- берёт ваш обычный
some_code.py; - кодирует его содержимое в последовательность невидимых Unicode-символов;
- добавляет в начало строку:
# coding: no - и на выходе выдаёт файл, который в редакторе выглядит как «пустой» скрипт, но при запуске выполняет исходный код.
Основная идея родом из шуточной философии «No Code»:
лучший безопасный и надёжный код — это отсутствие кода.
Но иногда всё-таки нужно, чтобы программа что-то делала. Вот no-code и закрывает эту дырку — вы распространяете “программу без кода”, которая всё равно работает.
Магия под капотом: невидимые символы и своя «кодировка»
Фокус строится на двух вещах:
- Невидимые символы с нулевой шириной
Используются два Unicode-символа: пробелы нулевой ширины0x200Bи0x200C.- один символ трактуется как
0 - второй — как
1
- один символ трактуется как
- Пользовательская “кодировка”
no
Строка# coding: noговорит интерпретатору Python: «загружай этот файл, считая, что исходник закодирован специальной кодировкойno». Механизмcoding:в первой/второй строке — стандартный способ указать кодировку исходного кода в Python. Пакетno_codeпри установке кладёт вsite-packagesфайлno.pth, который автоматически подгружает модуль и регистрирует кодировкуno. При запуске Python:- видит
# coding: no; - вызывает обработчик этой кодировки;
- тот декодирует невидимые символы обратно в обычный Python-текст;
- и уже этот текст уходит в парсер. (GitHub)
- видит
Снаружи файл как будто из одной строки. Внутри — шпионская переписка из нулей и единиц.
Пример использования: от кода к “ничему” и обратно
Представим простой скрипт:
# some_code.py
print("Hello, world!")
Дальше включаем магию:
no_code some_code.py > hidden.py
Файл hidden.py теперь будет выглядеть в редакторе как:
# coding: no
(внизу на самом деле не пробелы, а невидимые Unicode-символы.)
Но если запустить:
python hidden.py
вы увидите:
Hello, world!
А если захочется вернуть всё как было:
yes_code hidden.py > restored.py
и в restored.py снова окажется нормальный Python-код. (GitHub)
Частичное скрытие кода: не только целый файл
Если хочется спрятать не весь скрипт, а только отдельные куски, в пакете есть две удобные функции: (GitHub)
no_code.nothing()— превращает строку или байты во «величественное Ничего» (последовательность невидимых символов).no_code.something()— делает обратное: из невидимых символов извлекает исходные данные.
Этим можно, например:
- спрятать конфиг или секретную строку прямо в исходнике (для шутки; для реальной безопасности это не решение);
- зашить пасхалку, которую «увидит» только тот, кто знает про no-code;
- усложнить жизнь тем, кто читает код на собеседовании 😈
Команды no_code и yes_code умеют работать и через stdin, так что можно строить такие цепочки:
echo "print(2 + 2)" | no_code | yes_code | python
Как установить no-code
Для работы нужен Python 3.10+. Установка максимально стандартная (рекомендуется виртуальное окружение): (GitHub)
python -m venv .venv source .venv/bin/activate python -m pip install git+https://github.com/lemonyte/no-code
Если при запуске закодированного скрипта вы ловите:
SyntaxError: invalid syntax— проверьте, что первая строка именно# coding: no;SyntaxError: encoding problem: no— это сигнал, что кодировкаnoне зарегистрировалась при старте. В таком случае README проекта подсказывает, как вручную добавитьno.pthвsite-packagesдля вашей установки Python. (GitHub)
Это безопасность или просто прикол?
Важно понимать: no-code — это шутливый, эзотерический инструмент, а не серьёзная защита.
Да, он:
- прячет код от беглого взгляда;
- сбивает с толку человека, который открыл файл и увидел «одну строку»;
- отлично подходит для демо, докладов и CTF-задач.
Но он не:
- защищает от реверса (код легко восстановить
yes_codeили своим декодером); - заменяет нормальную обфускацию или шифрование;
- решает реальные задачи безопасности.
По сути, это интеллектуальный мем в виде Python-пакета. Зато очень в духе разработчиков: «мы взяли шутку и довели её до рабочего инструмента».
Аналоги и вдохновение
У no-code есть яркие «родственники» в других языках: (Telegram)
- Perl
Acme::Bleach— модуль, который превращает код в набор пробелов и табуляций. Открываешь файл — там ничего «нет». Запускаешь — всё работает. - JavaScript
INVISIBLE.js— библиотека, которая кодирует JS в символы нулевой длины (похожая идея с невидимыми символами). - А ещё весь этот подход перекликается с известным тезисом «лучший код — тот, который удалось не писать».
no-code аккуратно вписывается в этот пантеон эзотерических игрушек для разработчиков.
Зачем это может пригодиться на практике
Помимо «поржать и забыть», у инструмента есть несколько вполне жизнеспособных сценариев:
- Демо и доклады — эффектно показать, как Python «исполняет ничего».
- Учебные материалы — иллюстрировать работу кодировок, Unicode и Python-механизма
coding:. - Развлекательные задачки — сделать маленький CTF, где участники должны догадаться, что пустой файл на самом деле не пустой.
- Код-гольф и троллинг друзей — отправить «пустой» файл, который на самом деле запускается.
Но, конечно, использовать это в боевом продакшене — уже отдельный уровень экстремального спорта.
Итог
no-code для Python — отличный пример того, как из шутки рождается работающий инструмент:
- скрипт превращается в одну видимую строку
# coding: noи стену невидимых символов; - при этом программа продолжает выполнять свой исходный код;
- всё строится на кастомной кодировке и Unicode-символах нулевой ширины;
- для любителей эзотерики есть и функции
nothing()/something()для точечного «обнукода».
Если хочется поиграться — загляните в репозиторий проекта на GitHub и обсуждение на Hacker News (ту самую ссылку ты уже приложил). (GitHub)