← Все статьи

Stories Sync: как сторис из Telegram автоматически попадают в Instagram и VK

Несколько недель подряд я делал одно и то же. Снимал видео на Бали — виллу, стройку, закат над рисовыми полями — выкладывал в Telegram Stories, потом открывал Instagram, загружал то же самое, потом ВКонтакте, снова загружал. Одно видео, три платформы, три раза одинаковые действия. Каждый раз по три-четыре минуты. Умножаем на семь дней в неделю — вот тебе полчаса в неделю, которые я тратил на чистую механику.

Это ровно тот тип задачи, который я ненавижу. Не потому что сложно. А потому что мозг не нужен. Нажать, подождать, нажать, подождать. Робота работа — и при этом всё время я.

5 апреля я это починил. Называется Stories Sync. Суть простая: снимаю сторис в Telegram, через минуту она уже в Instagram и VK. Без моего участия. Вообще.

Откуда вообще задача

Я управляю 16 виллами на Бали через систему из ботов. Продажи, бронирования, финансы, контент — всё идёт через автоматизацию. Но Stories долго оставались вне системы. Казалось, что это мелочь — ну загружу руками, делов-то. Пока не начал считать.

Каждый день я снимаю что-то интересное. Стройка новой виллы. Вид с крыши Changgu на поля. Беседа с прорабом. Гость, который приехал второй раз подряд. Это живой контент, который работает для аудитории лучше любого постановочного. И каждый раз я тратил на распространение этого контента столько же времени, сколько на съёмку.

Стало ясно: нужен сервис, который следит за Telegram Stories и сам распространяет их дальше.

Как устроен Stories Sync

Технически всё несложно. Система опрашивает мой Telegram аккаунт каждые две минуты через MTProto — это низкоуровневый протокол Telegram, который позволяет работать от имени аккаунта, а не бота. Обычный Bot API здесь не подходит: боты не видят Stories в принципе.

Когда появляется новая сторис, сервис скачивает медиафайл — видео или фото — и параллельно отправляет его в Instagram Stories через Graph API и в VK Stories через VK API. Оба запроса идут одновременно, не последовательно. Поэтому задержка минимальная.

Первое срабатывание было примерно такое. Я снял короткое видео на вилле — бассейн, пальмы, вечерний свет. Выложил в Telegram Stories. Через минуту получил системное уведомление: "Instagram Stories: опубликовано. VK Stories: опубликовано." Зашёл в Instagram — там уже висит. В VK тоже. Никаких действий с моей стороны.

Важный момент: для Telegram нужен MTProto, не Bot API. Bot API — это для ботов, которые отвечают на команды. MTProto — это доступ к аккаунту как таковому, включая Stories, историю переписок, медиафайлы. Без этого ничего не работает.

systemd: почему сервис, а не скрипт

Первый вариант был простым Python-скриптом с бесконечным циклом. Работало, но ненадёжно. Если сервер перезагружался — скрипт не запускался обратно. Если скрипт падал с ошибкой — лежал до ручного рестарта. Это не годится для чего-то, что должно работать 24/7 без моего участия.

Переделал в systemd-сервис. Это системный менеджер процессов в Linux — то же самое, что управляет nginx, postgresql, ssh и всеми другими сервисами на сервере. Когда процесс падает, systemd автоматически перезапускает его. Когда сервер перезагружается — systemd поднимает все сервисы в правильном порядке.

Unit-файл выглядит примерно так:

[Unit]
Description=Stories Sync — TG → Instagram + VK
After=network.target

[Service]
Type=simple
User=stories
WorkingDirectory=/opt/stories-sync
ExecStart=/opt/stories-sync/venv/bin/python main.py
Restart=on-failure
RestartSec=30

[Install]
WantedBy=multi-user.target

Один файл, и теперь сервис живёт сам по себе. Перезагрузился сервер — Stories Sync запустился. Упал с ошибкой — через 30 секунд перезапустился. Мне не нужно об этом думать.

Именно такой подход я использую для всей своей инфраструктуры. Не скрипты, которые нужно запускать руками. А сервисы, которые живут и сами себя поддерживают. О том как это работает системно — в статье про мониторинг AI-агентов.

Параллельно: публикация в четыре места

После того как Stories Sync заработал, стало понятно: это шаблон для всего контента, не только Stories. У меня уже была система кросспостинга обычных постов — статьи из Telegram улетали в ВКонтакте, описания вилл расходились по каналам. Но Stories стояли особняком.

Теперь цепочка выглядит так. Я создаю контент в Telegram — будь то пост в канале или Stories. Система сама разбирается куда это нужно отправить и в каком формате. Stories → Instagram Stories + VK Stories. Пост с текстом → адаптированная версия для VK + Threads. Пост с фото → карусель для Instagram.

