Устанавливайте опубликованный yeti3-social==0.2.2. Раздел ниже описывает текущие исходники; функции 0.2.3 требуют отдельной проверки релиза.
YETI³ Social Publishing — справочник
Выпуски из статей, товаров, обзоров, мастер-классов и событий. Семь форматов текста и шесть композиций JPEG с фотографией, ценой или датой. Готовый список материалов собирается через адаптеры установленных модулей; для остальных типов есть SDK ContentItem.
Новые модули: social.telegram, social.publishing, social.advertising, social.network-marketing. Официальные Instagram, VK, Facebook и TikTok сохранены. TikTok требует отдельного платформенного согласия на конкретный пост и поэтому исключён из фонового мастера выпусков.
Выпуск за несколько действий
Админка → Выпуски → выбрать материал, каналы, шаблон и формат → сохранить предпросмотр → указать время → подготовить и запланировать. Для рекламы нажать «Предложить рекламный текст»: генератор использует замороженные факты и историю, готовый результат подставляется в выпуск. Обложка и исходящие сообщения фиксируются при утверждении. Одинаковые и близкие тексты для того же аккаунта блокируются.
В сетевом боте /marketing показывает готовые админские рекламные выпуски. Кнопки: «Опубликовать сейчас», «По расписанию», «Отклонить», «Удалить и отключить сбор». Автоматический режим планирует минимум три слота в сутки; после подтверждённого приватного предпросмотра действует окно отмены, минимум 30 минут, по умолчанию 120. Если отправка предпросмотра не подтверждена, автоматической публикации нет. Удаление навсегда отключает алгоритм и отменяет его ожидающие выпуски; обратное включение — явное действие администратора.
Генерация и цена
YETI3_SOCIAL_NODE_KEY_FILE указывает на закрытый ключ, ограниченный конкретным сайтом. Центральный сервис проверяет лицензию проекта, владельца GPU, модель, свежий heartbeat и бюджет. Режим own: только собственный подтверждённый Node GPU, списание 0 PHI. Режим paid: только GPU, владелец которого разрешил sharing, стартовый тариф 150 ₽ (100 ₽ + 50%), списание PHI по текущему курсу. Ошибка вычисления или непригодный JSON освобождают резерв. Цена проверяется перед отправкой; при изменении требуется новая котировка. Повторные HTTP-запросы с тем же ключом не списывают повторно. Обычные GPU-бонусы начисляет существующий серверный начислитель под общей и локальной политикой.
Другие типы контента
from yeti3_social.django_app.models import ContentItem
ContentItem.objects.update_or_create(source='webinars', source_id=webinar.uid,
defaults={'category':'Вебинары', 'title':webinar.title, 'body':webinar.description,
'url':webinar.public_url, 'event_date':webinar.starts_at,
'is_published':webinar.is_published})Ссылки должны быть HTTPS на домен сайта либо в явном YETI3_SOCIAL_SOURCE_HOSTS. Нативные Django-модели подключаются через register_source(label, Source(...)) в AppConfig.ready. Статьи и товары существующих сайтов добавляются встроенными адаптерами. ContentItem позволяет перечислять обзоры, эфиры, обучение, услуги, портфолио и предложения без предположений об их модели.
Для приватного управления дополнительно установить yeti3_media_control.django_app, миграцию журнала и маршрут path('api/social-control/', yeti3_social.django_app.control.command). Ключ брокера хранится отдельно от токена публикации. Публичный канал и приватный Telegram администратора — отдельные назначения.
Четыре базовых модуля SDK: social.instagram, social.vk, social.facebook, social.tiktok.
Общий пакет yeti3-social предоставляет официальные API-клиенты и Django-приложение.
Подключение
1. Установить yeti3-social[django]==0.2.1 из SDK движка.
2. Добавить yeti3_social.django_app в INSTALLED_APPS, выполнить migrate yeti3_social и collectstatic.
3. Указать YETI3_SOCIAL_SITE_URL и YETI3_SOCIAL_IMPORT_MODEL (editorial.Article для MillerRings, editorial.Publication для YETI3).
4. Раз в минуту запускать python manage.py social_exchange под flock (один worker на сайт).
5. Админка → Соцсети → Подключения → Центр обмена публикациями. Заполнить ID и токен, сохранить и проверить API, включить необходимые направления.
Токены не нужны в чате или репозитории. Поля токенов не возвращают сохранённые значения. В БД — Fernet ciphertext; ключ получен из Django SECRET_KEY с отдельным контекстом. Сохраняйте SECRET_KEY вместе с резервной копией; при ротации используйте SECRET_KEY_FALLBACKS. Перед записью в логи наружу передаются только коды ошибок, без токенов и тел API. Отзыв токена выполняется у платформы; флаг отключения удаляет локальные секреты.
Возможности и границы
| Платформа | Сайт → соцсеть | Соцсеть → сайт |
|---|---|---|
| Instagram Login | JPEG или Reels по публичному HTTPS URL, caption; media container → status → media_publish | Собственные media, текст и ссылка, постранично |
| VK | wall.post от сообщества: текст, ссылка; медиа в этой версии прикладываются как HTTPS ссылка | wall.get, записи сообщества, постранично |
| Facebook Pages | feed с текстом/ссылкой или photos по URL | posts страницы, текст и permalink, постранично |
| TikTok | Direct Post видео с подтверждённого домена; выбор видимости/взаимодействий/маркировки и отдельное согласие; status/fetch до PUBLISH_COMPLETE | Display API video/list, постранично |
Facebook и VK: загрузка собственных видеофайлов не входит в эту версию. Instagram/TikTok: проверка платформой и лимиты аккаунта могут запрещать отправку. Нет скрейпинга, эмуляции браузера или паролей пользователей. Комментарии, личные сообщения, удаление и зеркалирование правок существующих постов не входят в обмен публикациями 0.1.0.
TikTok запрещает Direct Post приложения, ограниченные внутренней утилитой аккаунтов команды. SDK рассчитан на повторное использование, но само это не гарантирует одобрения платформой. До получения разрешения Direct Post выключен. Полностью фоновая публикация без выбора видимости и согласия на конкретный пост несовместима с UX-требованиями TikTok. Для остальных платформ доступна автоматическая отправка новых опубликованных статей после включения флага auto_export (без захвата старого архива).
Входящие по умолчанию требуют модерации. Можно включить автоматическое создание черновиков сайта. Отдельный явный флаг разрешает автоматическую публикацию полученных записей на сайте без ручной модерации. Черновик содержит экранированный текст и ссылку на оригинал; удалённые медиа не скачиваются. Изменённый оригинал помечается, редакционный текст не перезаписывается. Дедупликация по аккаунту и удалённому ID, защита от автоматического обратного экспорта импортированных записей.
Исходящие неизменяемы после утверждения. API-таймаут после записи → uncertain, без автоматического повторения. Идентификаторы контейнера/задания сохраняются; опрос не создаёт новую публикацию. Ошибку API видит администратор; нет бесконечного автоматического повторения отклонённых записей. Повторное утверждение доступно для отклонения до получения удалённого ID. Подключение/ID после утверждения сверяются перед отправкой.
Проверка подключения подтверждает чтение API и ID аккаунта; право публикации подтверждается только фактической публикацией. Без токенов и разрешений аккаунтов нельзя доказать внешний двусторонний обмен.
Документация платформ
- https://developers.facebook.com/docs/instagram-platform/content-publishing/
- https://developers.facebook.com/docs/pages-api/posts/
- https://dev.vk.com/ru/method/wall.post
- https://dev.vk.com/ru/method/wall.get
- https://developers.tiktok.com/docs/en/content-posting-api-reference-direct-post
- https://developers.tiktok.com/docs/en/content-posting-api-reference-query-creator-info
- https://developers.tiktok.com/docs/en/content-posting-api-reference-get-video-status
- https://developers.tiktok.com/docs/en/content-sharing-guidelines
- https://developers.tiktok.com/docs/en/display-api-get-started
Глобальное и локальное управление
На сервере лицензирования: /admin/modules/ — глобальные разрешения и отдельная политика домена, стоимость аренды GPU, множитель от ×3 и дневной лимит владельца. На сайте: «Соцсети → Настройки модуля сайта» — локальные переключатели; токены каждого подключения остаются в админке соответствующего сайта.
Рабочий цикл каждый раз получает разрешения с https://license.gochain.space/api/network/v1/module-controls/effective?scope=<домен>. При недоступности центра отправка и получение приостанавливаются; кеш разрешений не используется. Разрешения центра и сайта пересекаются, локальный администратор не может отменить глобальный запрет.
Для локального GPU-переключателя добавить yeti3_social.django_app.middleware.ModulePolicyMiddleware в MIDDLEWARE. Точный URL /.well-known/yeti3-module-policy должен проксироваться приложению (без кеша) через оба уровня nginx. Он отдаёт только публичные флаги, без токенов и реквизитов. Центральный начислитель проверяет локальное согласие сайта через TLS. Для yeti3.ru и millerrings.ru это включено в поставку.