'
- +''
- +''+esc(k.key_id||'?')+''
- +(k.hits>0?''+k.hits+' hits':'')
- +'
'
- +'M '+mp+'% \u00b7 W '+wp+'%
'
- +(k.in_cooldown?'冷却中
':'')
- +(k.error?'\u2717 '+esc(k.error)+'
':'')
- +'';
- }
- pp.innerHTML=ph;
- }
- }
+ await _loadProxyStatus();
}catch(prE){}
}catch(e){}
}
+async function _loadProxyStatus(){
+ var prr=await fetch('/api/proxy/status');var prd=await prr.json();
+ var pl=document.getElementById('proxy-status-line');
+ var pp=document.getElementById('proxy-pool');
+ if(!prd.ok||prd.proxy_running===false){
+ if(pl)pl.innerHTML='\u2717 代理未运行';
+ if(pp)pp.innerHTML=''+esc(prd.error||'无法连接 :19878')+'';
+ }else{
+ if(pl)pl.innerHTML='当前路由: '+esc(prd.current_key||'—')+''
+ +''+prd.total_requests+' 请求'
+ +''+prd.pool_healthy+'/'+prd.pool_size+' healthy';
+ if(pp){
+ var ph='';
+ for(var i=0;i'
+ +''
+ +''+esc(k.key_id||'?')+''
+ +(k.hits>0?''+k.hits+' hits':'')
+ +'
'
+ +'M '+mp+'% \u00b7 W '+wp+'%
'
+ +(k.in_cooldown?'冷却中
':'')
+ +(k.error?'\u2717 '+esc(k.error)+'
':'')
+ +''
+ +''
+ +'';
+ }
+ pp.innerHTML=ph;
+ }
+ }
+}
+function toggleOcgKey(kid,enabled){
+ if(!kid)return;
+ var action=enabled?'启用':'停用';
+ if(!confirm('确认'+action+' key '+kid+'?'+(enabled?'':'停用后该 key 将不再参与 OCG 路由。')))return;
+ fetch('/api/proxy/toggle-key',{method:'POST',headers:{'Content-Type':'application/json'},
+ body:JSON.stringify({key_id:kid,enabled:enabled})})
+ .then(function(r){return r.json();})
+ .then(function(d){
+ if(d.ok){
+ _loadProxyStatus();
+ if(window.showToast)showToast('key '+kid+' 已'+action);
+ }else{
+ alert('操作失败: '+(d.error||'未知错误'));
+ }
+ })
+ .catch(function(e){alert('请求失败: '+e);});
+}
function _fmtCountdown(sec){
if(sec==null)return '—';
if(sec<=0)return '即将重置';