๊ฐ์ ๊ฒ์๋ฌผ์ ์ธ ๋ฒ ์ฌ๋ฆฌ๊ณ ๋์์ผ ์ด์ ๋ฅผ ์์๋ค
์๋ํ ๋ด์ ํ ์คํธํ๋ฉด์ limit์ด ์๊พธ ๊ฑธ๋ ธ๋ค. AIํํ ๋ฌผ์ด๋ดค๋๋ ์ด๋ฐ ๋ง์ด ๋์์๋ค.
"์ฑ์ด ๊ฐ๋ฐ ์ค ์ํ๋ผ ์ ์ฝ์ด ์์ด์. 24-48์๊ฐ ๊ธฐ๋ค๋ฆฌ๋ฉด ํ๋ฆด ๊ฑฐ์์."
๊ทธ๋ด์ธํ๋ค. ๋ฏฟ์๋ค.
Meta ์ฝ์ ํ ๋ผ๊ตด
๊ธฐ๋ค๋ ธ๋ค. ๋ ์ ๋๋ค.
๊ทธ๋ผ ์ฑ ๊ฒ์ ๋ฌธ์ ์ธ๊ฐ ์ถ์๋ค. Meta ๊ฐ๋ฐ์ ์ฝ์ ๋ค์ด๊ฐ๋ค. AI๊ฐ ์๋ ค์ค ๋ฒํผ์ด ์์๋ค. ๋ฉ๋ด๊ฐ ๋ฌ๋๋ค. ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ๋ค์ด๊ฐ๋ค. ๊ถํ ํญ๋ชฉ ์ฐพ์์ ์ถ๊ฐํ๋ค. ์ฑ ๊ฒ์ ์ ์ฒญ ํ๋ฉด ๋ค์ด๊ฐ๋ค. ๋ญ๊ฐ ํ ์คํธ๋ฅผ ์๋ฃํด์ผ ํ๋ค๊ณ ํด์ ์คํํด๋ดค๋ค. ๋ค์ ๊ถํ ๋บ๋ค๊ฐ ๋ฃ์๋ค. ํ ํฐ ์ฌ๋ฐ๊ธ ๋ฐ์๋ค. ๋ ํ ์คํธ.
์ธ์ฆ ํ๋ฉด๊น์ง ๋ค์ด๊ฐ๋๋ ์ฌ์ ์ ๋ฑ๋ก ์ ๋ณด๋ฅผ ๋ฃ์ผ๋ผ๊ณ ํ๋ค. ๊ฑฐ๊ธฐ์ ๋ฉ์ท๋ค. ์ด๊ฑด ์๋๋ค ์ถ์๋ค.
Graph API Explorer ์ด์ด์ ์ง์ ๋ค์ ์ด๊ธฐ ์์ํ๋ค. ๋ญ๊ฐ ๋์ค๊ธด ํ๋๋ฐ ๋ญ ๋ณด๊ณ ์๋ ๊ฑด์ง๋ ๋ถ๋ถ๋ช ํ๋ค.
"์ค๋ณต ์๋ฃ๊ฐ ์ ์ด๋ ๊ฒ ๋ง๋"
๊ทธ๋ฌ๋ค ์ธ์คํ๊ทธ๋จ์ ์ง์ ์ด์ด๋ดค๋ค. ๊ฐ์ ๊ฒ์๋ฌผ์ด ์ธ ๊ฐ์๋ค. ํผ๋ ์ ์ฒด ๋ณด๋๊น 12๊ฐ. ์ฌ๋ฌ ๊ธฐ์ฌ์์ ์ค๋ณต์ด ๊ฐ๊ฐ ์์ฌ์์๋ค.
์ฝ๋ ํ๋ฆ์ ๋ค์ ๋ฐ๋ผ๊ฐ๋ค. 403 ๋ฐ์ผ๋ฉด ์คํจ๋ก ์ฒ๋ฆฌํ๊ณ , DB ์ ๋ฐ์ดํธ ์ ํ๊ณ , ๋ค์ ์ค์ผ์ค์ ์ฌ์๋. ๊ทธ ์ฌ์๋๋ 403. ๋ ์ฌ์๋. ๊ทผ๋ฐ ์ธ์คํ์๋ ๋งค๋ฒ ์ฌ๋ผ๊ฐ๋ค. ๋ช ์ฌ์ดํด ๋๊ณ ๋๋ ์ด๋ ๊ฒ ๋๋ค.
๋ฐ์ ์๋ฌ:
{
"error": {
"message": "Application request limit reached",
"type": "OAuthException",
"code": 4,
"error_subcode": 2207051,
"is_transient": false
}
}
rate limit์ด๊ฒ ์ง ํ๋ค. ํ์ธํด๋ดค๋ค:
r = await client.get(
f"{GRAPH_URL}/{user_id}/content_publishing_limit",
params={"fields": "config,quota_usage", "access_token": token}
)
quota_usage: 0. ํ๋์ ์ ํ ์ ๊ฑธ๋ ค์์๋ค. x-app-usage ํค๋๋ 0%. rate limit์ด ์๋์๋ค.
ํ๋ ์ฐจ๋จ์ธ๊ฐ. ๊ทผ๋ฐ ํ๋ ์ฐจ๋จ์ด ๋์ผ๋ฉด ์ด๋๊ฐ ๋ฐ ๊ฑฐ ์๋? ์ฑ, Business Suite, ๊ฐ๋ฐ์ ์ฝ์. ์๋ฌด๊ฒ๋ ์์๋ค. ๊ฒฝ๊ณ ๋, ๋ฐฐ๋๋, ํ์ ํ๋๋.
ํ๋ ์ฐจ๋จ์ ์ด๋์๋ ์ ๋ฌ๋ค. ์๋ฌ ์๋ต์ is_transient: false๊ฐ ์ ์ผํ ์ ํธ๋ค. rate limit์ ๋ณดํต is_transient: true์ 24์๊ฐ ํ ํ๋ฆฐ๋ค. false๋ฉด ๊ธฐ๋ค๋ฆฐ๋ค๊ณ ํด๊ฒฐ ์ ๋๋ค. ์ด๊ฒ ๊ตฌ๋ถ ๊ธฐ์ค์ด์๋ค.
์์ธ์ ํ ์คํธํ๋ฉด์ 1์๊ฐ ์์ ๊ฒ์๋ฌผ 13๊ฐ๋ฅผ ์ฌ๋ฆฐ ๊ฑฐ์๋ค. ์ผ์ผ ํ๋ 25๊ฐ์ ํ์ฐธ ๋ชป ๋ฏธ์น๋๋ฐ. ๋จ์๊ฐ์ ๋ชฐ์ ์ฌ๋ฆฌ๋ฉด ์๋ํ ํจํด์ผ๋ก ๊ฐ์ง๋ผ์ ๋ณ๋ ์ ํ์ด ๊ฑธ๋ฆฐ๋ค. ๋ฌธ์์ ์๋ค.
์ด ์ฐจ๋จ ์ํ์์ media_publish๋ 403์ ๋ฑ๋๋ฐ ๊ฒ์๋ฌผ์ ์ฌ๋ผ๊ฐ๋ค. ์ฝ๋๊ฐ 403์ ์คํจ๋ก๋ง ์ฒ๋ฆฌํ์ผ๋ ์ฌ์๋ํ๊ณ , ์ฌ์๋๋ง๋ค ์ค๋ณต์ด ์์๋ค.
์ด๋ ๊ฒ ๊ณ ์ณค๋ค:
async def _publish_container(client, container_id):
resp = await client.post(
f"{GRAPH_URL}/{IG_USER_ID}/media_publish",
params={"creation_id": container_id, "access_token": IG_TOKEN},
)
if resp.is_success:
return resp.json().get("id")
if resp.status_code == 403:
await asyncio.sleep(3)
check = await client.get(
f"{GRAPH_URL}/{IG_USER_ID}/media",
params={"fields": "id,timestamp", "limit": 1, "access_token": IG_TOKEN},
)
if check.is_success:
data = check.json().get("data", [])
if data:
ts = datetime.fromisoformat(data[0]["timestamp"].replace("Z", "+00:00"))
if datetime.now(timezone.utc) - ts < timedelta(seconds=60):
return data[0]["id"]
resp.raise_for_status()
403 ๋ฐ์ผ๋ฉด ๋ฐ๋ก ์ต๊ทผ ๋ฏธ๋์ด ์กฐํ. 60์ด ์ด๋ด์ ์ฌ๋ผ์จ ๊ฒ ์์ผ๋ฉด ์ฑ๊ณต์ผ๋ก ์น๋ค.
"์ถ๊ฐํ๋๋ฐ ํด๋ณผ๋?" ๊ทธ๋ฆฌ๊ณ ๋ ์คํจ
์ค๋ณต 12๊ฐ ์ง์์ผ ํ๋ค. ์ญ์ ์ instagram_manage_contents ๊ถํ์ด ํ์ํ๋ฐ ๋ด ํ ํฐ์ ์์๋ค.
๊ถํ ์ถ๊ฐ. ํ์ธ. ์ญ์ ์๋.
{"error": {"message": "(#10) Insufficient permissions", "code": 10}}
์คํจ. ๋ค์. ๊ฐ์ ์๋ฌ. ์ฝ์์ ๋ถ๋ช ํ ์๋๋ฐ.
OAuth ํ ํฐ์ ๋ฐ๊ธ ์์ ์ scope๋ฅผ ๊ณ ์ ์ผ๋ก ๊ฐ์ง๋ค. ์ฑ์ ๊ถํ ์ถ๊ฐํด๋ ๊ธฐ์กด ํ ํฐ์ ๊ทธ๋๋ก๋ค. ์๋ก ๋ฐ๊ธ๋ฐ์์ผ ํ๋ค.
ํ ํฐ์ด ์ค์ ๋ก ๋ญ ๊ฐ๊ณ ์๋์ง ๋ณด๋ ค๋ฉด:
r = await client.get(
"https://graph.facebook.com/v22.0/me/permissions",
params={"access_token": token}
)
granted = [p["permission"] for p in r.json()["data"] if p["status"] == "granted"]
instagram_manage_contents๊ฐ ์์ผ๋ฉด Graph API Explorer์์ scope ์ฒดํฌํ๊ณ ์ฌ๋ฐ๊ธ. ๊ทธ ๋ค์์ ๋๋ค.
์ง์ง ์์ธ ์กฐํฉ
| ์ ํธ | ์๋ฏธ |
|---|---|
quota_usage: 0์ธ๋ฐ 403 |
ํ๋ ์ฐจ๋จ (rate limit ์๋) |
is_transient: false |
๊ธฐ๋ค๋ ค๋ ์ ํ๋ฆผ |
| 403์ธ๋ฐ ์ธ์คํ์ ๊ฒ์๋จ | ์ฐจ๋จ ์ํ์์๋ ๊ฒ์๋ ํต๊ณผํจ |
| ํ๋ ์ฐจ๋จ์ด UI์ ํ์๋จ | ์ ๋จ, ์ด๋์๋ |
API ๋์์ ๋ฌธ์์ ์๊ณ , AI๋ ์์ ์๊ฒ ํ๋ฆฐ ๊ฒฝ๋ก๋ฅผ ์๋ ค์คฌ๊ณ , ๊ทธ ๊ฒฝ๋ก์ ์ฝ์ UI๋ ๋ ๋ฐ๋์ด์์๋ค. ์ด๋์๋ถํฐ ์๋ชป๋๋์ง ์ฐพ๋ ๊ฒ ์ ์ผ ์ด๋ ค์ ๋ค.
AI๊ฐ ์๋ ค์ฃผ๋ ์ฝ์ ๋ฉ๋ด๋ ์ค์ ๋ ๋ค๋ฅผ ์ ์๋ค. API๊ฐ ์ด์ํ๋ค ์ถ์ผ๋ฉด UI ๋ง๊ณ ์๋ต ํ๋ ๋จผ์ ๋ด๋ผ. is_transient ํ๋๊ฐ ๋์๋ณด๋๋ณด๋ค ์ ์งํ๋ค.
์คํ ํ๋ ๋ ๋ ธ๋ค. ์ค๋ณต 12๊ฐ, Meta ํ ๋ผ๊ตด, ๊ถํ ์ฝ์ง. ๊ทธ๋๋ง ๊ฑด์ง ๊ฑด ์ด ๊ธ์ด๋ค.
Instagram Graph API v22.0. ์นด๋๋ด์ค ์๋ ๋ฐํ ๋ด ๋ง๋ค๋ฉด์ ๊ฒช์ ๋ด์ฉ. ๋ด์ @dogfootbro.ai์ ์ฌ๋ผ๊ฐ๋ค.











