async function showDevice(id){ const d=await api('/api/accounts/'+id+'/device'); if(d.error) return fail('无法查看设备', d.error); const cell=(k,v,span)=>'
'+esc(k)+''+esc(v||'-')+'
'; const html='
'+ cell('androidId', d.android_id)+ cell('androidId hex', d.android_id_hex)+ cell('serial', d.serial)+ cell('品牌 / 型号', [d.brand, d.model].filter(Boolean).join(' '))+ cell('设备名', d.device_name)+ cell('product', d.product)+ cell('manufacturer', d.manufacturer)+ cell('hardware', d.hardware)+ cell('release / sdk', [d.release, d.sdk].filter(Boolean).join(' / '))+ cell('build', d.build_id)+ cell('bootloader', d.bootloader)+ cell('GMS', d.gms_version)+ cell('分辨率', [d.width, d.height, d.dpi].filter(Boolean).join(' × '))+ cell('GPU', d.gpu, 'span3')+ cell('字体', d.fonts, 'span3')+ cell('TLS', d.tls, 'span3')+ cell('ABI', d.abis, 'span2')+ cell('MAC', d.mac)+ cell('locale', d.locale)+ cell('时区', d.timezone)+ cell('出口 IP', d.egress_ip)+ cell('client id', d.client_id, 'span2')+ cell('logging id', d.logging_id)+ cell('digest', d.digest, 'span3')+ cell('checkin UA', d.checkin_ua, 'span3')+ cell('Finsky UA', d.user_agent, 'span3')+ cell('WebView UA', d.webview_ua, 'span3')+ '
'; const root=$('#modalRoot'); root.innerHTML=''; const close=()=>{ document.removeEventListener('keydown', onEsc); root.innerHTML=''; }; const onEsc=e=>{ if(e.key==='Escape'){ e.preventDefault(); close(); } }; document.addEventListener('keydown', onEsc); bindMaskClose(root, close); $('#mOk').onclick=close; $('#devRotate').onclick=async()=>{ const ok=await modal({title:'轮换设备', message:'会重置设备身份、清除 master token,然后重新登录。账号 #'+id, okText:'轮换', cancelText:'取消'}); if(!ok) return; const j=await api('/api/accounts/'+id+'/device/rotate',{method:'POST',body:'{}'}); if(j.error) return fail('无法轮换', j.error); close(); notice('正在轮换设备', '任务 #'+(j.job_id||'')); watchAccountJob(id, 'keep', j.job_id, '轮换设备'); }; }