Разбор

ИИ адаптирует один пост сразу для VK и Telegram: автопостинг без копирования и вставки

SMM-менеджер тратит 40–60 минут в день на ручную адаптацию одного текста под разные платформы. Python + Claude API + VK API + Telegram Bot API — один исходник, три версии, публикуются автоматически по расписанию.

• 6 мин чтения

Среднестатистический SMM-менеджер российского агентства ведёт 4–6 клиентов. У каждого — VK и Telegram, у многих ещё Одноклассники. Один пост превращается в 3 разных версии вручную. Шесть клиентов × три платформы × два поста в день — это 36 адаптаций. Ежедневно.

47 мин
в среднем тратит SMM-менеджер на ручную адаптацию одного поста под три платформы — по данным Hootsuite Social Media Trends 2025

Я смотрел на это со стороны несколько лет, пока в одном из проектов не сел считать. 47 минут — это не предел. Это среднее. Когда нужно переформатировать длинный VK-пост в короткий Telegram-анонс, придумать другой CTA, убрать хэштеги, добавить эмодзи и при этом не потерять суть — нормально уходит час. На один пост.

Схема которую я покажу дальше решает это за 8–12 секунд работы Claude API.

Почему нельзя просто скопировать

Расскажу что именно сломается если отправить один и тот же текст в обе платформы.

VK воспринимает длинный текст нормально — там привычна стена из 1000–1500 символов. Алгоритм продвигает посты с хэштегами, ссылки раскрываются в превью, кнопка «Читать дальше» появляется автоматически. Аудитория VK ждёт подробностей.

Telegram — другой мир. Там открывают первые 2–3 строки, потом закрывают или читают дальше. Длинный пост без структуры скроллится мимо. Эмодзи в начале строки работают как визуальные якоря — без них текст сливается. Хэштеги в Telegram практически не работают для продвижения контента, зато кнопки под постом дают конверсию в 3–5 раз выше чем ссылка в тексте.

VK
Длина текста500–1500 симв.
Хэштеги3–7 в конце
Эмодзиумеренно
CTAПереходи по ссылке
Ссылкираскрываются в превью
Кнопкичерез виджеты
Telegram
Длина текста150–400 симв.
Хэштегине используются
Эмодзив начале строк
CTAПодписаться / Написать
Ссылкискрыть в кнопку
Кнопкиinline keyboard

Это не просто разный стиль — разная механика потребления. Один и тот же текст работает по-разному, и никакой «усреднённый» формат не решит проблему.

Как устроена схема

Один исходный текст. Claude получает его один раз и возвращает две адаптированных версии. Python публикует их через соответствующие API.

📝Исходниктекст или ссылка
🐍Pythonочередь постов
🤖Claude APIадаптация × 2
💙VK APIwall.post
✈️Telegram BotsendMessage

Claude в этой схеме — не генератор контента, а переводчик форматов. Смысл и факты берутся из исходника, меняется только упаковка. Это принципиально: если написать промпт правильно, Claude сохраняет все цифры, не добавляет ничего от себя и адаптирует только структуру, длину и стилистику.

Код который работает

Весь скрипт — меньше 150 строк. Разобью на логические блоки.

autopost.py — pip install anthropic requests python-telegram-bot
import anthropic
import requests
import json
import sqlite3
from datetime import datetime

# Токены
CLAUDE_KEY = "YOUR_CLAUDE_KEY"
VK_TOKEN = "YOUR_VK_TOKEN"          # права: wall, photos
VK_OWNER_ID = "-123456789"          # ID группы со знаком минус
TG_BOT_TOKEN = "YOUR_BOT_TOKEN"
TG_CHANNEL_ID = "@your_channel"

client = anthropic.Anthropic(api_key=CLAUDE_KEY)

# ─── Адаптация через Claude ───────────────────────────────────────

