{{ plugin.message }}
{{ plugin.message }}
| Source | Sport/League | Match (Home vs Away) | Start Time | Updated |
|---|---|---|---|---|
| No data available. | ||||
|
{{
f.source_alias }}
{{ getKickoffBadgeLabel(f) }}
|
{{ f.sport_name }}
{{
f.league_name }}
|
{{ f.home_team }}
VS
{{ f.away_team }}
|
{{ formatDate(f.start_time) }}
{{ getKickoffDetailLabel(f) }}
|
{{ formatDate(f.updated_at) }}
|
{{ analyzeError }}
{{ analyzeResult.message }}
Next steps: Add {{ analyzeAlias || analyzeResult.result.site_type }}
to enabled_sites in your config.yaml and restart the orchestrator.
| Alias | Type | Visible | State | Profiles | Source | Action |
|---|---|---|---|---|---|---|
| {{ item.alias }} | {{ item.site_type || '-' }} | {{ item.enabled ? 'VISIBLE' : 'HIDDEN' }} | {{ item.runtime?.state || 'UNKNOWN' }} | {{ item.auth_profile_count || 0 }} (+{{ item.fallback_count }} fb) | {{ item.source_kind || 'config' }} |
No arbitrage opportunities found for {{ arbSiteA }} vs {{ arbSiteB }}.
No overlapping fixtures found between {{ arbSiteA }} and {{ arbSiteB }}.
| Match | Market | Site A | Site B | Profit% | Stake A | Stake B | Expected |
|---|---|---|---|---|---|---|---|
|
{{ arb.home_team }} vs {{ arb.away_team
}}
{{ arb.league }} · {{ formatDate(arb.start_time) }}
{{ getKickoffBadgeLabel(arb) }}
|
{{ arb.market_type }} {{ formatPeriodLabel(arb.period, arb) }} {{ arb.line > 0 ? '+' : '' }}{{ arb.line }} {{ specialConditionLabel(arb.special_condition) }} |
{{ arb.site_a_odds.toFixed(2) }}
{{ arb.site_a }} · {{
arb.site_a_selection }}
{{ getFreshnessShortLabel({ observed_at: arb.site_a_observed_at }) }}
|
{{ arb.site_b_odds.toFixed(2) }}
{{ arb.site_b }} · {{
arb.site_b_selection }}
{{ getFreshnessShortLabel({ observed_at: arb.site_b_observed_at }) }}
|
{{ arb.profit_pct > 0 ? '+' : '' }}{{ arb.profit_pct.toFixed(2) }}% | ₩{{ formatNumber(arb.stake_a) }} | ₩{{ formatNumber(arb.stake_b) }} | ₩{{ formatNumber(arb.expected_return) }} |
|
{{ arb.home_team }} vs {{ arb.away_team
}}
{{ arb.league }} · {{ formatDate(arb.start_time) }}
{{ getKickoffBadgeLabel(arb) }}
|
1x2 {{ formatPeriodLabel(arb.period, arb) }} |
{{ arb.best_home_odds.toFixed(2)
}}
{{ arb.best_home_site
}} H
{{ getFreshnessShortLabel({ observed_at: arb.best_home_observed_at }) }}
{{ arb.best_draw_odds.toFixed(2)
}}
{{ arb.best_draw_site
}} D
{{ getFreshnessShortLabel({ observed_at: arb.best_draw_observed_at }) }}
{{ arb.best_away_odds.toFixed(2)
}}
{{ arb.best_away_site
}} A
{{ getFreshnessShortLabel({ observed_at: arb.best_away_observed_at }) }}
|
{{ arb.profit_pct > 0 ? '+' : '' }}{{ arb.profit_pct.toFixed(2) }}% |
₩{{ formatNumber(arb.stake_home) }} / ₩{{ formatNumber(arb.stake_draw) }} /
₩{{ formatNumber(arb.stake_away) }}
H / D / A
|
₩{{ formatNumber(arb.expected_return) }} | ||
| Start Time | Sport & League | Site A Match Name ({{ arbSiteA }}) | Site B Match Name ({{ arbSiteB }}) | Match Confidence | Action |
|---|---|---|---|---|---|
| {{ formatDate(match.start_time) }} |
{{ match.sport }}
{{ match.league_name }}
|
{{ match.home_team }} VS {{ match.away_team }} | {{ match.home_team }} VS {{ match.away_team }} | {{ (match.similarity_score * 100).toFixed(0) }}% |
{{ modalError }}
No markets available for this fixture.
{{ chartLabel }}
Loading history...
{{ chartError }}
브라우저로 사이트 실제 DOM 배당 수집 → DB 배당 조회 → 비교
브라우저로 사이트에 로그인해 배당이 렌더링된 HTML을 캡처합니다.
DB 최신 배당을 가져와 수집된 DOM 배당과 비교합니다.
| 경기 | 마켓 | 선택지 | DB 배당 | 업데이트 |
|---|---|---|---|---|
| {{ r.match_label }} | {{ r.market_name }} | {{ r.selection }} | {{ r.price.toFixed(2) }} | {{ r.updated_at ? r.updated_at.slice(0,16) : '' }} |
| 경기 | 마켓 | 선택지 | DB | DOM | 상태 |
|---|---|---|---|---|---|
| {{ c.match_label }} | {{ c.market }} | {{ c.selection }} | {{ c.api_price.toFixed(2) }} | {{ c.dom_price !== null ? c.dom_price.toFixed(2) : '—' }} | {{ c.status==='match' ? '✓ 일치' : c.status==='mismatch' ? '✗ 불일치' : '? 미발견' }} |
현재 다른 크롤링 작업이 브라우저를 사용 중입니다.
잠시 후 다시 시도해 주세요.