2025-07-03 16:32:34 +08:00
|
|
|
|
// ========== 日志写入文件的封装 ==========
|
|
|
|
|
function log(...args) {
|
|
|
|
|
const message = `[LOG] ${args.map(a =>
|
|
|
|
|
typeof a === 'object' ? JSON.stringify(a) : a
|
|
|
|
|
).join(' ')}`;
|
|
|
|
|
console.log(message);
|
|
|
|
|
files.append("/sdcard/output_log.txt", new Date().toISOString() + " " + message + "\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function error(...args) {
|
|
|
|
|
const message = `[ERROR] ${args.map(a =>
|
|
|
|
|
typeof a === 'object' ? JSON.stringify(a) : a
|
|
|
|
|
).join(' ')}`;
|
|
|
|
|
console.error(message);
|
|
|
|
|
files.append("/sdcard/output_log.txt", new Date().toISOString() + " " + message + "\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ========== 网络请求封装 ==========
|
|
|
|
|
function httpGetWithCallbacks(url, successCallback, errorCallback) {
|
|
|
|
|
http.get(url, {}, (res, err) => {
|
|
|
|
|
if (err) {
|
|
|
|
|
if (errorCallback) errorCallback(err);
|
|
|
|
|
} else {
|
|
|
|
|
if (successCallback) successCallback(res);
|
|
|
|
|
}
|
2025-06-19 22:12:21 +08:00
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-03 16:32:34 +08:00
|
|
|
|
function processIpApiWithCallbacks(url, processSuccessCallback, errorMsgPrefix, apiDoneCallback) {
|
|
|
|
|
httpGetWithCallbacks(url,
|
|
|
|
|
(res) => {
|
|
|
|
|
let operationSuccessful = false;
|
|
|
|
|
if (!res) {
|
|
|
|
|
toast(errorMsgPrefix + "请求没有返回有效响应");
|
|
|
|
|
log(errorMsgPrefix + "请求没有返回有效响应");
|
|
|
|
|
if (apiDoneCallback) apiDoneCallback(new Error("No valid response from request (res is null)"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (res.statusCode != 200) {
|
|
|
|
|
let errorBody = "";
|
|
|
|
|
try {
|
|
|
|
|
if (res.body && typeof res.body.string === 'function') {
|
|
|
|
|
errorBody = res.body.string(); // 读取并关闭
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
error(errorMsgPrefix + "读取错误响应体失败: ", e);
|
|
|
|
|
}
|
|
|
|
|
toast(errorMsgPrefix + "获取失败,状态码: " + res.statusCode);
|
|
|
|
|
log(errorMsgPrefix + "获取失败,状态码: " + res.statusCode + ", Body: " + errorBody);
|
|
|
|
|
if (apiDoneCallback) apiDoneCallback(new Error(errorMsgPrefix + "获取失败,状态码: " + res.statusCode));
|
|
|
|
|
return;
|
|
|
|
|
}
|
2025-07-03 13:17:14 +08:00
|
|
|
|
|
|
|
|
|
try {
|
2025-07-03 16:32:34 +08:00
|
|
|
|
let data = res.body.json(); // 读取并关闭
|
|
|
|
|
processSuccessCallback(data);
|
|
|
|
|
operationSuccessful = true;
|
2025-07-03 13:17:14 +08:00
|
|
|
|
} catch (jsonError) {
|
|
|
|
|
toast(errorMsgPrefix + "解析JSON失败");
|
2025-07-03 16:32:34 +08:00
|
|
|
|
error(errorMsgPrefix + "解析JSON失败: ", jsonError);
|
|
|
|
|
if (apiDoneCallback) apiDoneCallback(jsonError);
|
|
|
|
|
return;
|
2025-07-03 13:17:14 +08:00
|
|
|
|
}
|
2025-07-03 16:32:34 +08:00
|
|
|
|
|
|
|
|
|
if (apiDoneCallback) apiDoneCallback(null);
|
|
|
|
|
},
|
|
|
|
|
(requestError) => {
|
|
|
|
|
error(errorMsgPrefix + "处理时发生错误: ", requestError);
|
|
|
|
|
if (!toast.isShow()) {
|
|
|
|
|
toast(errorMsgPrefix + "请求或处理失败");
|
2025-07-03 13:17:14 +08:00
|
|
|
|
}
|
2025-07-03 16:32:34 +08:00
|
|
|
|
if (apiDoneCallback) apiDoneCallback(requestError);
|
2025-07-03 13:17:14 +08:00
|
|
|
|
}
|
2025-07-03 16:32:34 +08:00
|
|
|
|
);
|
2025-07-03 13:17:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-03 16:32:34 +08:00
|
|
|
|
// ========== 主函数 ==========
|
|
|
|
|
function main() {
|
|
|
|
|
log("Main function started.");
|
|
|
|
|
|
|
|
|
|
let tasksCompleted = 0;
|
|
|
|
|
const totalTasks = 2;
|
|
|
|
|
let errors = [];
|
2025-07-03 13:17:14 +08:00
|
|
|
|
|
2025-07-03 16:32:34 +08:00
|
|
|
|
function checkAllTasksDone() {
|
|
|
|
|
tasksCompleted++;
|
|
|
|
|
if (tasksCompleted === totalTasks) {
|
|
|
|
|
log("All API calls have finished processing.");
|
|
|
|
|
if (errors.length > 0) {
|
|
|
|
|
error("One or more API calls failed:");
|
|
|
|
|
errors.forEach(err => error(err));
|
|
|
|
|
toast("部分API请求失败,请检查日志");
|
|
|
|
|
} else {
|
|
|
|
|
log("All API calls were successful.");
|
|
|
|
|
toast("所有API请求成功");
|
|
|
|
|
}
|
|
|
|
|
log("Script operations concluded. Adding a small delay for UI.");
|
|
|
|
|
sleep(500);
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-07-03 13:17:14 +08:00
|
|
|
|
|
2025-07-03 16:32:34 +08:00
|
|
|
|
function handleApiError(error) {
|
|
|
|
|
if (error) {
|
|
|
|
|
errors.push(error);
|
|
|
|
|
}
|
|
|
|
|
checkAllTasksDone();
|
2025-07-03 13:17:14 +08:00
|
|
|
|
}
|
2025-07-03 16:32:34 +08:00
|
|
|
|
|
|
|
|
|
// 调用第一个 API
|
|
|
|
|
processIpApiWithCallbacks(
|
|
|
|
|
"https://ipv4.geojs.io/v1/ip/country.json",
|
|
|
|
|
function(data2) {
|
|
|
|
|
toast("国家代码: " + data2.country);
|
|
|
|
|
log("地理位置信息:");
|
|
|
|
|
log("国家代码 (2位): " + data2.country);
|
|
|
|
|
log("国家代码 (3位): " + data2.country_3);
|
|
|
|
|
log("IP 地址: " + data2.ip);
|
|
|
|
|
log("国家名称: " + data2.name);
|
|
|
|
|
},
|
|
|
|
|
"地理位置",
|
|
|
|
|
handleApiError
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// 调用第二个 API
|
|
|
|
|
processIpApiWithCallbacks(
|
|
|
|
|
"https://ipv4.geojs.io/v1/ip/geo.json",
|
|
|
|
|
function(data3) {
|
|
|
|
|
log("新增接口返回的地理数据:");
|
|
|
|
|
log("经度: " + data3.longitude);
|
|
|
|
|
log("纬度: " + data3.latitude);
|
|
|
|
|
log("城市: " + data3.city);
|
|
|
|
|
log("地区: " + data3.region);
|
|
|
|
|
log("国家: " + data3.country);
|
|
|
|
|
log("组织名称: " + data3.organization_name);
|
|
|
|
|
log("IP 地址: " + data3.ip);
|
|
|
|
|
log("国家代码 (2位): " + data3.country_code);
|
|
|
|
|
log("国家代码 (3位): " + data3.country_code3);
|
|
|
|
|
log("时区: " + data3.timezone);
|
|
|
|
|
log("ASN: " + data3.asn);
|
|
|
|
|
log("洲: " + data3.continent_code);
|
|
|
|
|
},
|
|
|
|
|
"详细地理位置",
|
|
|
|
|
handleApiError
|
|
|
|
|
);
|
2025-07-03 13:17:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-03 16:32:34 +08:00
|
|
|
|
// ========== 启动主函数并设置定时器 ==========
|
2025-07-03 13:17:14 +08:00
|
|
|
|
|
2025-07-03 16:32:34 +08:00
|
|
|
|
(function startLoop() {
|
|
|
|
|
const intervalMillis = 60 * 1000; // 每隔 60 秒执行一次
|
2025-07-03 13:17:14 +08:00
|
|
|
|
|
2025-07-03 16:32:34 +08:00
|
|
|
|
main(); // 首次启动
|
|
|
|
|
setInterval(main, intervalMillis); // 循环执行
|
|
|
|
|
})();
|