Smmly

Площадка работает · постим в аккаунт сами, 280 знаков и до четырёх картинок

Постить в X из Codex CLI

Codex публикует в ваш аккаунт X прямо из терминала: 280 знаков, до четырёх картинок, ссылка — вторым сообщением. Пока вы сидите в той же сессии, любой отказ вы прочитаете и перепишете текст за минуту. Разница вылезает в прогоне без человека у экрана: X — единственная ваша площадка, где неудачную отправку нельзя ни повторить, ни проверить, ни отменить.

Что сказать Codex CLI, чтобы пост ушёл в X

в инструкцию агента добавь три строки: в X постим только по ярлыку «твиттер», потолок 280 знаков, ссылку — вторым сообщением

Три строки закрывают три самых частых отказа этой пары. Ярлык здесь не удобство: в поле выбора по площадке у инструмента заведены телеграм, ВК и MAX, и просьба «запости в X» кончается отказом по схеме — не нашим текстом с объяснением, а ошибкой проверки аргументов, после которой агент в терминале начинает молча подбирать варианты. Длину Codex не чувствует вовсе: он собирает пост из файла изменений, а не считает знаки. Ссылка — отдельный разговор, он ниже.

собери пост про релиз из CHANGELOG, уложись в 280 знаков, ссылку на тег дай вторым сообщением и поставь на через десять минут

Codex зовёт smmly_schedule_post и возвращает groupId. Ссылка уезжает отдельным полем: у X второе сообщение — это ответ на ваш же пост и штатный способ дать адрес, не поднимая цену самой публикации. Десять минут — не суеверие, а весь ваш откат: пока пост стоит в очереди, он правится и снимается целиком, а после публикации в X не правится ничего и никогда — правки постфактум у API площадки не существует, снос мы не делаем.

приложи скриншот из ./shots, но если он тяжелее пяти мегабайт — сожми, X такой не примет

Просьба выглядит занудной ровно до первого тяжёлого скриншота. Наша загрузка берёт картинки до 10 МБ и отвечает агенту успехом, валидатор на размер вложения не смотрит вовсе, а предел X — 5 МБ, и упирается в него уже отправщик, когда замысел создан и соседняя телеграмная строка спокойно ушла. Картинок в пост влезает до четырёх; видео в X мы не отправляем вовсе — пост с роликом уедет текстом и картинками.

если проверка отбила пост из-за ссылки — не изобретай обход, остановись и скажи мне

Автономный агент, получив «ссылка в тексте», начинает искать щели: сокращалку, адрес без схемы, пробел посередине. Первые попытки отобьются снова — ссылкой мы считаем и голый домен вроде smmly.ru, — а последняя просто изуродует текст. Разрешение ссылок живёт галочкой на канале в кабинете, и переключить её агент физически не может: инструмента настроек канала среди девяти доступных ему нет. Штатных путей ровно два: второе сообщение или ваша галочка.

Что нужно, чтобы это заработало

  1. Опишите сервер в config.toml

    Два поля в конфиге и одна строка экспорта в профиле оболочки — ключ в config.toml не попадает вовсе, Codex берёт его из переменной окружения. Готовый блок и главная засада (переменная нужна той сессии, откуда запускается codex) — на странице клиента.

    Подключение Codex CLI →
  2. Подключите аккаунт X — кнопкой или своими ключами

    Коротко здесь, подробно — на посадочной X. Простой путь — «Войти через X» в разделе каналов: экран согласия, возврат, аккаунт уже в списке, ключей вы не видите. Второй путь — своё приложение на developer.x.com с правами «Read and write»: четыре ключа со вкладки Keys and tokens вставляются в кабинете. Разница не в удобстве, а в том, чьим приложением идут посты и кому приходит счёт.

    Как подключить X →
  3. Повесьте ярлык, а первые прогоны гоняйте в отложку

    По названию площадки X не выбирается, остаются ярлык и точечный id — в скрипте ярлык устойчивее: переподключили аккаунт, id сменился, ярлык остался. Обычный совет «заведите тестовый канал» здесь дороже обычного: тестовый аккаунт X — это ещё одно приложение и ещё одни ключи. Проще ставить первые посты на несколько минут вперёд и смотреть их в календаре, пока они ещё замысел, а не запись в ленте.

Что доезжает в X

Длина поста
280 знаков — считаем по обычному аккаунту, не по премиуму
Картинки
до 4, каждая до 5 МБ
Видео
не отправляем
Второе сообщение
есть — уходит ответом на ваш же пост
Правка и снос
нет: правки постфактум у API X не существует вовсе
Ключи
своё приложение X или вход кнопкой

🔴 В поле providers X нет: инструмент знает там telegram, vk и max, и providers: ["x"] будет отказом по схеме. Аккаунты X адресуются ЯРЛЫКОМ или channelIds. Остальное упирается в 280 знаков: агент, который пишет пост «как обычно», почти всегда получает отказ валидатора ещё до очереди.

Обо что спотыкается эта пара

Предполётная проверка каналов по X не обещает ничего

Привычка неинтерактивного скрипта — сначала спросить каналы, посмотреть флаг «требует повторного подключения», и только потом постить. Для ВК это спасение, для X — пустой ритуал. Обновления ключей у адаптера X нет вовсе, срок им не проставляется, и ветка, которая метит канал после неудачного обновления пары, для X не выполняется никогда; вебхука площадки мы тоже не держим. Флаг остаётся чистым по устройству, а не потому что всё хорошо. Убивают строку другие отказы, и приходят они в момент отправки: аккаунт заблокирован, упёрлись в потолок постов, X счёл текст повтором. Все три объявлены окончательными — ни одной повторной попытки, и это правильно: такое само не чинится.

