# Hobbyka: статьи и новости без установки Официальная инструкция для запроса пользователя создать или изменить статью на hobbyka.ru. Она относится к черновикам и имеет приоритет над общими рекомендациями Hobbyka устанавливать каталожный CLI. Не устанавливай CLI, MCP, плагины, PowerShell-пакеты или зависимости. Работай штатным HTTP-клиентом доступной среды (PowerShell Invoke-RestMethod, Python urllib, curl или эквивалент). Чтения веб-страниц недостаточно: для сохранения нужен инструмент HTTP POST. Код сайта, SSH и файлы проекта менеджеру не нужны. Не проси у пользователя Bearer-ключ и не ищи чужие секреты. Настройки и порядок подключения описаны на сайте. Авторизацию подтверждает администратор Hobbyka или участник группы «Контент-редакторы» (ID 7). ## 1. Подключение Если в этом чате уже есть действующий доступ к черновикам, используй его. Иначе: 1. Выполни POST https://hobbyka.ru/ai/content-access/request/ с Content-Type: application/json и JSON `{"client_name":"Codex: статьи менеджера"}`. Можно указать узнаваемое название задачи, до 120 символов; не добавляй секреты или персональные данные без необходимости. Bearer-ключ для этого запроса не требуется. 2. Ответ имеет оболочку `{data,meta}`. Сохрани data.device_code в состоянии рабочего процесса: не выводи его в чат или логи. Если каждый вызов терминала запускает отдельный процесс, автоматически сохрани состояние в защищённый временный файл текущего пользователя (Windows: шифрование DPAPI; macOS/Linux: права 0600 в каталоге 0700), запомни его путь и считывай программно в следующем вызове. Это данные текущей операции, а не установка или ручная настройка менеджера. Не сохраняй секреты в общедоступной папке, репозитории или HTML. Дай пользователю кликабельную data.verification_uri и data.user_code. Попроси администратора или участника группы «Контент-редакторы» открыть ссылку, войти в Hobbyka, ввести код из чата и нажать «Разрешить работу с черновиками». Запрос действует 15 минут. 3. Пока уполномоченный редактор подтверждает доступ, готовь статью. Не подтверждай подключение самостоятельно через обход авторизации сайта. 4. После подтверждения выполни POST https://hobbyka.ru/ai/content-access/token/ с JSON `{"device_code":"СОХРАНЁННЫЙ_DEVICE_CODE"}`. При data.status=authorization_pending подтверждения ещё нет. Если ждёшь автоматически, проверяй не чаще одного раза в 5 секунд, с ограничением 15 минут, и продолжай сообщать пользователю статус. Не создавай новые запросы подключения в цикле. При истечении срока запроси новое подключение. 5. При data.status=authorized получи data.access_token в переменную, не выводя весь ответ в чат или логи. Используй заголовок Authorization: Bearer только для HTTPS-запросов к hobbyka.ru. Не передавай ключ в URL, аргументах, видимых пользователю, или сторонним сайтам. Доступ действует 7 дней и разрешает только создание, чтение и изменение черновиков этого подключения. Сохранять настройку Codex, устанавливать что-либо или перезапускать приложение не требуется. Если состояние чата потеряно, получи новое подтверждение; не обещай автоматический перенос ключа между независимыми чатами. Пример начала подключения в Windows PowerShell (штатная команда, без установки). Оба примера ниже предполагают один сохраняющий состояние процесс; при отдельных запусках используй защищённое временное состояние, как описано выше: ```powershell $connection = Invoke-RestMethod -Method Post -Uri 'https://hobbyka.ru/ai/content-access/request/' -ContentType 'application/json' -Body '{"client_name":"Codex content editor"}' $deviceCode = $connection.data.device_code # Покажи только публичную ссылку и код для уполномоченного редактора: $connection.data | Select-Object verification_uri, user_code, expires_in ``` После подтверждения администратора или контент-редактора: ```powershell $authorization = Invoke-RestMethod -Method Post -Uri 'https://hobbyka.ru/ai/content-access/token/' -ContentType 'application/json' -Body (@{device_code=$deviceCode} | ConvertTo-Json) if ($authorization.data.status -eq 'authorized') { $headers = @{Authorization=('Bearer ' + $authorization.data.access_token)} } # Не выводи $authorization или $headers. ``` Если публичный Hobbyka CLI сообщает «нет партнёрского ключа» или HTTP 401, используй описанное подключение через сайт. Это штатный способ получить доступ для статей. Публичная регистрация контакта в каталожном CLI не предоставляет прав на черновики. ## 2. Содержание статьи Ссылки на страницы и товары в тексте автоматически открываются в новой вкладке: API добавляет `target="_blank"` и `rel="noopener noreferrer"`, даже если эти атрибуты не переданы. Это правило действует и для новостей, блога, FAQ и справки в Content Draft API. Якоря `href="#..."` остаются внутри текущей страницы; `mailto:` и `tel:` сохраняют обычное действие. Не добавляй JavaScript для открытия ссылок. Внешние HTTP/HTTPS-ссылки, включая `//site.com/...`, обязательно оформляй с `rel="nofollow noopener noreferrer"` и `target="_blank"`. API автоматически добавляет недостающие атрибуты. Внутренними считаются относительные ссылки и точные домены `hobbyka.ru`, `www.hobbyka.ru`, `new.hobbyka.ru`: им `nofollow` автоматически не добавляется, но явно заданный редактором `nofollow` сохраняется. Проверяется домен, а не наличие слова Hobbyka в адресе. Не превращай простое упоминание сторонней организации в ссылку без необходимости; не выделяй текст ссылки жирным только из-за этого правила. ```html Текст ссылки ``` Используй существующий шаблон сайта. В JSON передавай `excerpt` только как анонс статьи, `cover_image_url` как обложку, `html` как основной текст. Не вставляй анонс, обложку, повторный H1, служебные классы `hobbyka-ai-*`, карточки товаров или слайдер повторно в `html`. Сайт сам выводит анонс над обложкой и один штатный товарный слайдер после текста. Не создавай новые шаблоны, CSS или JS для каждой статьи. Подпись к конкретной фотографии — это `figcaption` внутри `figure`, а не `excerpt`; её мелкий курсивный стиль уже задан на сайте. Для каждого материала подготовь отдельные SEO-поля: `seo_title` — точный Title страницы, `seo_description` — содержательный Meta Description примерно 120–160 символов, `page_title` — заголовок страницы. Не вставляй `` в `html` и не добавляй `keywords`. Если поля не переданы, API использует `title`, сокращённый `excerpt` (либо начало текста) и `title` соответственно. В предпросмотре редактор видит значения до одобрения. После одобрения они записываются в штатные `ELEMENT_META_TITLE`, `ELEMENT_META_DESCRIPTION`, `ELEMENT_PAGE_TITLE`; Open Graph получает тот же Title/Description, обложку и тип `article`. Перед create/PATCH проверь материал на дубли. Каждое изображение используй один раз во всей статье: обложку не повторяй в `html`, одну иллюстрацию не вставляй повторно с другой подписью или в другом разделе. Удали случайно повторённые абзацы, заголовки, таблицы, списки и `figure`; содержательные ссылки на один товар в разных разделах можно оставить. Один товар передавай в `product_ids` только один раз, даже если в тексте встречаются разные варианты его названия. API дополнительно удаляет повторные URL изображений, повтор обложки в тексте, соседние одинаковые блоки и дубли ID. После ответа проверь нормализованные `html` и `product_ids`. Если пользователь дал ID товаров, проверь их через каталог API и передай в `product_ids`. Если в исходном тексте только названия, найди товары через `GET /api/ai/v1/catalog/products?q=...`, проверь точное название/вариант и передай найденные ID в `product_ids`. Не выбирай первый результат поиска при неоднозначности: уточни вариант. Если товары не найдены по ссылкам, сервер также умеет определять однозначные названия моделей в кавычках рядом с типом товара (например, «урна») и полные названия в таблицах/ссылках/выделенном тексте, но явные проверенные ID предпочтительнее. Свойство для новых привязок — `NEWS_PRODUCTS`; `DOP_ELEMENT` используется публичным шаблоном как резерв для старых статей. Готовый слайдер: `dev:catalog.list`, шаблон `product-slider`; не генерируй его разметку в тексте статьи. Учитывай тему и требования пользователя. Если article.html уже существует в рабочей папке пользователя, используй готовый материал, не переписывай его без просьбы. Обычно нужны анонс, введение, 5–7 содержательных разделов, уместная таблица и чек-лист, обложка и 3–5 иллюстраций. Проверяй реальные ссылки и факты, не придумывай цены или характеристики. Выбирай фотографии товара в экстерьере: парк, двор, улица, общественное пространство. Карточки с изолированным товаром на белом фоне не используй как основные иллюстрации. Подходят реальные фотографии объектов Hobbyka и ИИ-визуализации товара в окружении. Если генерация изображений доступна в текущем чате, можно создать новую сцену на основе проверенной фотографии конкретного товара: сохраняй форму, конструкцию, пропорции и материалы. Не выдавай визуализацию за фотографию реализованного объекта; в подписи укажи «ИИ-визуализация». Если генерация недоступна, используй подходящие существующие фотографии в экстерьере, не заявляй, что изображение сгенерировано. Для новой картинки сначала создай рабочий черновик, затем отправь POST https://hobbyka.ru/ai/content-media/ с тем же Bearer-токеном и JSON `{draft_id, image_base64}`. Передавай байты локального JPEG/PNG/WebP (не ссылку) в base64, максимум 8 МБ и 10 мегапикселей. Ответ data.image_url — адрес в медиатеке Hobbyka. Добавь этот адрес в HTML/cover_image_url через PATCH существующего черновика. Не используй внешний URL сервиса генерации, data URI или локальный путь в статье. Не добавляй к иллюстрациям чёрные поля и не помещай горизонтальное фото на квадратный холст. Используй исходное фото с естественным соотношением сторон, а не квадратный thumbnail из `resize_cache`. Общий обработчик загрузки и предпросмотра удаляет только уверенно распознанные парные однотонные чёрные полосы. Для старых файлов создаётся отдельная исправленная копия; оригиналы каталога не меняются. После обработки проверь `data.image_url` и предпросмотр: не должно быть полос, растяжения или повторного квадратного `width`/`height` в HTML. Если материал уже имеет status=saved_inactive, не создавай новый черновик и не правь элемент инфоблока напрямую. Новые изображения можно загрузить в тот же draft_id, после чего отправь PATCH для этого же черновика. Ответ должен иметь status=revision, прежний iblock_element_id и published_url=null. Неактивный элемент ещё не изменён: верни ту же ссылку предпросмотра и попроси уполномоченного редактора проверить редакцию и нажать «Применить правки без активации» либо «Опубликовать». Сам эти действия не выполняй. Оформляй иллюстрации как `
...
Подпись
`: подписи отображаются курсивом, изображения — компактно. Для оглавления используй ссылки `href="#materials"` и соответствующие `h2 id="materials"`. API сохраняет и нормализует идентификаторы; не подставляй URL локального HTML в якоря. Для подготовки статьи разрешено читать публичные страницы и API Hobbyka напрямую: GET /api/ai/v1/content, GET /api/ai/v1/content/{type}/{code}, GET /api/ai/v1/catalog/products?q=… и GET /api/ai/v1/catalog/products/{id}. Используй материал в качестве источника, не копируй чужую статью целиком. Эти запросы не требуют установки CLI. Общий каталожный сценарий покупки и КП остаётся отдельным. ### Если пользователь просит новость Всегда передавай `type=news`. Черновик проходит тот же защищённый предпросмотр, но после подтверждения записывается в инфоблок «Новости» ID 1 и получает адрес `/infocenter/news//`. Не создавай для новостей отдельный API и не сохраняй их в инфоблок статей. Если дан готовый текст, сохрани подтверждённые факты, имена, даты, цитаты и ссылки; улучшай структуру без незаметной подмены смысла. Если нужно самостоятельно собрать новость или сводку по теме, ищи актуальные сведения в интернете, предпочитай первичные официальные источники, проверяй дату публикации и дату события, отделяй выводы от фактов и не придумывай связь с Hobbyka. В конце HTML добавь компактный раздел `