Одно действие — три-четыре публикации. Это именно то, о чём я думал, когда строил систему из AI-агентов для контента: контент создаётся один раз, распространяется везде автоматически.

Что не сработало с первого раза

Было несколько вещей, которые пришлось переделывать.

Первое: формат видео. Telegram хранит Stories как mp4 с определёнными параметрами кодека. Instagram принимает не все из них. Первые несколько публикаций падали с ошибкой "unsupported video format". Пришлось добавить конвертацию через ffmpeg прямо в pipeline перед загрузкой.

Второе: вертикальный формат. Stories везде вертикальные — 9:16. Но я иногда снимаю горизонтальное видео просто потому что так удобнее в момент. Добавил проверку: если видео горизонтальное, сервис автоматически добавляет чёрные полосы сверху и снизу, приводя к нужному соотношению. Лучше чем ничего не публиковать.

Третье: дедупликация. Однажды сервис отправил одну и ту же сторис дважды — был баг в логике определения "новых" медиафайлов. Добавил таблицу в базу данных: каждая опубликованная сторис записывается с идентификатором из Telegram. Если идентификатор уже есть — пропускаем.

Четвёртое: ошибки авторизации. Instagram периодически инвалидирует токены доступа. Не по расписанию, просто когда хочет. Сделал автоматическую проверку токена раз в сутки и уведомление мне в Telegram, если токен протух и нужно обновить. Это единственное действие, которое требует моего участия — и то раз в несколько месяцев.

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

Самое неожиданное — я начал снимать больше. Раньше было внутреннее сопротивление: "сниму, потом надо будет три раза заливать". Теперь этого сопротивления нет. Достал телефон, нажал запись, выложил в Telegram. Всё.

За первую неделю после запуска я снял Stories в три раза больше, чем обычно. Не потому что контент стал лучше. А потому что убрал трение между "хочу поделиться" и "это опубликовано".

Это принцип, который я давно понял, но каждый раз убеждаюсь заново: автоматизация работает не только на уровне экономии времени. Она меняет поведение. Убираешь препятствие — и оказывается, что делаешь то же самое в пять раз чаще.

За три недели работы Stories Sync сэкономил около 35 минут в неделю. Звучит немного. Но дело не только в минутах — я перестал думать о кросспостинге как о задаче. Это просто происходит.

Одновременно: парадный вход через данные

Параллельно с запуском Stories Sync я чинил кое-что в системе рассылки по Telegram-группам. Рассыльщик лежал пять дней — проблема оказалась в 280 000 запросов к базе данных за один вызов функции. Три вложенных цикла, которые никто не удосужился подсчитать: 44 виллы умножить на 143 группы умножить на 9 аккаунтов умножить на 5 запросов каждый. Сервер задыхался, CPU висел на 27%.

Переписал на батчевые запросы. Стало 10 обращений вместо 280 тысяч. CPU упал до 1.6%. Первый пост за пять дней ушёл через восемь минут после деплоя.

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

Дашборд врал на 963%

В тот же день обнаружил баг в дашборде управления виллами. Система показывала загрузку за апрель — 963%. Девятьсот шестьдесят три процента. Я на секунду даже обрадовался, пока не сообразил что это невозможно.

Логика была такая: формула брала все подтверждённые бронирования на месяц и делила на количество прошедших дней. Апрель только начался, прошёл один день. 183 забронированных ночи, разделить на 1 день и 19 вилл. Математика правильная, логика кривая.

Починил за полчаса: формула теперь смотрит на полный месяц, а не на прошедшие дни. Плюс убрал 9 дублей в бронированиях, которые давали неправильные суммы. Реальная загрузка на апрель оказалась 32% — нормальный уровень для начала месяца, когда бронирования ещё приходят.

Вот что меня беспокоит в таких ситуациях: сколько решений было принято на основе этих кривых 963%? Если данные неправильные, а ты им доверяешь — принимаешь неправильные решения с уверенным видом. Управленческие данные нужно проверять так же регулярно, как вы чините баги в коде.

Что такое "день оптимизации"

5 апреля получился характерным. Не продуктовый запуск, не большая стройка. День точечных улучшений, каждое из которых само по себе небольшое, но вместе дающих ощутимый сдвиг.

Stories Sync — убирает трение в публикации контента. Фикс рассыльщика — возвращает работающую систему. Дашборд — возвращает доверие к данным. Каждое из трёх решает конкретную боль, которую можно измерить.

