Разбор
ИИ адаптирует один пост сразу для VK и Telegram: автопостинг без копирования и вставки
SMM-менеджер тратит 40–60 минут в день на ручную адаптацию одного текста под разные платформы. Python + Claude API + VK API + Telegram Bot API — один исходник, три версии, публикуются автоматически по расписанию.
Среднестатистический SMM-менеджер российского агентства ведёт 4–6 клиентов. У каждого — VK и Telegram, у многих ещё Одноклассники. Один пост превращается в 3 разных версии вручную. Шесть клиентов × три платформы × два поста в день — это 36 адаптаций. Ежедневно.
Я смотрел на это со стороны несколько лет, пока в одном из проектов не сел считать. 47 минут — это не предел. Это среднее. Когда нужно переформатировать длинный VK-пост в короткий Telegram-анонс, придумать другой CTA, убрать хэштеги, добавить эмодзи и при этом не потерять суть — нормально уходит час. На один пост.
Схема которую я покажу дальше решает это за 8–12 секунд работы Claude API.
Почему нельзя просто скопировать
Расскажу что именно сломается если отправить один и тот же текст в обе платформы.
VK воспринимает длинный текст нормально — там привычна стена из 1000–1500 символов. Алгоритм продвигает посты с хэштегами, ссылки раскрываются в превью, кнопка «Читать дальше» появляется автоматически. Аудитория VK ждёт подробностей.
Telegram — другой мир. Там открывают первые 2–3 строки, потом закрывают или читают дальше. Длинный пост без структуры скроллится мимо. Эмодзи в начале строки работают как визуальные якоря — без них текст сливается. Хэштеги в Telegram практически не работают для продвижения контента, зато кнопки под постом дают конверсию в 3–5 раз выше чем ссылка в тексте.
Это не просто разный стиль — разная механика потребления. Один и тот же текст работает по-разному, и никакой «усреднённый» формат не решит проблему.
Как устроена схема
Один исходный текст. Claude получает его один раз и возвращает две адаптированных версии. Python публикует их через соответствующие API.
Claude в этой схеме — не генератор контента, а переводчик форматов. Смысл и факты берутся из исходника, меняется только упаковка. Это принципиально: если написать промпт правильно, Claude сохраняет все цифры, не добавляет ничего от себя и адаптирует только структуру, длину и стилистику.
Код который работает
Весь скрипт — меньше 150 строк. Разобью на логические блоки.
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:
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 минут:
# Проверять очередь каждые 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.
Сколько времени это экономит реально
Кейс: агентство с 5 клиентами
Агентство ведёт 5 клиентов в нишах: строительство, косметология, онлайн-образование, юридические услуги, HoReCa. Каждый клиент — VK + Telegram, 2 поста в день. Итого: 20 постов, 40 адаптаций. До автоматизации один SMM-менеджер тратил на это 2 часа 10 минут ежедневно. После — 25–30 минут (проверка и при необходимости правка AI-версий). Экономия: 100 минут в день, 35 часов в месяц. Для агентства это один дополнительный клиент без найма нового сотрудника.
Единственное что агентство оставило вручную — финальный просмотр перед публикацией. Claude стабильно сохраняет факты и не добавляет от себя, но иногда меняет тон не так как нужно конкретному клиенту. Минута на проверку лучше чем час на написание.
Есть вопрос по теме?
Разберу вашу ситуацию и предложу конкретный шаг
Сколько времени ты тратишь впустую
Посчитаем твои потери
3 вопроса — узнаешь сколько часов в месяц уходит на адаптацию
Как запустить за один вечер
Создать приложение на dev.vk.com (тип — веб-сайт). Получить токен через implicit flow: открыть URL авторизации, после редиректа скопировать access_token из адресной строки. Нужные права: wall, photos, groups.
dev.vk.com → Мои приложения → СоздатьНаписать @BotFather → /newbot. Получить токен. Добавить бота в канал как администратора с правом публикации. Chat ID канала — через getUpdates или @userinfobot.
@BotFather → /newbot → добавить в канал как adminЗарегистрироваться на console.anthropic.com, создать API ключ. Для тестирования хватит $5 кредитов — это тысячи запросов на Haiku.
console.anthropic.com → API Keys → Create KeyТри библиотеки. Вставить токены в скрипт, добавить тестовый пост через add_to_queue.py, запустить autopost.py вручную. Убедиться что оба канала получили публикации.
pip install anthropic requests python-telegram-botНа сервере — добавить строку в 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 минут накануне. Первый вопрос который я услышал: «Почему мы не сделали это год назад?»
Есть вопрос по теме?
Разберу вашу ситуацию и предложу конкретный шаг
Источники
- VK API — Wall.post, документация для разработчиков
- Telegram Bot API — sendMessage, официальная документация
- Claude API — руководство разработчика, Anthropic
- VK OAuth — авторизация приложений
- python-telegram-bot — документация библиотеки v21
- Hootsuite Social Media Trends 2025 — исследование времени SMM-менеджеров
AI-агенты · Персональная карта
4 часа потратил — не работает?
Покажу где ты пошёл не туда и как сделать правильно за 2 недели
Получить разбор бесплатно →AI-агенты · 10 мест
Ты работаешь до полуночи — AI-агент будет работать вместо тебя
Покажу какой агент закроет твою главную операционную боль
Узнать свой маршрут →Есть вопрос по теме?
Разберу вашу ситуацию и предложу конкретный шаг
Источники
- VK API — Wall.post, документация для разработчиков
- Telegram Bot API — sendMessage, официальная документация
- Claude API — руководство разработчика, Anthropic
- VK OAuth — авторизация приложений
- python-telegram-bot — документация библиотеки v21
- Исследование времени SMM-менеджеров — Hootsuite Social Media Trends 2025
Читайте также
Часто задаваемые вопросы
- Сколько времени экономит автопостинг с ИИ-адаптацией?
- По данным кейса агентства с 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. Базовая версия из статьи публикует только текст с опциональной одной картинкой.
Канал «Лёха Маркетолог»
Практика без воды: кейсы, инсайты, разборы. 1–2 поста в неделю.
Пока без комментариев. Будьте первым.