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-ключ?
В переменной окружения или менеджере секретов, но не в репозитории.