ZCode Claim — скрипт, который сам активирует бесплатный тариф GLM и подключает его к 9Router

· 6 мин чтения
automation glm browser-automation reverse-engineering python
📂 Исходный код на GitHub

Набор скриптов на Python с веб-консолью и командной строкой. Выпускает JWT из аккаунта z.ai, активирует бесплатный тариф ZCode Start Plan, создаёт ключ API для coding-плана и подключает его к 9Router как пул провайдера glm.

ZCode Claim — скрипт, который сам активирует бесплатный тариф GLM и подключает его к 9Router

Аккаунт на z.ai у вас уже есть. Бесплатный тариф ZCode на этом аккаунте тоже можно получить, но официальное приложение делает это вручную, по кнопкам. ZCode Claim делает то же самое автоматически: забирает ваш токен или cookies, выпускает по ним JWT, активирует план Start Plan, создаёт ключ API и заводит этот ключ в 9Router как пул провайдера glm. Дальше GLM доступен как обычная модель в любом клиенте, который говорит с 9Router.

Проект открытый, лицензия MIT, написан на Python. В репозитории около 20 звёзд и всего три коммита — это молодая штука, не проверенная временем. Механика простая, но с оговоркой: последний шаг всё равно приходится делать руками. Об этом ниже.

Как устроен путь от токена до модели

Скрипт повторяет то, что делает официальное приложение ZCode, но через HTTP-запросы напрямую и через браузер под управлением скрипта. Разработчик разобрал настольное приложение ZCode версии 3.14.4 (файл AppImage, внутри него распакованный код) и переписал его логику на Python. Это классический реверс-инжиниринг — вскрытие чужой программы, чтобы понять, как она устроена.

Цепочка состоит из пяти шагов:

z.ai token / cookies ──▶ OAuth ──▶ ZCode JWT ──▶ claim Start Plan ──▶ ключ API ──▶ 9Router (glm)
      inject.py          chat.z.ai   zcode.z.ai      billing/claim        zauth.py      connect_9router.py

Автор проверял каждый шаг отдельно. Вот что у него получилось:

Шаг Что проверено
Из токена или cookies выпустить ZCode JWT ✅ работает
Активировать Start Plan (за капчей) ⚠️ нужно ручное решение капчи
Создать ключ API для coding-плана z.ai ✅ работает
Зарегистрировать ключ в пуле glm в 9Router ✅ работает на тестовом 9Router

Что даёт бесплатный тариф Start Plan

Тариф называется Start Plan, во внутреннем виде он записывается как zcode-v3-start-plan. Дневная квота бесплатная и указана в README репозитория:

Модель Бесплатно в сутки
GLM-5.3 3 000 000 токенов
GLM-5.3-Flash 5 000 000 токенов

Здесь важно понимать разницу. Без Start Plan бесплатны только «лёгкие» модели: glm-4.5-flash, glm-4.7-flash и glm-4.6v-flash. Флагманская GLM-5.3 в этом случае не работает и отвечает ошибкой 1113 Insufficient balance. То есть Start Plan — это не «чуть больше бесплатного», а доступ к основной модели.

Консоль в браузере

У проекта есть два способа запуска. Основной — веб-консоль на четыре страницы. Скрипт поднимает локальный Chrome и вставляет консоль прямо в его окно. Никаких терминалов, портов и туннелей. Данные не теряются при перезагрузке: всё лежит в localStorage браузера, а мост дополнительно пишет состояние в папку console_data/ рядом с исходниками.

Dashboard — главная страница. Вставляете токен или cookies, нажимаете «выпустить JWT», дальше активация тарифа и подключение к 9Router. Либо одна кнопка «Run full pipeline», которая делает всю цепочку сразу и показывает прогресс и живой лог.

Accounts — список аккаунтов. Можно добавлять вручную, импортировать из JSON или CSV, перетаскивать файлы, выгружать обратно. Есть кнопка «прогнать пачкой» — весь конвейер сразу по всем аккаунтам в списке.

Capture — страница для капчи. Скрипт открывает вкладку z.ai с проверкой, вы логинитесь и двигаете ползунок мышью, а параметр captchaVerifyParam подхватывается автоматически. Сюда же загружаются файлы с cookies или токеном.

Results — результаты по каждому шагу в виде JSON, проверка статуса тарифа по готовому JWT, а также чтение и запись небольших файлов в рабочей папке.

Запуск

