Разработка / API

Автоматизация публикаций в социальных сетях на Python

Короткий ответ: Используйте requests: запросите presigned URL, загрузите исходный файл в S3, дождитесь обработки, получите список подключений и вызовите документированный endpoint нужной площадки с fileId. REST API доступен на Business и Agency.

Надёжная автоматизация строится на публично описанном контракте. Пример ниже публикует загруженное видео в Instagram и может быть расширен другими документированными endpoints.

Что понадобится

  • Python 3.10+ и библиотека requests
  • Тариф DOHOO Business или Agency
  • API-ключ в переменной DOHOO_API_KEY
  • Хотя бы один подключённый социальный аккаунт

Проверенный Python-клиент

import os, time, mimetypes, requests
from pathlib import Path

BASE_URL = "https://dohoo.ai"
API_KEY = os.environ["DOHOO_API_KEY"]
HEADERS = {"X-API-Key": API_KEY}

def upload_file(path: str) -> str:
    file_path = Path(path)
    content_type = mimetypes.guess_type(file_path.name)[0] or "application/octet-stream"
    slot = requests.post(
        f"{BASE_URL}/api/upload/presigned-url",
        headers={**HEADERS, "Content-Type": "application/json"},
        json={"filename": file_path.name, "contentType": content_type}, timeout=30)
    slot.raise_for_status()
    data = slot.json()
    with file_path.open("rb") as source:
        put = requests.put(data["uploadUrl"], headers={"Content-Type": content_type}, data=source, timeout=300)
    put.raise_for_status()
    file_id = data["fileId"]
    for _ in range(120):
        response = requests.get(f"{BASE_URL}/api/upload/status/{file_id}", headers=HEADERS, timeout=30)
        response.raise_for_status()
        payload = response.json()
        if payload.get("status") in {"completed", "ready"}:
            return file_id
        time.sleep(5)
    raise TimeoutError("Media processing did not complete in time")

def list_connections():
    r = requests.get(f"{BASE_URL}/api/connections/unified", headers=HEADERS, timeout=30)
    r.raise_for_status(); return r.json()

def publish_instagram(file_id, connection_id, caption):
    r = requests.post(f"{BASE_URL}/api/v2/instagram/publish",
        headers={**HEADERS, "Content-Type": "application/json"},
        json={"connectionId": connection_id, "fileId": file_id, "caption": caption}, timeout=120)
    r.raise_for_status(); return r.json()

file_id = upload_file("video.mp4")
instagram = next(c for c in list_connections() if c["platform"] == "instagram")
print(publish_instagram(file_id, instagram["id"], "Published with DOHOO API"))

Во время интеграции логируйте полный ответ статуса: название финального состояния может отличаться между интерфейсами.

Что делать с расписанием

Публичная REST-документация описывает немедленную публикацию. Платформенное расписание с scheduledAt и timezone доступно через DOHOO MCP. Не придумывайте REST-маршрут /schedule, если его нет в актуальном reference.

Проверка и ошибки

  • После каждого HTTP-запроса вызывайте raise_for_status().
  • Не записывайте API-ключ в логи.
  • Получайте подключения из /api/connections/unified.
  • Проверяйте лимиты текста до запроса.

Частые вопросы

Нужен ли отдельный SDK?

Нет. API использует JSON по HTTPS и заголовок X-API-Key.

Можно ли планировать из Python?

Да, через MCP-клиент или другой документированный планировщик. Не используйте недокументированные HTTP-маршруты.

Можно ли брать описания из Google Sheets?

Да. Читайте согласованные строки через Google Sheets API или CSV и передавайте их в те же функции.

Где хранить API-ключ?

В переменной окружения или менеджере секретов, но не в репозитории.

Постройте один надёжный процесс публикации для всех площадок.

Посмотреть тарифы DOHOO