Оглавление

Если вы когда-нибудь мечтали показать начальству «я ничего не писал», но при этом чтобы программа честно работала — вселенная услышала. Появился пакет no-code для Python, который превращает обычный скрипт в файл из одной строки # coding: no и набора невидимых символов, но код при этом по-прежнему запускается и делает всё то же самое. (GitHub)

Давайте разберёмся, как это устроено, зачем вообще нужно и какие у него «родственники» в мире эзотерического кода.


Что такое no-code для Python

no-code — это Python-пакет и команд-лайн утилита, которая: (GitHub)

  • берёт ваш обычный some_code.py;
  • кодирует его содержимое в последовательность невидимых Unicode-символов;
  • добавляет в начало строку: # coding: no
  • и на выходе выдаёт файл, который в редакторе выглядит как «пустой» скрипт, но при запуске выполняет исходный код.

Основная идея родом из шуточной философии «No Code»:

лучший безопасный и надёжный код — это отсутствие кода.

Но иногда всё-таки нужно, чтобы программа что-то делала. Вот no-code и закрывает эту дырку — вы распространяете “программу без кода”, которая всё равно работает.


Магия под капотом: невидимые символы и своя «кодировка»

Фокус строится на двух вещах:

  1. Невидимые символы с нулевой шириной
    Используются два Unicode-символа: пробелы нулевой ширины 0x200B и 0x200C.
    • один символ трактуется как 0
    • второй — как 1
    Тело скрипта превращается в двоичную строку и записывается как длинная последовательность этих символов. В редакторе вы их не видите — файл выглядит почти пустым. (opennet.ru)
  2. Пользовательская “кодировка” 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)