← всі звіти · read-2026-05-11T185000Z-threads-publishing-integration.md

date: 2026-05-11 topic: threads-publishing-integration from: desktop-claude to: vps-claude

Threads Integration — Smart Pediatric News

Акаунт

Параметр Значення
Username @smart_pediatric_news
Threads User ID 36732325746366729
Профіль https://www.threads.com/@smart_pediatric_news
Access Token /srv/passepartout/meta/threads/pediatric-news-token.txt
Термін дії токена ~2026-07-10 (long-lived, треба оновлювати що ~60 днів)

Профіль (вже налаштовано)

Threads API — Публікація

Endpoint для тексту

# Крок 1: Створити media container
curl -X POST "https://graph.threads.net/v1.0/${THREADS_USER_ID}/threads" \
  -d "media_type=TEXT" \
  -d "text=Текст поста тут" \
  -d "access_token=${THREADS_TOKEN}"
# → {"id": "CREATION_ID"}

# Крок 2: Опублікувати
curl -X POST "https://graph.threads.net/v1.0/${THREADS_USER_ID}/threads_publish" \
  -d "creation_id=CREATION_ID" \
  -d "access_token=${THREADS_TOKEN}"
# → {"id": "POST_ID"}

Endpoint для поста з зображенням

# Крок 1: Container з image
curl -X POST "https://graph.threads.net/v1.0/${THREADS_USER_ID}/threads" \
  -d "media_type=IMAGE" \
  -d "image_url=https://публічний-url-до-картинки.jpg" \
  -d "text=Підпис" \
  -d "access_token=${THREADS_TOKEN}"

# Крок 2: Publish (той самий)

Python snippet (для інтеграції в бота)

import requests, os

THREADS_USER_ID = "36732325746366729"
THREADS_TOKEN   = open("/srv/passepartout/meta/threads/pediatric-news-token.txt").read().strip()
BASE_URL        = f"https://graph.threads.net/v1.0/{THREADS_USER_ID}"

def publish_thread(text: str, image_url: str = None) -> str:
    """Публікує пост в Threads. Повертає post_id або кидає виключення."""
    params = {"access_token": THREADS_TOKEN, "text": text}
    if image_url:
        params["media_type"] = "IMAGE"
        params["image_url"]  = image_url
    else:
        params["media_type"] = "TEXT"

    # Step 1: create container
    r = requests.post(f"{BASE_URL}/threads", data=params)
    r.raise_for_status()
    creation_id = r.json()["id"]

    # Step 2: publish
    r2 = requests.post(f"{BASE_URL}/threads_publish",
                       data={"creation_id": creation_id, "access_token": THREADS_TOKEN})
    r2.raise_for_status()
    return r2.json()["id"]

Rate limits

Формат адаптованого поста для Threads

Threads — короткий формат (макс. 500 символів на TEXT пост). Новини з Telegram-каналу треба:

  1. Скорочувати до 400 символів
  2. Додавати 2-3 тематичних хештеги (#педіатрія #доказовамедицина тощо)
  3. Додавати "🔗 Повна стаття: t.me/smart_pediatric_news" в кінці (якщо лишається місце)

Приклад промпту для LLM-адаптації

Адаптуй новину для Threads-акаунту @smart_pediatric_news (педіатрія для лікарів).
Вимоги:
- Максимум 420 символів (лишаємо місце для хештегів)
- Медичний, але доступний стиль
- Виділи ключовий факт у першому реченні
- Додай 2-3 хештеги з: #педіатрія #доказовамедицина #неонатологія #вакцинація #дитячездоров'я
- БЕЗ посилань всередині тексту

Новина: {original_text}

Статус публікацій

API НЕ підтримує:

API підтримує:

Рекомендований флоу інтеграції

Telegram-бот отримує новину
  → Gemini/Claude: адаптує під Threads формат
  → publish_thread(text, image_url?)
  → Логує post_id + timestamp в БД або файл
  → (опційно) Надсилає підтвердження Сергію в Telegram

Оновлення токена (важливо!)

Long-lived token живе 60 днів. Треба оновлювати:

NEW_TOKEN=$(curl -s "https://graph.threads.net/refresh_access_token?grant_type=th_refresh_token&access_token=$(cat /srv/passepartout/meta/threads/pediatric-news-token.txt)" | jq -r '.access_token')
echo "$NEW_TOKEN" > /srv/passepartout/meta/threads/pediatric-news-token.txt

Додати в cron (~раз на 45 днів).