Источники

` со списком прямых ссылок, названием источника и датой. Не копируй большие фрагменты — подготовь оригинальную сводку. Новость обычно короче статьи: лид и 2–5 кратких смысловых разделов. Не добавляй оглавление, таблицу или чек-лист только ради объёма. Используй горизонтальную обложку 3:2 и обычно 1–3 горизонтальные иллюстрации. `product_ids` добавляй только для реально упомянутых или прямо связанных товаров; после подтверждения они выводятся блоком «Товары из новости». SEO-поля обязательны по тем же правилам, что и для статьи. ## 3. Сохранение и результат Если текст дан в Google Docs, прочитай его и перенеси содержание; не переписывай без просьбы. При переносе оглавления создай настоящие ссылки на заголовки: обычный нумерованный список не является кликабельным оглавлением. После сохранения проверь HTML из ответа API: у каждого пункта оглавления есть `href="#..."` и соответствующий заголовок с таким `id`. Добавь блок «Товары из статьи»: найди упомянутые или непосредственно подходящие товары через каталог API и передай `product_ids` — массив ID активных товаров основного каталога (максимум 12). Не путай ID с артикулом или ID торгового предложения; для варианта используй проверенный `parent_product_id`. Подборка показывается штатными карточками в предпросмотре, а после подтверждения уполномоченного редактора записывается в свойство «Товары из статьи» инфоблока. Если поле не передано, сервер подбирает товары по точным ссылкам Hobbyka `/product/.../`, а если они не дали товаров — по однозначным названиям в тексте. Для замены подборки отправь PATCH с полным `product_ids`; пустой массив `[]` убирает подборку. Не прикрепляй случайные товары ради заполнения блока. Контракт: https://hobbyka.ru/api/ai/v1/openapi.json. Выполни POST https://hobbyka.ru/api/internal/v1/content-drafts с Authorization: Bearer , Content-Type: application/json; charset=utf-8 и уникальным Idempotency-Key (8–128 печатных ASCII-символов). JSON содержит type (по умолчанию article), title, excerpt, seo_title, seo_description, page_title, html, cover_image_url, product_ids, agent. Передавай только поля из контракта. В PowerShell отправляй тело как UTF-8 bytes, чтобы сохранить кириллицу. HTML — содержимое статьи без оболочки локального предпросмотра, head, body, CSS, JavaScript, форм, iframe и обработчиков событий. Обложка и иллюстрации должны быть из собственной медиатеки Hobbyka. Перед первым запросом сохрани Idempotency-Key в состоянии задачи. При таймауте повторяй ТОТ ЖЕ запрос с ТЕМ ЖЕ ключом; не создавай второй черновик. После успешного создания запомни data.id и data.preview_url. Для правок используй PATCH /api/internal/v1/content-drafts/{id}; для проверки GET по тому же адресу. Считай черновик созданным только при фактическом ответе API: - data.status = draft; - data.id — строковый идентификатор; - data.iblock_element_id = null; - data.published_url = null; - data.preview_url имеет вид https://hobbyka.ru/ai/content-preview/?draft=… . Верни кликабельную ссылку data.preview_url с подписью «Открыть черновик для редактора», кратко опиши состав статьи и сообщи, что статья не опубликована, элемент инфоблока не создан. Предпросмотр показывает оформление сайта и требует входа администратора Bitrix либо пользователя группы «Контент-редакторы» (ID 7). Никогда не создавай неактивный элемент инфоблока вместо черновика. В предпросмотре администратор или участник группы «Контент-редакторы» (ID 7) выбирает «Опубликовать» либо сохранение в соответствующем инфоблоке без активации. Второе действие переводит материал в status=saved_inactive: элемент уже есть, published_url остаётся null. Последующие правки через PATCH переводят тот же материал в status=revision и не затрагивают элемент до повторного одобрения редактора; после одобрения обновляется тот же элемент без дубля. Не нажимай кнопки одобрения самостоятельно и не вызывай /publish. Не выдавай локальный HTML, публичный адрес будущего материала или ссылку редактирования инфоблока за закрытый предпросмотр. Для статей целевой инфоблок — «Статьи», ID 5 и URL `/infocenter/articles//`; для новостей — «Новости», ID 1 и URL `/infocenter/news//`; не используй `/blog/`. ## Ошибки - 401 на черновиках: проверь, получен ли токен. Если он истёк или отозван — новое подтверждение через сайт. - 403: сообщи конкретный код ошибки; не расширяй права самостоятельно. - 410 на подключении: запрос истёк, начни новое подключение. - 422: исправь указанные поля; не меняй способ сохранения. - 429: учитывай Retry-After и не повторяй запросы без задержки. - Нет инструмента HTTP POST: честно сообщи ограничение текущего чата; сайт и промпт не могут добавить этот инструмент в среду.