Plank help · updated 2026-08-24
Публикация в Instagram
Подключите профессиональный аккаунт Instagram через официальный API Meta, чтобы ассистент публиковал посты, карусели, Reels и Stories — со всеми ловушками, из-за которых эта настройка идёт медленно.
Agents: fetch the raw markdown of this page at /ru/help/connecting-instagram.md
Публикация в Instagram
Ассистент может публиковать в Instagram через официальный API Meta — посты, карусели, Reels и Stories, — а также читать профиль, комментарии и сообщения.
Настраивать вручную не нужно. Попросите ассистента в чате («подключи наш Instagram, чтобы ты мог публиковать»), и он соберёт скрипт публикации и проведёт вас по тем шагам, которые можете сделать только вы. Эта страница написана для вас обоих: ассистент запрашивает её по адресу https://plank.md/help/connecting-instagram.md перед началом, чтобы подключение прошло чисто, а не через один из тупиков ниже.
Отведите 20 минут и сначала прочитайте раздел «Перед началом». Это самое капризное подключение в Plank. Не потому, что какой-то шаг сложен, а потому что Meta даёт вам три похожих числа, два похожих по названию API и сценарий отказа, в котором всё выглядит работающим, но ничего не происходит. Всего этого можно избежать, проверив три вещи заранее.
Перед началом
Три обязательных условия. Проверьте все три сейчас — каждое, обнаруженное позже, отправляет вас в начало.
1. Аккаунт должен быть профессиональным — Business или Creator. Личный аккаунт вообще не может публиковать через API. Тип меняется в Instagram: Настройки → Тип аккаунта и инструменты.
2. Аккаунт должен быть связан с Facebook-страницей. Вот это болезненно. Если связи нет, API Meta попросту не видит аккаунт: экраны авторизации всё равно появляются, вы всё подтверждаете, а аккаунт молча отсутствует в результатах. Диагностировать нечего, потому что об ошибке никто не сообщает.
Как связать:
- В Instagram: Редактировать профиль → Общедоступная информация о компании → Страница, создайте страницу или выберите существующую.
- Или в Meta Business Suite: Настройки → Аккаунты → Аккаунты Instagram → Добавить → Подключить ресурсы.
3. Знайте, как вы входите в Instagram. Ответьте на это до всего остального — от этого зависит весь путь:
| Как вы входите | Какой API нужен |
|---|---|
| Через Facebook (пароля Instagram у вас может и не быть) | Instagram API with Facebook Login — обычный случай, о нём и вся эта страница |
| Напрямую логином и паролем Instagram | Instagram API with Instagram Login — другой поток с другими названиями разрешений |
Скажите ассистенту, какой вариант ваш. Ошибка здесь означает пройти всю настройку дважды.
Три ID приложения — прочитайте до того, как копировать любое число
Одно приложение Meta показывает вам три разных числовых ID в трёх разных местах, и они невзаимозаменяемы. Это самая частая причина провала настройки.
| ID | Где находится | Для чего | Что будет при ошибке |
|---|---|---|---|
| Meta App ID | App settings → Basic | Facebook Login, Graph API Explorer | — |
| Instagram App ID | Страница продукта Instagram | Только для потока Instagram Login | Invalid App ID либо вход, который завершается и ничего не спрашивает |
| Threads App ID | Страница продукта Threads | Только Threads — см. Публикация в Threads | То же самое |
Когда у вас просят «app ID», имеется в виду Meta App ID из App settings → Basic. Если ассистент дал ссылку авторизации, а страница просто вас логинит и на этом всё — ни запроса разрешений, ни перенаправления, — почти наверняка взят не тот из этих трёх.
Шаг 1 — Создайте приложение Meta
- Откройте developers.facebook.com/apps и нажмите Create App.
- Выберите тип приложения Business.
- Назовите так, чтобы потом узнать, например «Acme Instagram».
- Добавьте продукт Instagram и выберите API setup with Facebook login.
Это всё, что нужно. Продукт Facebook Login for Business добавлять и поле App Domains заполнять не требуется — они относятся к потоку с редиректом, которого следующий шаг намеренно избегает.
Шаг 2 — Получите access token
Это тот шаг, который действительно работает, и он проще, чем кажется. Поток с редиректом и callback вы использовать не будете (см. «Почему не ссылка для входа» ниже).
- Откройте Graph API Explorer.
- В поле Meta App выберите только что созданное приложение — по его Meta App ID.
- Установите версию API v26.0.
- В качестве типа токена выберите User Access Token.
- Добавьте разрешения:
pages_show_listpages_read_engagementinstagram_basicinstagram_content_publishinstagram_manage_commentsinstagram_manage_insightsinstagram_manage_contents— нужно, только если хотите, чтобы ассистент мог удалять публикации
- Нажмите Generate Access Token и подтвердите в открывшемся окне Facebook. Выберите страницу, связанную с вашим аккаунтом Instagram.
- Скопируйте токен и пришлите его ассистенту.
Дальше ассистент найдёт, какая страница связана с вашим аккаунтом Instagram, сохранит токен именно этой страницы и прочитает профиль для проверки — ничего не публикуя.
Токен — это живой доступ. Любой, у кого он есть, может публиковать от вашего имени, пока токен не истечёт (около 60 дней). Он сохраняется внутри рабочего пространства, поэтому им может воспользоваться каждый, у кого есть доступ к этому пространству. Если токен оказался там, где не хотелось бы, создайте новый в Explorer — старый перестанет быть актуальным.
Если instagram_manage_contents не предлагается
Это относительно новое разрешение, и его может потребоваться запросить: App Review → Permissions and Features, найдите его и нажмите Request advanced access. Обратите внимание на написание: instagram_manage_contents, во множественном числе. Разрешения instagram_manage_content не существует, и поиск в единственном числе ничего не находит.
Прежде чем тратить время на App Review ради него, прочитайте раздел «Удаление публикаций сейчас работает ненадёжно» ниже: разрешение выдаётся нормально, но endpoint удаления Meta на момент последней проверки падал в любом случае.
Почему не ссылка для входа?
Кажется, что «вход через Facebook» — самый чистый способ. Это не так, и отказ происходит так, что съедает уйму времени:
- Facebook Login for Business возвращает токен во фрагменте URL — в части после
#. Страница callback её прочитать не может, поэтому после выбора аккаунта поток просто… останавливается. Ни ошибки, ни завершённого подключения, ни повода что-то сообщить. - Кроме того, нужен отдельный продукт Facebook Login for Business, а также точное совпадение настроек App Domains (App settings → Basic) и Valid OAuth Redirect URIs. Расхождение всплывает как «Can't load URL: the domain of this URL isn't included in the app's domains» — звучит совсем не о том и ровно там, где проблему с настройками ожидаешь меньше всего.
Путь через Graph API Explorer обходит всё это. Если ассистент предлагает ссылку авторизации, вполне нормально ответить: «давай лучше через Graph API Explorer».
Шаг 3 — Публикация
Просите обычными словами: «опубликуй это изображение в Instagram с такой подписью», «выложи эти пять экранов как Stories». Ассистент всегда сначала делает пробный прогон, показывая, что именно будет опубликовано, прежде чем что-то уйдёт.
Что важно знать: Instagram не принимает загрузку файлов через API. Meta скачивает медиа по публичной ссылке, поэтому каждому изображению или видео сначала нужен публичный URL. Ассистент делает это сам: публикует файл из рабочего пространства и передаёт Meta прямую ссылку — материалы остаются в Plank, а не уходят на сторонний хостинг.
Лимиты, которые стоит знать
| Публикаций за 24 часа | 100 |
| Элементов в карусели | не более 10 |
| Размер изображения Story | 1080 × 1920 |
| Срок жизни токена | ~60 дней |
Stories ведут себя иначе
- У Stories нет подписи — текст должен быть частью изображения.
- Они публикуются по одной, по порядку. Ассистент дожидается завершения каждой перед отправкой следующей, поэтому нумерованная серия сохраняет последовательность.
- Опубликованную Story нельзя отредактировать. Исправление означает удалить её и выложить замену, поэтому изображения стоит просмотреть до публикации.
- Держите смысловое содержимое подальше от краёв — интерфейс Instagram перекрывает верх и низ экрана.
Удаление публикаций сейчас работает ненадёжно
По состоянию на 7 августа 2026 года endpoint удаления Meta возвращает внутреннюю ошибку 2207085 даже при выданном instagram_manage_contents и на токене пользователя, и на токене страницы. Это на стороне Meta, ваша настройка это не исправит. Удаляйте через приложение Instagram. Возможно, с тех пор это починили — одна повторная попытка перед откатом к ручному удалению оправданна.
Когда перестало работать
Токены живут около 60 дней, и истёкший токен — обычная причина того, что публикация вдруг перестала проходить. Попросите ассистента обновить его или создайте новый в Graph API Explorer ровно как в шаге 2.
Но не всякий сбой означает переподключение — а переподключение, когда дело не в нём, просто заставит пройти настройку заново:
| Что вы видите | Что это обычно значит |
|---|---|
invalid_grant, отозванный доступ или 401, который остаётся после обновления | Учётные данные действительно мертвы — переподключайтесь |
| 403, сообщение о квоте или нехватке разрешения | С подключением всё в порядке, дело в разрешении или лимите |
| Аккаунт не найден | Разорвалась связь с Facebook-страницей — проверьте условие 2 |
Для ассистента: детали реализации
Выбор потока. Спросите, как пользователь входит в Instagram, до того как что-то предлагать. Вход через Facebook ⇒ Instagram API with Facebook Login (scopes instagram_*, токены с graph.facebook.com/v26.0). Прямые учётные данные Instagram ⇒ Instagram Login (scopes instagram_business_*, graph.instagram.com). Эти два набора scopes невзаимозаменяемы.
Проверьте связь со страницей до любого OAuth. Вызовите /me/accounts с fields=id,name,access_token,instagram_business_account{id,username} и убедитесь, что нужный username действительно присутствует. Если нет — остановитесь и попросите пользователя связать страницу: никакой поток авторизации это не обойдёт, а продолжение выдаёт череду шагов, которые выглядят успешными.
Удалённые поля в Graph API v26. account_type больше нельзя запросить ни внутри вложенного instagram_business_account, ни напрямую у объекта. Запрос этого поля роняет весь вызов. Оно и не нужно: наличие instagram_business_account уже доказывает, что аккаунт профессиональный.
Используйте Page access token для публикации и удаления, а не пользовательский — именно он привязан к бизнес-аккаунту Instagram.
Публикация состоит из двух шагов: создать медиаконтейнер (POST /<ig-user-id>/media), опрашивать его до status_code = FINISHED, затем опубликовать (POST /<ig-user-id>/media_publish с creation_id). Дольше всего готовятся Reels; прежде чем считать контейнер зависшим, дайте примерно минуту. Для каруселей сначала создаются и дожидаются готовности дочерние контейнеры, затем родительский с media_type=CAROUSEL.
Переносы строк в подписи — настоящие, а не литеральный \n. Instagram показывает те символы, которые вы отправили, и подпись, собранная как шелловская строка в двойных кавычках, придёт с видимым обратным слэшем и буквой n посреди поста. Запишите подпись в файл и дайте инструменту прочитать её как есть (jq --rawfile caption /tmp/ig-caption.txt или --data-urlencode "caption@/tmp/ig-caption.txt"); для однострочной — CAPTION=$'Первая строка.\n\nВторая строка.': внутри $'…', и только там, \n — это перенос. В Python "\n" внутри строки уже настоящий перенос; ловушка — шелловская.
Stories: передавайте media_type: STORIES и не отправляйте подпись — подпись в контейнере Story отклоняется. Учитывайте явно заданный mediaType, а не подставляйте изображениям IMAGE по умолчанию.
Публичные URL медиа. Meta скачивает файл сама, поэтому нужен URL, отдающий сырые байты с image- или video-типом содержимого. Опубликуйте файл рабочего пространства и используйте endpoint /download:
https://api.plank.md/public/w/<workspace-slug>/s/<share-token>/download
Проверено: отдаёт content-type: image/png с корректной длиной. Не используйте /content — он возвращает JSON с файлом в виде UTF-8-строки, и Meta это прочитать не может. Перед созданием любого контейнера убедитесь, что каждый URL отдаёт 200 и image-тип содержимого.
Учётные данные лежат в scripts/instagram/token.json внутри рабочего пространства, а на скрипте публикации стоит заголовок @plank-integration, чтобы он появился в боковой панели «Интеграции». См. Скрипты рабочего пространства и боковая панель, а про подключения в целом — Подключение ваших инструментов.
Всегда сначала --dry-run, и никогда не публикуйте без подтверждения пользователем точного текста и медиа.