Справочник: кросспостинг
Что здесь. Владелец сайта указывает свой Telegram-канал, и каждая новая страница после публикации сама появляется в нём постом. В дашборде это «Настройки → Кросспостинг». Каждая ручка, поле и код отказа на этой странице сверены с кодом и прогнаны вызовом на тестовом сайте.
Адреса. https://onpress.pro/api/v2/site/{siteId}/crosspost/…, права — администратор сайта или суперадмин сети. В примерах op_XXXX — ваш токен, SITE_ID — внешний идентификатор сайта (поле site_id ответа GET /sites/{id}). Как выбирается сайт и в какой форме приходят отказы — доступ.
Как подключить. Добавьте бота @onpress_tg_bot администратором канала с правом публикации сообщений, укажите канал (PUT /crosspost/telegram с channel) и включите отправку (enabled: true). Платформа сразу проверяет, видит ли бот канал и может ли в нём публиковать.
Как выглядит пост
Пост собирается из самой страницы, без ИИ, одним сообщением. Сверху картинка: превью страницы, а если в начале статьи есть ещё картинки — альбом до четырёх. Ниже жирный заголовок и первые абзацы тела до первого подзаголовка, не больше трёх, с сохранённым жирным, курсивом, зачёркнутым и кодом. Последнее предложение (у длинного — его хвост) само становится ссылкой на страницу; кнопок под постом нет.
С картинкой текст идёт подписью к ней и укладывается в 1000 знаков, без картинки — до 1600. Текст режется по границе абзаца, внутри абзаца — по границе предложения, слово посередине не рвётся. Страница из одних вставок без абзацев получает текстом своё SEO-описание.
Когда пост уходит
Пост уходит один раз — после первой публикации страницы, примерно через минуту, когда страница уже открывается по адресу. Правки опубликованной страницы второго поста не дают. Отложенная страница уходит, когда выходит по расписанию.
Не уходят: страницы, опубликованные до включения кросспостинга; страницы вне выбранных разделов; главная и служебные страницы (политика, контакты, 404 и подобные); заметки, перенесённые из Telegram-канала (иначе пост вернулся бы в канал-источник); закрытые от индексации и под паролем; все страницы закрытого сайта; страницы с датой публикации старше трёх дней — так перенос архива не заваливает канал. Сверх 5 постов в час и 30 в сутки страницы пропускаются — так массовая публикация не превращается в поток постов. Пропущенные по закрытию от индексации, паролю, закрытому сайту, дате и лимиту видны в журнале, их можно отправить вручную.
Ошибка Telegram публикацию не ломает: страница выходит на сайте, а ошибка видна в журнале и в проверке канала. Если бота убрали из канала или лишили прав, отправка останавливается до новой проверки.
Канал и настройки
| Пункт | Ручка | Тело |
|---|---|---|
| Состояние | GET /crosspost | — |
| Канал, включение, разделы | PUT /crosspost/telegram | {"channel": "@channel", "enabled": true, "sections": ["/news/"]} |
| Проверить канал | POST /crosspost/telegram/check | — |
| Тестовый пост | POST /crosspost/telegram/test | {"page": 123} |
| Отключить канал | DELETE /crosspost/telegram | — |
Состояние
Ответ — канал, проверка, включено ли, разделы, верхние разделы сайта для выбора и лимиты:
{
"success": true,
"site_id": "SITE_ID",
"telegram": {
"bot": "@onpress_tg_bot",
"channel": "@channel",
"chat": { "id": "-1001234567890", "title": "Мой канал", "username": "channel", "url": "https://t.me/channel" },
"enabled": true,
"active": true,
"sections": ["/news/"],
"check": { "ok": true, "code": "ok", "message": "", "checked_at": "2026-10-09T07:44:33Z" },
"enabled_at": "2026-10-09T07:45:35Z"
},
"section_options": [
{ "path": "/news/", "title": "Новости", "pages": 18 }
],
"limits": { "per_hour": 5, "per_day": 30, "max_age_days": 3 }
}
active — посты действительно уходят: отправка включена и последняя проверка канала успешна. check — null, пока канал не проверялся. section_options — опубликованные страницы первого уровня, у которых есть опубликованные дочерние, по числу дочерних.
curl -s "https://onpress.pro/api/v2/site/SITE_ID/crosspost" -H "Authorization: Bearer op_XXXX"
Канал, включение, разделы
Все поля необязательны, меняется только переданное. Ответ — то же, что у состояния.
| Поле | Значения |
|---|---|
channel | @имя, ссылка https://t.me/имя или числовой ID закрытого канала (-100…). Новый канал проверяется сразу |
enabled | true — новые страницы уходят в канал, false — нет |
sections | пути разделов: ["/news/"]. Пустой массив — все страницы |
Разделы. Пост уходит, только если адрес страницы начинается с одного из путей. Путь можно дать как news, /news/ или полным адресом — он приводится к виду /news/. На многоязычном сайте раздел пишется один раз: /news/ подходит и к /news/…, и к /en/news/…. До 20 путей, корень / разделом не считается.
Включение. Включить можно только канал, который прошёл проверку: если проверка не прошла, ответ 409 channel_not_ready с полем check. При включении всё уже опубликованное помечается и в канал не уходит.
Результат проверки канала приходит в telegram.check, ошибка Telegram запрос не роняет: канал сохраняется, check.ok — false, check.code — причина.
check.code | Что значит |
|---|---|
ok | бот может публиковать |
channel_not_found | канал не найден или бот в нём не состоит |
bot_not_member | бот не добавлен в канал |
bot_kicked | бота удалили из канала |
bot_not_admin | бот не администратор канала |
no_post_right | у бота нет права публиковать сообщения |
not_a_channel | это группа или чат, а не канал |
telegram_unreachable, rate_limited, telegram_error | Telegram не ответил, ограничил отправку или вернул другую ошибку |
Отказы запроса: 400 channel_required (канал не передан и ещё не подключён), 400 invite_link (ссылка-приглашение вида t.me/+… канал не называет), 400 invalid_channel, 400 invalid_sections, 400 invalid_enabled, 400 unknown_field.
curl -s -X PUT "https://onpress.pro/api/v2/site/SITE_ID/crosspost/telegram" \
-H "Authorization: Bearer op_XXXX" -H "Content-Type: application/json" \
-d '{"channel": "@channel", "enabled": true, "sections": ["/news/"]}'
Проверить канал
Повторяет проверку и сохраняет результат; ответ — состояние. Нужна, когда бота добавили или вернули права после ошибки: успешная проверка снова запускает отправку. Канал не подключён — 404 not_connected.
Тестовый пост
Отправляет в канал страницу в том же виде, в каком она ушла бы сама. page — id или адрес страницы; без него берётся последняя опубликованная. Страница отправленной не помечается, правила отбора не применяются. Запись появляется в журнале с kind: "test".
{ "success": true, "site_id": "SITE_ID", "id": 135, "page_id": 7148, "status": "sent", "message_id": 175, "message_url": "https://t.me/channel/175", "photo": true, "images": 3 }
images — сколько картинок ушло: 0 — пост текстом, 1 — с картинкой, больше — альбом. Ошибка Telegram приходит в том же ответе: status: "failed", code и error. Отказы: 404 not_connected, 409 channel_not_ready, 404 no_pages, 409 page_not_published.
Отключить канал
Снимает канал и останавливает отправку. Журнал остаётся.
Журнал отправок
| Пункт | Ручка | Тело |
|---|---|---|
| Журнал | GET /crosspost/log | ?limit=30&before=ID |
| Отправить вручную | POST /crosspost/log/{id}/send | — |
Журнал
Последние записи, новые сверху: отправленные, упавшие и пропущенные. Страницы, которые в канал не идут по устройству (опубликованы до включения, вне разделов, служебные, из Telegram), в журнал не выводятся. limit — до 100, по умолчанию 30; следующая порция — before из поля next.
{
"success": true,
"site_id": "SITE_ID",
"items": [
{
"id": 141,
"page_id": 7152,
"kind": "auto",
"status": "sent",
"reason": null,
"title": "Новая статья",
"url": "https://example.com/news/new-article/",
"message_id": 180,
"message_url": "https://t.me/channel/180",
"error": null,
"attempts": 1,
"created_at": "2026-10-09T08:04:17Z",
"updated_at": "2026-10-09T08:04:19Z"
}
],
"next": null
}
kind — auto (после публикации), test (тестовый пост), manual (отправлен вручную). status — pending, sent, failed, skipped. У skipped в reason причина: noindex, password, site_closed, old_date, limit. У failed в reason код ошибки Telegram, в error её текст. message_url у закрытого канала ведёт по номеру канала и открывается только его участникам.
Отправить вручную
Отправляет страницу из записи со статусом failed или skipped сейчас, без правил отбора и лимита. Ответ — как у тестового поста. Отказы: 404 log_row_not_found, 409 not_resendable (запись отправлена или это тестовый пост), 409 page_not_published, 409 in_progress, 404 not_connected, 409 channel_not_ready.