diff --git a/backend/app/routers/share.py b/backend/app/routers/share.py
index b483595..e6641d5 100644
--- a/backend/app/routers/share.py
+++ b/backend/app/routers/share.py
@@ -12,10 +12,14 @@ from __future__ import annotations
import html
-from fastapi import APIRouter
+from fastapi import APIRouter, Depends
from fastapi.responses import HTMLResponse
+from sqlalchemy import select
+from sqlalchemy.ext.asyncio import AsyncSession
from ..config import settings
+from ..database import get_db
+from ..models import Match
from ..schedule_data import TEAMS
router = APIRouter()
@@ -51,7 +55,7 @@ def _team_label(code: str | None) -> str:
@router.get("/match/{match_id}", response_class=HTMLResponse)
-async def match_share(match_id: str) -> HTMLResponse:
+async def match_share(match_id: str, db: AsyncSession = Depends(get_db)) -> HTMLResponse:
a, b = _parse_codes(match_id)
image = DEFAULT_OG
@@ -62,19 +66,34 @@ async def match_share(match_id: str) -> HTMLResponse:
image = OG_DIR + OG_IMAGES[key]
is_custom = True
- la, lb = _team_label(a), _team_label(b)
+ # 팀명: DB 의 경기 행이 있으면 한글 short 명(클럽 리그 포함),
+ # 없으면 월드컵 정적 테이블 → 코드 순으로 폴백.
+ m = (
+ await db.execute(select(Match).where(Match.match_id == match_id))
+ ).scalar_one_or_none()
+ if m:
+ la, lb = m.team_a_short, m.team_b_short
+ a, b = m.team_a_code, m.team_b_code
+ else:
+ la, lb = _team_label(a), _team_label(b)
# 한국은 항상 왼쪽으로 표기(프론트 화면 규칙과 동일).
if b == "KOR" and a != "KOR":
la, lb = lb, la
+ league_ko = {"kbo": "KBO", "mlb": "MLB", "mls": "MLS"}.get(m.league if m else "", "")
if la and lb:
- title = f"TriplePick 2026 — {la} vs {lb} AI 승부예측"
+ tag = f"{league_ko} " if league_ko else ""
+ title = f"TriplePick — {tag}{la} vs {lb} AI 승부예측"
else:
- title = "TriplePick 2026 — AI 2026 글로벌 축구 축전 승부예측"
- desc = "AI 셋이 매 경기를 서로 다르게 예측합니다. 당신의 픽을 찍고 AI와 겨뤄보세요."
+ title = "TriplePick — AI 스포츠 승부예측 (월드컵·KBO·MLB·MLS)"
+ desc = (
+ "GPT·Claude·Gemini 3대 AI가 이 경기를 서로 다르게 예측합니다. "
+ "당신의 픽을 찍고 AI와 겨뤄보세요."
+ )
origin = settings.public_origin.rstrip("/")
page_url = f"{origin}/match/{html.escape(match_id)}"
- img_url = f"{origin}{image}"
+ # ?v= 캐시버스터: 메신저가 과거 실패/구버전 썸네일을 캐시한 경우 재수집 유도
+ img_url = f"{origin}{image}?v=2"
t = html.escape(title)
d = html.escape(desc)
# 기본 썸네일만 규격이 1200x630 으로 확정 → width/height 명시.
diff --git a/frontend/index.html b/frontend/index.html
index 313479d..3c51456 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -28,8 +28,8 @@
content="GPT·Claude·Gemini 3대 AI가 월드컵·KBO·MLB·MLS 매 경기를 서로 다르게 예측합니다. 당신의 픽을 찍고 AI와 겨뤄보세요. 무료 참여."
/>
-
-
+
+
@@ -42,7 +42,7 @@
name="twitter:description"
content="GPT·Claude·Gemini 3대 AI가 월드컵·KBO·MLB·MLS 매 경기를 예측합니다. 당신의 픽을 찍고 AI와 겨뤄보세요."
/>
-
+