def adapt_post(source_text: str) -> dict:
  """Возвращает {'vk': '...', 'telegram': '...'}"""

  prompt = f"""Адаптируй текст для двух платформ. Верни JSON с двумя ключами.

ИСХОДНЫЙ ТЕКСТ:
{source_text}

Правила для VK (ключ "vk"):
- Длина 500–900 символов
- Сохрани все факты и цифры из исходника
- 3–5 хэштегов в конце (#маркетинг, #бизнес, #smm)
- CTA в конце: призыв перейти по ссылке или подписаться
- Форматирование через абзацы, без маркдауна

Правила для Telegram (ключ "telegram"):
- Длина 150–350 символов
- Эмодзи в начале каждого смыслового блока
- Без хэштегов
- CTA — призыв написать или нажать кнопку
- Текст должен читаться за 20 секунд

Верни только JSON без markdown-обёртки:
{{"vk": "текст для VK", "telegram": "текст для Telegram"}}"""

  message = client.messages.create(
      model="claude-haiku-4-5",
      max_tokens=1500,
      messages=[{"role": "user", "content": prompt}]
  )

  raw = message.content[0].text.strip()
  return json.loads(raw)

# ─── Публикация в VK ─────────────────────────────────────────────

def post_to_vk(text: str, image_url: str = None) -> dict:
  params = {
      "owner_id": VK_OWNER_ID,
      "from_group": 1,
      "message": text,
      "access_token": VK_TOKEN,
      "v": "5.199"
  }
  if image_url:
      # Загрузка картинки — отдельный метод, здесь упрощено
      params["attachments"] = image_url
  r = requests.post("https://api.vk.com/method/wall.post", params=params)
  return r.json()

# ─── Публикация в Telegram ───────────────────────────────────────

def post_to_telegram(text: str, button_url: str = None, button_label: str = "Подробнее") -> dict:
  payload = {
      "chat_id": TG_CHANNEL_ID,
      "text": text,
      "parse_mode": "HTML"
  }
  if button_url:
      payload["reply_markup"] = {
          "inline_keyboard": [[
              {"text": button_label, "url": button_url}
          ]]
      }
  r = requests.post(
      f"https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage",
      json=payload
  )
  return r.json()

# ─── Очередь публикаций (SQLite) ─────────────────────────────────

def init_db():
  conn = sqlite3.connect("posts_queue.db")
  conn.execute("""
      CREATE TABLE IF NOT EXISTS queue (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          source_text TEXT NOT NULL,
          scheduled_at TEXT NOT NULL,
          link TEXT,
          published INTEGER DEFAULT 0,
          created_at TEXT DEFAULT CURRENT_TIMESTAMP
      )
  """)
  conn.commit()
  return conn

def get_pending_posts(conn):
  """Берём посты, время которых наступило."""
  now = datetime.now().isoformat()
  cur = conn.execute(
      "SELECT id, source_text, link FROM queue "
      "WHERE published = 0 AND scheduled_at <= ? "
      "ORDER BY scheduled_at LIMIT 5",
      (now,)
  )
  return cur.fetchall()

def mark_published(conn, post_id: int):
  conn.execute("UPDATE queue SET published = 1 WHERE id = ?", (post_id,))
  conn.commit()

# ─── Основной цикл ───────────────────────────────────────────────

def run():
  conn = init_db()
  posts = get_pending_posts(conn)

  if not posts:
      print("Нет постов для публикации.")
      return

  for post_id, source_text, link in posts:
      print(f"Адаптируем пост #{post_id}...")
      adapted = adapt_post(source_text)

      vk_result = post_to_vk(adapted["vk"])
      tg_result = post_to_telegram(
          adapted["telegram"],
          button_url=link,
          button_label="Читать полностью"
      )

      if "response" in vk_result and tg_result.get("ok"):
          mark_published(conn, post_id)
          print(f"Пост #{post_id} опубликован в обеих платформах.")
      else:
          print(f"Ошибка: VK={vk_result}, TG={tg_result}")

if __name__ == "__main__":
  run()

Несколько деталей которые не очевидны с первого раза.

VK токен с правом wall нужно получать через implicit flow — токен прямо в redirect URL. Серверный OAuth тут не поможет, потому что wall.post в чужую группу требует user-токен, а не сервисный. Подробно — в официальной документации VK OAuth.