Всё делается одной командой. Браузер запускается сам, если вы не укажете свой:

./run.sh                       # запустить локальный Chrome и вставить консоль
./run.sh --headless            # без окна — нужно для VPS
./run.sh --connect 127.0.0.1:9222   # подключиться к уже запущенному Chrome
./run.sh --cdp "wss://..."     # взять удалённый браузер
./run.sh --port 9222           # другой порт отладки
./run.sh --profile work        # именованный профиль, чтобы сохранить входы

То же самое вручную, если скрипт запускать не хочется:

python src/console_bridge.py                 # сам запустит локальный Chrome
python src/console_bridge.py --headless      # без окна
python src/console_bridge.py --connect 127.0.0.1:9222

Если в системе нет ни Chrome, ни Chromium, run.sh поставит встроенный браузер Playwright командой python -m playwright install chromium. На сервере без графического окна Chromium не хватает системных библиотек — доставляются командой python -m playwright install-deps chromium.

Для тех, кто предпочитает командную строку, есть отдельный скрипт-оркестратор:

# локальный браузер без окна: выпустить JWT, отправить решённую капчу, подключить ключ
python src/zcode_claim.py --headless --email me@x.com --token eyJ... \
    --captcha-param '<param>' --connect --base http://localhost:20128

# указать свой браузер через CDP
python src/zcode_claim.py --cdp "$BU_CDP_WS" --email me@x.com --token eyJ... \
    --captcha-param '<param>' --connect --base http://localhost:20128

# пачка аккаунтов: завести каждый ключ в пул glm
python src/zcode_claim.py --headless --accounts accounts.json \
    --connect --base http://localhost:20128 --out claimed.json

# проверить тариф по готовому JWT
python src/zcode_claim.py --jwt-file zjwt.txt --status

Требуется Python 3.9 или новее и два пакета:

pip install websockets playwright

Капчу придётся решать руками

Это главное ограничение проекта, и автор честно о нём пишет. Запрос активации тарифа закрыт проверкой Aliyun Captcha 2.0. Сервер требует параметр captchaVerifyParam, который подписан и получен прямо внутри страницы z.ai. Автор перебрал обходные пути и ни один не сработал:

  • Сторонний сервис распознавания капч (Solverify) возвращает правильный результат, но в неподписанном виде и без привязки к сессии страницы. Запрос отклоняется с кодом 3007 или 3001.
  • Скрипт, который двигает ползунок мышью, отклоняется молча. Точность не помогает — срабатывает проверка поведения пользователя.

Отсюда вывод: этот шаг в принципе нельзя полностью автоматизировать, и консоль существует в том числе ради него. Вы один раз решаете капчу во вкладке z.ai, дальше параметр подхватывается сам и уходит по конвейеру дальше.

Ответственность за использование

Автор выносит это отдельным разделом, и по делу:

  • Автоматическая активация пробной квоты нарушает условия использования z.ai. Запускайте только на своих аккаунтах и на свой страх.
  • Start Plan даётся один раз на аккаунт. Использованный тариф повторно получить нельзя.
  • На запрос активации стоит ограничение на частоту (HTTP 429). Попытки нужно разносить по времени.

Проект распространяется под лицензией MIT — файл LICENSE, правила участия в CONTRIBUTING.md.

Что внутри репозитория

Состав простой — десяток Python-файлов и веб-консоль:

zcode-claim-9router/
├── src/
│   ├── inject.py          токен или cookies → OAuth → JWT
│   ├── claim.py           капча Aliyun и запрос billing/claim
│   ├── zauth.py           создание ключа API для coding-плана
│   ├── connect_9router.py регистрация ключа в пуле glm
│   ├── zcode_claim.py     оркестратор для командной строки
│   ├── solverify.py       клиент стороннего сервиса распознавания капч
│   ├── console.html       веб-консоль на четыре страницы
│   ├── browser.py         поиск и запуск Chrome, режим без окна
│   └── console_bridge.py  мост CDP и серверная часть консоли
├── examples/              примеры файлов аккаунтов и настроек
├── run.sh                 запуск одной командой
└── docs/STRUCTURE.md      схема всех компонентов

Демонстрация работы консоли — двадцатисекундное видео в docs/demo.mp4. Данные в нём вымышленные, реальных ключей там нет. Полная схема компонентов с описанием каждого модуля лежит в docs/STRUCTURE.md.

Источник: https://github.com/0xgetz/zcode-claim-9router