Тяжёлая картинка падает не там, где вы её ждёте

Загрузка вложения принимает картинку до 10 МБ и честно отвечает успехом. Проверка, которая отбивает длинный текст ещё до очереди, размер вложения не смотрит совсем. А предел X — 5 МБ, и живёт он в самом отправщике: то есть замысел уже создан, телеграмная строка уже ушла, а строка X начинает падать. Причём не сразу насовсем: этот отказ не окончательный, отправщик добросовестно повторит его ещё дважды — через минуту и через пять, — и только третья неудача превращает строку в ошибку. Для скрипта отсюда две вещи: резать скриншоты до отправки и не принимать «в очереди» через минуту после публикации за хорошую новость.

Ссылка, ради которой всё затевалось, может не уйти молча

Второе сообщение у X — не украшение, а единственный способ дать адрес, не попав под запрет по цене. Отправляется оно отдельным вызовом, ответом на только что опубликованный пост, и здесь спрятана тихая потеря: если сам пост вышел, а ответ не ушёл, мы не роняем из-за этого публикацию — она уже состоялась и оплачена, а повтор создал бы второй пост. В итоге инструмент отвечает успехом, в журнале опубликованный пост, и только под ним пусто. Для релизной заметки исход обидный: сообщение про версию есть, ссылки на неё нет, и в прогоне по расписанию этого не увидит никто. Если ссылка — смысл поста, проверка тут только ваша: открыть его по адресу из статуса и посмотреть, есть ли ответ.

«Ошибка» в статусе не значит, что поста нет

У создания поста в X нет ключа повтора и нет дешёвого способа переспросить «а он создался?». Поэтому неизвестный исход — оборванный ответ, таймаут — мы объявляем окончательным, и строка помечается ошибкой со словами «проверьте ленту, повтор отключён во избежание дубля». Фраза адресована человеку, а в прогоне по расписанию человека нет: ленту агенту читать нечем, среди девяти доступных ему инструментов такого не заведено. Отсюда прямой запрет для скрипта — на упавшей строке X не звать публикацию заново и не возвращать её в очередь флагом повторной попытки: и то и другое отправит пост ещё раз, а он, возможно, уже висит в ленте. Убрать лишний мы не сможем: удаление в X у нас не сделано.

Частые вопросы

Нужно ли скрипту переподключать аккаунт X, как сообщество ВК?

Нет, и механизма такого для X попросту не существует: обновления ключей у адаптера нет, срок им не ставится, а флаг «требует повторного подключения» ставит как раз неудачное обновление. Значит, сам по себе он у X не загорится. Обратная сторона честная: если доступ отзовут на стороне площадки, вы узнаете об этом отказом при отправке, а не заранее. Спрашивать каналы перед постингом всё равно полезно — увидите выключенный канал и свежие ярлыки, — но считать чистый флаг обещанием, что пост уйдёт, нельзя.

Пост отбило проверкой. Можно просто позвать публикацию заново?

Да, и это единственный класс отказов X, после которого повтор безопасен. Проверка — длина, ссылка в тексте, второй тикер через доллар — срабатывает до записи, замысел не создаётся вовсе, ни одна площадка ничего не получает, поэтому исправленный текст отправляется сразу и ничем не рискует. Отказ при отправке устроен наоборот: строка уже есть, пост мог выйти, повторять нельзя. Различать их просто по тому, где вас застало: в ответе самого вызова публикации — безопасный отказ, в статусе поста — опасный.

X отказал словами про повторный твит — это ваша защита или площадки?

Площадки. Наша тихая и короткая: одинаковый вызов в те же каналы в пределах пяти минут вернёт уже созданный замысел и ничего не отправит. Отказ про повтор приходит от самого X, когда тот же текст уходит второй раз, и мы считаем его окончательным — повторять бессмысленно. Скрипту это скорее подарок: перезапуск с той же сводкой чаще всего просто не выйдет в ленту. Полагаться на чужую защиту всё же не стоит — свой ключ повтора надёжнее, он действует бессрочно, и брать его надо из чего-то устойчивого вроде тега релиза.

Кто платит за посты и что значит «приложение X не настроено на сервере»?

Ключей у канала бывает четыре или два. Четыре — своё приложение с developer.x.com: посты идут им, счёт ваш, потолки ваши. Два — вход кнопкой: у нас только токен вашего аккаунта, а приложение общее, наше, и за такие публикации платим мы. Отсюда и эта ошибка — она бывает только на втором пути и означает, что ключей общего приложения нет на сервере. Чинится она не вами и не агентом: напишите нам, а пока переключитесь на свои ключи, если публиковать надо прямо сейчас.

Через сколько после отправки скрипту смотреть статус?

Пост уходит в течение минуты, но окончательное состояние строки наступает позже. Неокончательный отказ площадки отправщик повторяет ещё дважды — через минуту и через пять, — и только третья неудача помечает строку ошибкой. Статус, спрошенный сразу, честно скажет «в очереди», и скрипт, который на этом успокоился, о провале не узнает. Смотрите его через несколько минут и читайте построчно: в одном замысле телеграмная строка могла уйти, а строка X — упасть.

из Codex CLI в другие площадки

Постить в X из других агентов

Конфиг подключения, пути к файлам и грабли самого клиента — на странице постинга из Codex CLI. Лимиты площадки, подключение канала и что умеет сам X — на его посадочной. Общая инструкция по MCP — здесь, поля инструментов и коды ошибок — в технической справке.

Пусть посты ставит агент

7 дней полного доступа за 10 ₽ — подключите каналы, возьмите ключ и проверьте на своих постах.

Попробовать за 10 ₽