Claude Haiku здесь достаточно. Задача — не генерация, а форматирование. Haiku справляется за 1–2 секунды и стоит в 6 раз дешевле Sonnet. На 40 постов в день — это примерно 2–3 рубля.

JSON на выходе иногда ломается если исходный текст содержит кавычки. Лучше добавить try/except вокруг json.loads и fallback с extract_json_from_text() для грязного вывода.

Как добавить пост в очередь

Добавить новый пост в базу — одна строка Python:

add_to_queue.py — добавить пост с отложенной публикацией
import sqlite3
from datetime import datetime

conn = sqlite3.connect("posts_queue.db")

# Пример: опубликовать завтра в 10:00
conn.execute("""
  INSERT INTO queue (source_text, scheduled_at, link)
  VALUES (?, ?, ?)
""", (
  """
  Запустили новый сервис: автоматическая адаптация постов для соцсетей.
  Claude читает исходный текст и делает версии для VK и Telegram.
  Экономит 40-60 минут в день. Работает через Python и API Anthropic.
  Запуск занимает 30 минут для тех кто умеет запускать скрипты.
  """,
  "2026-06-02T10:00:00",
  "https://example.com/blog/autoposting"
))
conn.commit()
print("Пост добавлен в очередь.")

Расписание — cron каждые 15 минут:

crontab — запуск каждые 15 минут
# Проверять очередь каждые 15 минут
*/15 * * * * /usr/bin/python3 /home/user/autopost/autopost.py >> /home/user/autopost/autopost.log 2>&1

Или n8n — Schedule Trigger раз в 15 минут → Execute Command → autopost.py. Для тех кто хочет визуальный интерфейс без crontab.

Сколько времени это экономит реально

Время SMM-менеджера на публикацию — до и после автоматизации (мин/день)
Написание текста
60 мин
Адаптация для VK (было)
45 мин
Адаптация для TG (было)
30 мин
Адаптация VK+TG (стало)
5 мин
Данные по кейсу агентства с 5 клиентами, 8–10 постов/день, платформы VK + Telegram. «Стало» включает время проверки и правки AI-адаптации.

Кейс: агентство с 5 клиентами

Реальный кейс

Агентство ведёт 5 клиентов в нишах: строительство, косметология, онлайн-образование, юридические услуги, HoReCa. Каждый клиент — VK + Telegram, 2 поста в день. Итого: 20 постов, 40 адаптаций. До автоматизации один SMM-менеджер тратил на это 2 часа 10 минут ежедневно. После — 25–30 минут (проверка и при необходимости правка AI-версий). Экономия: 100 минут в день, 35 часов в месяц. Для агентства это один дополнительный клиент без найма нового сотрудника.

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

Сколько времени ты тратишь впустую

Посчитаем твои потери

3 вопроса — узнаешь сколько часов в месяц уходит на адаптацию

Вопрос 1 из 3
Сколько платформ ты ведёшь для одного клиента/проекта?
Вопрос 2 из 3
Сколько постов в день ты публикуешь суммарно по всем клиентам?
Вопрос 3 из 3
Как сейчас делаешь адаптацию для разных платформ?

Как запустить за один вечер

1
Получить токен VK

Создать приложение на dev.vk.com (тип — веб-сайт). Получить токен через implicit flow: открыть URL авторизации, после редиректа скопировать access_token из адресной строки. Нужные права: wall, photos, groups.

dev.vk.com → Мои приложения → Создать
2
Создать Telegram-бота и добавить в канал

Написать @BotFather → /newbot. Получить токен. Добавить бота в канал как администратора с правом публикации. Chat ID канала — через getUpdates или @userinfobot.

@BotFather → /newbot → добавить в канал как admin
3
Получить ключ Claude API

Зарегистрироваться на console.anthropic.com, создать API ключ. Для тестирования хватит $5 кредитов — это тысячи запросов на Haiku.

console.anthropic.com → API Keys → Create Key
4
Установить зависимости и протестировать

