Instagram API Python 教程:账号、帖子、评论和 Reels 字幕(2026)
Instagram 官方 API 只服务你自己拥有或管理的专业账号。要拿任意账号的公开数据,按顺序用四个接口:Instagram 账号信息、Instagram 账号帖子、Instagram 帖子评论和 Instagram 视频字幕。下面的示例一共 8 次调用,最多花费 $0.032;失败的调用不扣费。
更新于
Instagram 有官方 API,而且在某一类事情上就是最合适的工具。Meta 的 Instagram Platform 概览把它描述为一组面向 Instagram 专业账号(即商家账号和创作者账号)的 API,账号要么是你自己拥有或管理的,要么是登录了你的应用的用户的。能做的事包括发布内容、管理评论、收发私信和查看数据洞察。对别人的账号,它提供 Business Discovery,可以拿到其他专业账号的基础信息和指标,有年龄限制的账号则什么都不返回。如果你要处理的是自己的账号,就用 Meta 的官方 API。
这篇教程解决的是另一件事:用 Python、只靠 requests,读取任意公开账号的公开数据,比如竞品、想合作的博主、在研究的品牌。最后每个账号得到一个 JSON 文件:账号资料、最近的帖子和各项数据、讨论最多的帖子下的评论,以及播放最多的 Reels 里说了什么,带时间戳。
不需要登录 Instagram,不用建 Meta 应用,也不用 access token。每次调用就是带着 key 发一个 HTTPS 请求。
分步操作
第一步:账号资料
Instagram 账号信息接收 username(带不带 @ 都行),返回一个账号,每次 $0.004:id(数字账号 ID)、username、name、bio、followers、following、posts、verified 和 avatar_url。加 view=full 还有 ext.private(是否私密)、ext.website、ext.links(简介里的链接)、ext.category 和 ext.business。likes 为 null,因为 Instagram 不显示账号的累计点赞。
curl -G "https://api.okdata.online/v1/instagram/users/get" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
-d username=northfieldbakery -d view=full
往下走之前先看 ext.private。私密账号的资料能拿到,但它的帖子不公开。
第二步:帖子
Instagram 账号帖子接收 username 和 type:all(默认,全部帖子)或 reel(只要 Reels,取自账号的 Reels 标签页)。帖子从新到旧,每页 12 条,每页 $0.004。每条帖子有:
id:短码,也就是链接里/p/或/reel/后面那一段,比如DQx7pLk2mVe。评论和字幕接口都用它。type:Reels 和视频为video,图片和多图帖为image。text(文案)、hashtags、images、published_at和url。metrics.likes、metrics.comments,视频还有metrics.views(播放数)。
加 view=full 会多出 ext.duration_s(时长)、ext.coauthors(合拍帖的其他作者)、ext.product_type 和 ext.media_id。要下一页,就把 page.next_cursor 作为 cursor 传回去;page.has_more 为 false 时停下。
curl -G "https://api.okdata.online/v1/instagram/users/posts/list" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
-d username=northfieldbakery -d type=all -d view=full
第三步:评论
Instagram 帖子评论接收短码 id,或者帖子链接 url。评论从新到旧,每页约 15 条,每页 $0.004。每条有 id、text、author.username、likes、replies(下面有几条回复)和 published_at;author.name 为 null。想看某条评论下的回复,把它的 id 和帖子短码(作为 post_id)传给Instagram 评论回复。
curl -G "https://api.okdata.online/v1/instagram/posts/comments/list" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
-d id=DQx7pLk2mVe
第四步:Reels 里说了什么
Instagram 视频字幕接收短码或链接,返回 Reel 或视频帖子里说的话,每次 $0.004:带 start、end(单位秒)的 segments,以及完整的 text。只处理两分钟以内的视频。lang 返回 und(未识别),语言要紧的话自己检测一下。视频里没有人说话时返回 not_found,不扣费。
curl -G "https://api.okdata.online/v1/instagram/posts/transcript/get" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
-d id=DRb3nVw8kQz
第五步:完整脚本
脚本最多调用 8 次:1 次账号资料、最多 3 页帖子、2 页评论、2 份字幕。每个逻辑请求都有自己的 Idempotency-Key,网络断了重试也不会扣两次钱。遇到 rate_limited 就等 retry_after_seconds 秒;其他错误直接带着错误码和信息停下。
import json
import os
import time
import uuid
import requests
API = "https://api.okdata.online"
KEY = os.environ["OKDATA_API_KEY"]
USERNAME = "northfieldbakery"
POST_PAGES = 3 # 每页 12 条帖子;每页一次调用
COMMENT_POSTS = 2 # 评论最多的几条帖子,各读第一页评论
TRANSCRIPTS = 2 # 两分钟以内、播放最多的几条视频
class ApiError(Exception):
def __init__(self, body):
super().__init__(f"{body['code']}: {body['message']} (charged: {body['charged']})")
self.code = body["code"]
def call(path, **params):
headers = {"Authorization": f"Bearer {KEY}", "Idempotency-Key": str(uuid.uuid4())}
for attempt in range(3):
try:
body = requests.get(API + path, headers=headers, params=params, timeout=90).json()
except requests.RequestException:
time.sleep(2 ** attempt) # 重试沿用同一个 key,不会重复扣费
continue
if body["code"] == "ok":
return body
if body["code"] == "rate_limited":
time.sleep(body.get("retry_after_seconds") or 2)
continue
raise ApiError(body)
raise RuntimeError(f"{path}: no answer after 3 attempts")
profile = call("/v1/instagram/users/get", username=USERNAME, view="full")["data"]["item"]
if profile["ext"]["private"]:
raise SystemExit(f"@{USERNAME} is private; its posts are not public")
posts, cursor = [], None
for _ in range(POST_PAGES):
body = call("/v1/instagram/users/posts/list", username=USERNAME, view="full", **({"cursor": cursor} if cursor else {}))
posts += body["data"]["items"]
if not body["page"]["has_more"]:
break
cursor = body["page"]["next_cursor"]
for post in sorted(posts, key=lambda p: p["metrics"]["comments"] or 0, reverse=True)[:COMMENT_POSTS]:
post["comment_page"] = call("/v1/instagram/posts/comments/list", id=post["id"])["data"]["items"]
videos = [p for p in posts if p["type"] == "video" and (p["ext"]["duration_s"] or 0) <= 120]
for post in sorted(videos, key=lambda p: p["metrics"]["views"] or 0, reverse=True)[:TRANSCRIPTS]:
try:
post["transcript"] = call("/v1/instagram/posts/transcript/get", id=post["id"])["data"]["item"]
except ApiError as err:
if err.code != "not_found": # 视频里没人说话:不扣费
raise
with open(f"{USERNAME}.json", "w", encoding="utf-8") as f:
json.dump({"profile": profile, "posts": posts}, f, ensure_ascii=False, indent=2)
print(profile["followers"], "followers;", len(posts), "posts saved")
想往前多翻,就调大 POST_PAGES:10 页约 120 条帖子,光帖子就要 $0.04。
注意事项
- 短码就是帖子 ID。 所有帖子类接口都接收短码作为
id,或者完整链接作为url。别的工具要 Instagram 的数字媒体 ID 时,用ext.media_id。 - 评论只能从新到旧。 没有按点赞排序的选项。想找最有共鸣的评论,多读几页,自己按
likes排。 - 哪些字段是空的。 帖子没有
title;分享、收藏、转发数为 null,因为 Instagram 不公开。只有视频有播放数。 - 只看 Reels。
type=reel列的是 Reels 标签页。研究视频内容时用它,可以省下翻图片帖的那些页。 - 失败的调用不收钱,已删除帖子和没有人声的视频返回的
not_found也不收钱。 - 用官方 API 看别人的账号。 Business Discovery 能拿到其他专业账号的基础信息和指标。如果这些就够用,而且你本来就有 Meta 应用,用它也很好。
要权衡 Meta 官方 API 和第三方 API 哪个更适合你的项目,看官方 API 和第三方社媒数据怎么选。长期盯几个账号的做法,在竞品监控里。
示例花费
一个账号的资料、最近三页帖子、评论最多的两条帖子的第一页评论,以及播放最多的两条 Reels 的字幕
| 接口 | 调用次数 | 单价 | 小计 |
|---|---|---|---|
| Instagram 账号信息 | 1 | $0.004 | $0.004 |
| Instagram 账号帖子 | 3 | $0.004 | $0.012 |
| Instagram 帖子评论 | 2 | $0.004 | $0.008 |
| Instagram 视频字幕 | 2 | $0.004 | $0.008 |
| 合计 | 8 | $0.032 |
按本页生成时的价格计算。失败的调用不扣费。
在你的 AI 里用(MCP)
先接好 MCP 服务,然后直接说你要什么。智能体会自己找到这些接口、看清价格,再用你的余额调用。
可以这样说查一下 Instagram 账号 northfieldbakery:粉丝数和简介,最近 36 条帖子的点赞、评论和播放,评论最多的两条帖子的第一页评论,以及播放最多的两条 Reels 里说了什么。总结一下它的粉丝最常问什么。
智能体第一次调用 call 工具时发送的内容
{
"endpoint": "instagram.users.get",
"params": {
"username": "nasa"
},
"idempotency_key": "<新的 UUID>"
}