Именно так выглядит большая часть моей работы с автоматизацией. Не грандиозные проекты, а последовательное устранение мелких препятствий. Через год таких дней получается система, которая работает сама — потому что нет ни одного процесса, где ты необходимое звено.

У меня сейчас 19 AI-агентов и семь постоянно работающих сервисов. Stories Sync — один из них. Маленький, незаметный, работает каждые две минуты. И именно потому что он незаметен, я о нём не думаю. А значит, он делает ровно то что должен.

Как именно работает загрузка в Instagram и VK

Instagram Stories грузятся через официальный Graph API, но там есть нюансы. Facebook не разрешает публиковать Stories напрямую через API для всех аккаунтов — нужен аккаунт Creator или Business, подключённый к Meta Business Suite. Обычный личный аккаунт через API не работает.

Для видео процесс двухшаговый. Сначала инициируешь "resumable upload" — получаешь URL для загрузки. Потом заливаешь файл на этот URL частями. После успешной загрузки отправляешь второй запрос, который публикует сторис. Весь процесс занимает 10-30 секунд в зависимости от размера файла.

VK Stories проще. У ВКонтакте API для Stories работает через stories.getVideoUploadServer — получаешь upload-URL, заливаешь файл, получаешь токен, потом вызываешь stories.save. Занимает меньше времени, чем Instagram, но и аудитория там другая.

Параллельная загрузка реализована через Python asyncio. Оба запроса уходят одновременно, ошибка в одном не блокирует другой. Если Instagram упал с ошибкой, VK всё равно получит сторис — и наоборот. Статус каждой публикации пишется в базу отдельной строкой.

Мониторинг: как понять что система работает

Хорошая автоматизация незаметна, пока всё идёт по плану. Но когда что-то ломается — ты должен узнать об этом быстро, не через три дня когда заметишь что ничего не публиковалось.

Для Stories Sync я сделал простой мониторинг: раз в час скрипт проверяет, была ли хоть одна успешная публикация за последние 24 часа. Если нет — шлёт мне уведомление в Telegram. Не алерт каждый раз когда что-то пошло не так, а сводный сигнал "что-то не так давно". Потому что иногда я не снимаю сторис весь день — это нормально. А вот если система не публиковала три дня подряд при том что сторис были — это проблема.

Второй уровень мониторинга — логи. Каждое событие пишется в файл: timestamp, что скачали, куда загрузили, статус. Раз в неделю я просматриваю последние строки — не для того чтобы что-то делать, а чтобы убедиться что система живёт. Привычка, которую выработал после нескольких ситуаций, когда процесс "работал", но тихо ничего не делал. О том как именно ловить такие тихие отказы — отдельная статья.

Масштабирование рассылки в тот же день

Пока Stories Sync запускался и тестировался, в параллельной вкладке шла работа по расширению аудитории рассыльщика. До этого дня система работала с 7 аккаунтами в 158 группах — это база клиентов по виллам на Бали. Хотелось больше охвата без пропорционального увеличения затрат.

Добавили 5 новых аккаунтов, настроили прокси (каждый аккаунт через свой IP), автоматически вступили во все активные группы. Итог за один вечер: 12 аккаунтов, 301 группа. Охват вырос почти вдвое. Стоимость — 5 аккаунтов по 49 рублей каждый плюс минимальные расходы на прокси.

Логика масштабирования здесь та же, что в Stories Sync: не нанимать людей, которые будут постить руками, а расширять инфраструктуру, которая постит сама. Один человек физически не может вступить в 300 групп и вести там активность. Система может — и делает это 24/7.

Что дальше

Следующий шаг, который давно хочу сделать — умная фильтрация. Не всё что я снимаю в Telegram нужно публиковать везде. Иногда это личное, иногда — рабочая переписка, иногда — тест. Хочу добавить метку "публично" прямо в описание сторис: если написал "public", система публикует, если нет — только хранит в Telegram.

Ещё думаю над интеграцией с YouTube Shorts. Вертикальные видео до 60 секунд туда тоже идут отлично. Но там сложнее с API и авторизацией — оставлю на следующий итерацию.

Есть идея добавить автоматическую генерацию подписей через AI. Сейчас сторис публикуется без текста — как и в оригинальном Telegram. Если добавить транскрипцию голоса (если в видео есть речь) или краткое описание через GPT-4o Vision, Instagram Stories станут более информативными. Но это уже следующая итерация — пока система работает в базовой версии и этого достаточно.

Пока Stories Sync работает ровно в том объёме, для которого его строил. Telegram → Instagram + VK, каждые две минуты, без участия человека. Этого достаточно, чтобы я перестал об этом думать — а это и есть главный критерий успешной автоматизации.

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