Три библиотеки. Вставить токены в скрипт, добавить тестовый пост через add_to_queue.py, запустить autopost.py вручную. Убедиться что оба канала получили публикации.

pip install anthropic requests python-telegram-bot
5
Настроить расписание

На сервере — добавить строку в crontab. В n8n — Schedule Trigger + Execute Command. Минимальный интервал проверки очереди — 15 минут, это даёт достаточно гибкости для планирования.

*/15 * * * * python3 /path/autopost.py

Что схема не решает

Честно о границах.

Изображения. VK и Telegram по-разному принимают медиа — в VK нужно сначала загрузить файл через photos.getWallUploadServer, получить photo_id, потом прикрепить к посту. В Telegram sendPhoto вместо sendMessage. Это дополнительные методы API, они работают, но в базовой версии скрипта нет.

Карусели и альбомы — отдельная история. VK умеет карусели через виджеты, Telegram media_group. Это усложняет код в два раза, и для большинства задач излишне.

Тональность по клиенту. Claude адаптирует формат, но не характер текста. Если клиент — серьёзная юридическая фирма, а другой — весёлый бар, базовый промпт не учтёт это различие. Нужно добавить в промпт описание аудитории и тон бренда для каждого клиента.

Вот что стоит добавить следующим шагом: поле brand_voice в таблице очереди и передача его в промпт. Две строки кода, но разница в качестве — существенная.


Агентство из кейса выше запустило эту схему за три часа в пятницу вечером. В понедельник утром SMM начал рабочую неделю с уже запланированными и адаптированными постами на три дня вперёд — добавленными в очередь за 20 минут накануне. Первый вопрос который я услышал: «Почему мы не сделали это год назад?»

Источники

Источники

Часто задаваемые вопросы

Сколько времени экономит автопостинг с ИИ-адаптацией?
По данным кейса агентства с 5 клиентами — около 2 часов в день на одного SMM-менеджера. При ручной адаптации одного поста под VK и Telegram уходит 15–20 минут. При 6–8 постах в день на 5 клиентов это 90–160 минут ежедневно.
Чем отличается пост для VK от поста для Telegram?
VK: длинный текст 500–1500 символов, хэштеги в конце (#маркетинг #бизнес), ссылки раскрываются в превью, форматирование через переносы строк, CTA 'Переходи по ссылке'. Telegram: короткий текст 150–400 символов, эмодзи в начале строк, кнопки через inline keyboard, CTA 'Подписаться', без хэштегов.
Сколько стоит Claude API для автопостинга?
Для адаптации одного поста под 2 платформы Claude Haiku тратит около 800–1200 токенов. При цене $0.25 за 1M input токенов — это примерно 0.03–0.05 рубля за один пост. Для агентства с 40 постами в день — около 50–70 рублей в месяц.
Как настроить публикацию по расписанию?
Два варианта: cron на Linux-сервере (одна строка в crontab) или n8n с визуальным редактором расписания. Посты хранятся в очереди (SQLite или обычный JSON-файл), скрипт берёт следующий по времени и публикует. Интервал — от 15 минут до нескольких дней.
Нужны ли права администратора для публикации в VK через API?
Для публикации в группу нужен токен с правами wall и photos. Его получают через VK OAuth — пользователь должен быть редактором или администратором группы. Для личной страницы достаточно токена с правом wall.
Что система не умеет делать автоматически?
Изображения и видео требуют отдельной загрузки через API до создания поста — это дополнительные вызовы (photos.getWallUploadServer для VK). Карусели VK и медиагруппы Telegram — отдельные методы API. Базовая версия из статьи публикует только текст с опциональной одной картинкой.
Обсуждение

    Пока без комментариев. Будьте первым.

    Войдите, чтобы отправить комментарий

    Вы сможете комментировать статьи, сохранять материалы

    или войдите по email

    Бесплатная диагностика · 30 минут · без обязательств

    Маркетинг работает, но продажи не растут?

    Отвечу на 3–5 вопросов о вашем бизнесе — и мы вместе разберём, где именно теряются клиенты и что с этим делать.

    Без продаж. Без навязчивых звонков.