From 092a3501826d5753ee44e789e19aeb9f0c87fbe6 Mon Sep 17 00:00:00 2001 From: hbyang Date: Wed, 30 Sep 2026 15:57:04 +0900 Subject: [PATCH] =?UTF-8?q?[chore]=20solution/backend:=20=EC=B9=B4?= =?UTF-8?q?=ED=86=A1=20=EC=9B=B9=ED=9B=85=EC=97=90=20=EB=B0=9C=ED=99=94?= =?UTF-8?q?=EC=9E=90=20properties=20=EB=A1=9C=EA=B7=B8=20=E2=80=94=20?= =?UTF-8?q?=EC=B9=B4=EC=B9=B4=EC=98=A4=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EB=A7=A4=EC=B9=AD=20=EA=B0=80=EB=8A=A5=EC=84=B1=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit user.properties.appUserId 는 봇 설정에 앱키가 물려 있을 때만 오고, 그 값이 **카카오 로그인으로 받는 값과 같다**(카카오 공식 문서). 오면 6자리 코드 절차 없이 사장님을 바로 알아볼 수 있다. ★ 로그인 작업을 다 만들고 나서 "키가 안 온다" 를 알면 그게 제일 비싸다 — 그래서 배선보다 이 한 줄이 먼저다. ★ 값 자체는 남기지 않는다. 사용자 식별자라, 어떤 키가 왔는지와 길이만 남긴다. Co-Authored-By: Claude Opus 5 (1M context) --- solution/backend/router/v1/agent/kakao_bot.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/solution/backend/router/v1/agent/kakao_bot.py b/solution/backend/router/v1/agent/kakao_bot.py index 51809b6..4d71470 100644 --- a/solution/backend/router/v1/agent/kakao_bot.py +++ b/solution/backend/router/v1/agent/kakao_bot.py @@ -176,11 +176,21 @@ async def _push(callback_url: str, utterance: str, speaker: str) -> None: async def _handle(body: dict, tasks: BackgroundTasks) -> dict: request = body.get("userRequest") or {} utterance = request.get("utterance") or "" - speaker = (request.get("user") or {}).get("id") or "" + user = request.get("user") or {} + speaker = user.get("id") or "" if not speaker: # 발화자를 모르면 누구의 가게인지도 모른다. 여기서 끝낸다. return _reply("사용자를 확인하지 못했어요.") + # ★ 카카오 로그인 매칭 가능성 확인용(2026-09-30). user.properties.appUserId 는 봇 설정에 + # 앱키가 물려 있을 때만 오고, 그 값이 **카카오 로그인으로 받는 값과 같다**(공식 문서). + # 오면 6자리 코드 절차 없이 사장님을 바로 알아볼 수 있다. + # ★ 값 자체는 남기지 않는다 — 사용자 식별자다. 어떤 키가 왔는지와 길이만 본다. + props = user.get("properties") or {} + if isinstance(props, dict): + LOG.i(f"[agent/kakao] 발화자 키 — properties={sorted(props)} " + f"appUserId={'있음(%d자)' % len(str(props['appUserId'])) if props.get('appUserId') else '없음'}") + # ★ [승인] 버튼(action: block)의 extra 는 그 블록의 스킬 요청에 action.clientExtra 로 돌아온다. # 글 ID 값은 남기지 않고 어떤 키가 왔는지만 남긴다. extra = (body.get("action") or {}).get("clientExtra") or {}