vegman.dev
Все статьи

Автопостинг блога из Notion в Telegram: что вылезло между «скрипт отработал» и «пост выглядит как пост»

2026-08-23кейс

Автопостинг из Notion в Telegram: почему «скрипт отработал» еще не значит «пост получился»

За один день я довела до боевого состояния автопостинг личного блога: карточка в Notion переходит в Scheduled - и примерно через 15 минут пост сам появляется в Telegram-канале, а скриншоты уезжают в комментарии.

Важно: в момент публикации никакой «магии» нет - это предсказуемый скрипт (обычный Python по расписанию). Все решения про текст я принимаю заранее, на этапе подготовки.

Самое неожиданное в этой истории не то, что «автоматизацию можно собрать за вечер». А то, сколько мелочей вылезает между «скрипт отработал без ошибок» и «пост реально выглядит как пост».

Ниже - 8 граблей, на которые я наступила.

1) «Успешная публикация» может выглядеть как лента мусора

Первый прогон технически удался: обложка, текст, скриншот, два файла (CSV с данными и MD с отчетом). Пять сообщений подряд.

Формально - успех. По факту - в канале получилась свалка.

Вывод: сырые данные в блог не идут вообще. Максимум - скриншоты. А файлы-вложения под постом - это «вот тебе моя рабочая папка», а не контент.

2) Форматирование может потеряться... молча

Текст уходил как простой: ни выделений, ни кода. И еще неприятнее - Notion умудрился превратить упоминание файла repair_schedule.md в «ссылку на сайт» schedule.md.

Если не перечитать глазами, в посте легко оставить живой линк в никуда.

Что пришлось сделать: отдельно разобрать, как Notion хранит разметку/ссылки, и перед отправкой вычищать автоссылки, которые появляются сами.

3) Есть лимиты, которые не покупаются

Я хотела «картинка и длинный текст одним сообщением». И уперлась в жесткое ограничение Telegram:

  • подпись под фото - максимум 1024 символа,
  • обычный текст сообщения - до 4096.

И вот сюрприз: Premium не помогает. Этот лимит задает интерфейс для ботов, а он одинаковый для всех.

Я проверила пробниками (1100, 1647, 2048, 2100) - все отлетает одним и тем же: message caption is too long.

Вывод: нельзя одновременно иметь все картинки и длинный текст в одном сообщении.

  • либо картинки + подпись до 1024,
  • либо одна «шапка» и полноценный текст до 4096.

У меня сработал обход через предпросмотр ссылки: обложка рендерится сверху, а текст остается длинным.

4) Комментарии под постом - отдельная вселенная

Комментарий под постом канала - это не «комментарий к сообщению», а ответ в привязанной группе обсуждений на автоматическую копию поста.

Чтобы положить туда скриншоты, нужен номер той самой копии. Штатный путь - ловить обновления от бота. Но тем же токеном у меня уже занят другой процесс, и «забирать» у него события нельзя.

Пришлось выкручиваться: ставить временную метку в группе и смотреть, какие сообщения появились после нее.

А потом выяснилось, что копия приходит не мгновенно: замер показал задержку 4-6 секунд. Скрипт успевал проверить раньше и видел только мои же тестовые сообщения.

5) Права оказались важнее кода

Даже когда поиск нужного сообщения заработал, бот не мог «ответить на копию» - Telegram возвращал message to be replied not found.

Причина была не в коде, а в настройках группы: в режиме приватности обычный участник не видит чужих сообщений.

Решение - сделать бота администратором.

6) Повысили права - поменяли не одну функцию, а все поле зрения

И тут прилетел побочный эффект, который никто не проектировал.

Через несколько минут под постом появился комментарий от бота - с разбором и вопросами «это идет в Telegram или на сайт?». Автопостинг так не умеет.

Оказалось: ответил другой процесс, который живет на том же токене. После повышения до админа бот стал видеть все в группе - и кто-то принял мой скриншот за обращение.

Урок: повышая права, вы меняете не одну точку, а то, что «видит» вся система, работающая с этими ключами.

7) «Комментарий должен быть от автора, не от бота». А бот так не умеет

Есть требование: комментарии должны выглядеть человеческими - от автора, а не от бота.

Но в интерфейсе для ботов нельзя выбрать отправителя: бот всегда пишет от себя.

Единственный путь - отправлять сообщения как клиент от лица аккаунта. И там тоже были свои мелкие ловушки: ключи привязаны к приложению, а не к конкретному аккаунту; плюс в обсуждениях по умолчанию легко писать «от имени канала», а не от себя - это надо явно переключить.

8) «Мина», которая не взорвалась только потому, что я заметила ее заранее

В базе контента одно и то же значение канала «Telegram» использовалось и для личного блога, и для другого канала. Скрипт отбирал карточки по этому полю.

Одна ошибка статуса - и чужой пост мог улететь не туда.

Мы развели это на два значения до того, как случился реальный инцидент.

Цифры (чтобы было понятно, что это не «ощущения»)

  • ~15 минут - период запуска по расписанию, без вызовов LLM в момент публикации.
  • 1024 vs 4096 - лимит подписи под фото vs лимит текста сообщения.
  • 4-6 секунд - задержка появления копии поста в группе обсуждений.
  • 1569 символов текста (1647 с заголовком) - на этом я и уперлась в лимит подписи.
  • 4 перепубликации, пока формат не стал правильным.

Финальный вывод

Автопубликация ломается не на «API», а на стыках: права, настройки по умолчанию, соседние процессы на тех же ключах и ограничения платформы, которые не видны, пока не упрешься лбом.

«Скрипт отработал без ошибок» и «получилось то, что я хотела» - разные события. Второе всегда нужно проверять глазами.

Применить у себя

Что проверить на практике

Если вы собираете автопубликацию в свой канал, эти пять проверок стоят дешевле, чем четыре перепубликации в живом канале.

  • Опубликуйте первый пост в приватный канал, а не в боевой. У меня такого канала не было - и все правки формата видели подписчики.
  • Отправьте намеренно длинный текст вместе с картинкой и посмотрите, что вернет платформа. Лимит подписи под фото и лимит текста сообщения - разные числа, и премиум-подписка их не меняет.
  • Прогоните текст со всей разметкой сразу: жирный, курсив, код, ссылка и имя файла с точкой. Ломается экранирование именно на них, а ломается молча - постом, который выглядит как ошибка.
  • Посмотрите, кто еще ходит с теми же ключами. Мой бот, добавленный в группу обсуждений, начал отвечать на чужие сообщения: режим приватности на администраторов не действует.
  • Проверьте, от чьего имени уходит комментарий. Владелец канала по умолчанию подписывается каналом, а не собой - и это настройка, а не свойство API.

Как понять, что получилось

Критерий один: после публикации вы не открываете канал, чтобы посмотреть, как встало. Если открываете - формат еще не готов.

Рядом с ним два технических признака:

  • в логе видно, что именно ушло, и ключи в нем замаскированы
  • на испорченный формат публикация падает до отправки, а не после: карточка остается запланированной, и чинить нужно текст, а не живой пост.