diff --git a/solution/backend/services/external/threads.py b/solution/backend/services/external/threads.py index aa74304..1f69187 100644 --- a/solution/backend/services/external/threads.py +++ b/solution/backend/services/external/threads.py @@ -42,8 +42,18 @@ def _read(res): raise SocialError("THREADS_INVALID_RESPONSE") from ex if res.status_code >= 400 or data.get("error"): error = data.get("error") or {} + # ★ 플랫폼이 준 사유를 코드에 붙인다. `THREADS_REJECTED_400` 만으로는 무엇이 틀렸는지 + # 알 수 없어서 — 코드가 만료됐는지, 리디렉션 URI 가 안 맞는지, 권한이 모자란지 — + # 실제로 원인을 좁히지 못했다(실측 2026-09-18: 연결 실패가 400 이라는 것만 알고 + # Meta 가 뭐라고 했는지는 어디에도 안 남아 세 번을 헛짚었다). + # ★ 남기는 것은 message·subcode 뿐이다. 토큰·시크릿·code 는 담지 않는다 — + # 이 문자열은 로그로 가고, 로그는 우리가 아닌 사람도 본다. + detail = str(error.get("message") or "")[:160] + subcode = error.get("error_subcode") or error.get("code") raise SocialError( - f"THREADS_REJECTED_{res.status_code}", + f"THREADS_REJECTED_{res.status_code}" + + (f"[{subcode}]" if subcode else "") + + (f" {detail}" if detail else ""), reauth=error.get("code") == 190 or res.status_code == 401, ) return data