关于 instagram
instagram 是通过 Instagram Graph API 发布图片、视频、Reels 和轮播内容的技能。它涵盖账号解析、媒体处理、发布,以及记录已确认的内容链接。
主要功能
- 01解析关联的专业账号
- 02发布图片和视频
- 03创建 Reels 和轮播内容
- 04检查媒体处理状态
- 05记录已发布内容链接
适用场景
- 01发布带说明文字的图片
- 02处理完成后发布 Reels
- 03发布多项内容组成的轮播
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ acedatacloud/ skills --skill instagram安装后在 Claude Code 中输入/instagram确认已加载。
详细介绍
使用 curl + jq 调用 Instagram Graph API(graph.facebook.com)。连接器会注入 $INSTAGRAM_ACCESS_TOKEN(包含 instagram_content_publish + pages_read_engagement 权限的令牌;Facebook Page 令牌或 Instagram-Login 用户令牌)以及可选的 $INSTAGRAM_IG_USER_ID。切勿回显这些值。
Instagram 只能向关联 Facebook Page 的专业版(Business 或 Creator)账户发布图片/视频/Reels。不能发布纯文本帖子。
解析 Instagram 账户 ID
如果已设置 $INSTAGRAM_IG_USER_ID,请使用它。否则,从令牌中推导——先尝试 Page 令牌路径(/me 就是 Page),再回退到用户令牌路径(/me/accounts → 关联的 Page → IG 账户),这样连接器接受的两种令牌都能正确解析:
if [ -n "$INSTAGRAM_IG_USER_ID" ]; then
IGID="$INSTAGRAM_IG_USER_ID"
else
# Page access token: /me IS the Page, read its linked IG account directly
IGID=$(curl -sS "https://graph.facebook.com/v21.0/me?fields=instagram_business_account&access_token=$INSTAGRAM_ACCESS_TOKEN" | jq -r '.instagram_business_account.id // empty')
if [ -z "$IGID" ]; then
# User access token: list the managed Page, then its linked IG account
PAGE=$(curl -sS "https://graph.facebook.com/v21.0/me/accounts?access_token=$INSTAGRAM_ACCESS_TOKEN" | jq -r '.data[0].id // empty')
IGID=$(curl -sS "https://graph.facebook.com/v21.0/$PAGE?fields=instagram_business_account&access_token=$INSTAGRAM_ACCESS_TOKEN" | jq -r '.instagram_business_account.id // empty')
fi
fi
echo "ig_user_id=$IGID"
错误以 JSON 格式返回,包含 error.message / error.code——请原样显示。401 / OAuthException → 令牌已过期或缺少权限;IGID 为 null → 令牌未关联专业版 IG 账户/Page(参见“注意事项”)。如有需要,请重新连接。
发布单张图片(两步:创建容器 → 发布)
请先与用户确认说明文字和图片。 image_url 必须是公开的 JPEG URL(Instagram 会在服务器端使用 cURL 获取):
CID=$(curl -sS -X POST "https://graph.facebook.com/v21.0/$IGID/media" \
-d "image_url=https://cdn.acedata.cloud/xxxx.jpg" \
--data-urlencode "caption=One endpoint → posters, cards, mockups. #AI #API" \
-d "access_token=$INSTAGRAM_ACCESS_TOKEN" | jq -r .id)
echo "container=$CID"
curl -sS -X POST "https://graph.facebook.com/v21.0/$IGID/media_publish" \
-d "creation_id=$CID" -d "access_token=$INSTAGRAM_ACCESS_TOKEN" | jq .
# → {"id":"<IG_MEDIA_ID>"}
获取永久链接并提供给用户:
curl -sS "https://graph.facebook.com/v21.0/<IG_MEDIA_ID>?fields=permalink&access_token=$INSTAGRAM_ACCESS_TOKEN" | jq -r .permalink
Reels/视频
使用 media_type=REELS + 公开的 video_url 创建,然后在发布前轮询容器状态,直到状态为 FINISHED(视频处理需要时间):
CID=$(curl -sS -X POST "https://graph.facebook.com/v21.0/$IGID/media" \
-d "media_type=REELS" -d "video_url=https://cdn.acedata.cloud/xxxx.mp4" \
--data-urlencode "caption=..." -d "access_token=$INSTAGRAM_ACCESS_TOKEN" | jq -r .id)
# poll until the video finishes processing (up to ~5 min) BEFORE publishing —
# publishing an IN_PROGRESS container is rejected:
for i in $(seq 1 60); do
ST=$(curl -sS "https://graph.facebook.com/v21.0/$CID?fields=status_code&access_token=$INSTAGRAM_ACCESS_TOKEN" | jq -r .status_code)
echo "status=$ST"; [ "$ST" = "FINISHED" ] && break
[ "$ST" = "ERROR" ] || [ "$ST" = "EXPIRED" ] && { echo "container failed: $ST"; break; }
sleep 5
done
curl -sS -X POST "https://graph.facebook.com/v21.0/$IGID/media_publish" \
-d "creation_id=$CID" -d "access_token=$INSTAGRAM_ACCESS_TOKEN" | jq .
轮播(2–10 个项目)
将每个子项目设为 is_carousel_item=true 后,创建一个 media_type=CAROUSEL 容器,设置 children=<ID1>,<ID2>,... + caption,然后发布轮播 ID。
注意事项
- 不能发布纯文本帖子——Instagram 要求图片或视频。图片请使用公开的 JPEG(PNG/其他格式会被拒绝;扩展 JPEG(如 MPO/JPS)也不行)。
- 需要专业版账户——必须是关联 Facebook Page 的 Business/Creator IG 账户。如果
instagram_business_account为 null,说明该账户不是专业版账户或尚未关联;用户必须在 IG/Page 设置中解决此问题。 - 媒体必须是 Instagram 可访问服务器上的公开 URL;本地文件无法使用。请先托管到 cdn.acedata.cloud。
- **速率限制:**每 24 小时最多发布 100 条 API 帖子(轮播计为 1 条)。通过
GET /$IGID/content_publishing_limit检查。 - **Page 发布授权(PPA):**部分 Page 必须先完成 PPA,API 发布才能生效——如果 API 错误提到 PPA,请原样显示。
- API 版本:如果遇到版本/弃用错误,请确保
vXX.0路径为最新版本。
记录输出
成功发布并获取有效永久链接后,请调用内置的 publish_artifact 工具一次,让用户能在 My Outputs 中查看:
publish_artifact(kind="image", channel="instagram", title="<title>", url="<the REAL permalink>", status="delivered")
使用实际返回的 URL——切勿伪造。每个已发布项目只调用一次,且仅在确认交付后调用;如果发布失败,请跳过(或使用 status="failed")。
参见 _shared/artifacts.md。