function render(d){const r=d.result||{};let html=`
异常链接 ${esc(r.broken_count||0)} 个${esc(d.target||'-')}
已检测 ${esc(r.links_checked||0)}
${metric('发现链接',r.links_found||0)}${metric('检测链接',r.links_checked||0)}${metric('页面状态',r.page_status||'-')}
`; (r.results||[]).forEach(x=>{html+=`
${esc(x.url)}${esc(x.text||'')} · 状态:${esc(x.status_code||0)} · ${esc(x.duration_ms||0)}ms${x.ok?'正常':'异常'}${x.error?''+esc(x.error)+'':''}
`}); return html+'
'+raw(d)}async function run(){const v=$('url').value.trim();if(!v)return alert('请输入 URL');$('result').innerHTML='
正在真实抓取并检测链接...
';const d=await fetch('/api/broken-links?url='+encodeURIComponent(v)).then(r=>r.json()).catch(e=>({ok:false,error:e.message}));$('result').innerHTML=d.ok?render(d):`
检测失败${esc(d.error||'未知错误')}
`}const q=new URLSearchParams(location.search);if(q.get('url'))$('url').value=q.get('url');if(q.get('auto')==='1')setTimeout(run,120);