Автопостинг из 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.
Как понять, что получилось
Критерий один: после публикации вы не открываете канал, чтобы посмотреть, как встало. Если открываете - формат еще не готов.
Рядом с ним два технических признака:
- в логе видно, что именно ушло, и ключи в нем замаскированы
- на испорченный формат публикация падает до отправки, а не после: карточка остается запланированной, и чинить нужно текст, а не живой пост.