可信源码风险提示:保存或下载前请阅读源码和权限声明。
const GET_URL = 'https://httpbin.org/get';
function companionGet(url) {
return new Promise((resolve, reject) => {
if (!script.canUse('@system.interconnect.instance')) {
reject(new Error('当前设备不支持 system.companion'));
return;
}
const connect = system.companion.instance();
connect.getReadyState({
success: res => {
if (res.status !== 1) {
reject(new Error('手机未连接,请确保小米运动健康在后台运行'));
return;
}
connect.send({
data: { method: 'GET', url },
success: () => console.log('请求已发送,等待手机回传…'),
fail: (data, code) => reject(new Error(`发送失败 ${code}`))
});
},
fail: () => reject(new Error('无法获取连接状态'))
});
connect.onmessage = event => {
const msg = event.data;
if (msg && msg.__result__ === 'get') {
resolve(msg.body);
connect.onmessage = null;
}
};
connect.onerror = err => {
reject(new Error('手机通信错误: ' + JSON.stringify(err)));
connect.onerror = null;
};
});
}
async function main() {
const canCompanion = script.canUse('@system.interconnect.instance');
if (!canCompanion) {
await dialog.alert({
title: '无法联网',
message: '8 Pro 不支持 FETCH 直连,且当前 JSLab 未暴露手机通信接口。',
confirmText: '退出'
});
return;
}
const input = await dialog.text({
title: '代理请求 URL',
message: '手环将请求发给手机,由手机代为访问(需小米运动健康在后台)',
value: GET_URL,
placeholder: 'https://…',
required: true
});
if (input.action !== 'confirm') return;
script.toast('正在请求…', 2000);
try {
const body = await companionGet(input.value.trim());
const preview = typeof body === 'string' ? body.slice(0, 300) : JSON.stringify(body).slice(0, 300);
await dialog.alert({ title: '返回内容', message: preview, confirmText: '好' });
} catch (err) {
await dialog.alert({ title: '请求失败', message: err.message, confirmText: '知道了' });
}
}
return main();