[chore] solution/backend: 카톡 웹훅에 발화자 properties 로그 — 카카오 로그인 매칭 가능성 확인

user.properties.appUserId 는 봇 설정에 앱키가 물려 있을 때만 오고, 그 값이
**카카오 로그인으로 받는 값과 같다**(카카오 공식 문서). 오면 6자리 코드 절차 없이
사장님을 바로 알아볼 수 있다.

★ 로그인 작업을 다 만들고 나서 "키가 안 온다" 를 알면 그게 제일 비싸다 —
그래서 배선보다 이 한 줄이 먼저다.

★ 값 자체는 남기지 않는다. 사용자 식별자라, 어떤 키가 왔는지와 길이만 남긴다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
hbyang 2026-09-30 15:57:04 +09:00
parent f1d0f765d1
commit 092a350182

View File

@ -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 {}