苹果脚本网络API监控与数据管理工具
苹果脚本网络API监控与数据管理工具/**
* AIWROK网络HTTP高级实战应用API监控与数据管理工具
*/
// =============================================================================
// 全局配置与工具函数
// =============================================================================
var API_CONFIG = {
timeout: 8000,
charset: "UTF-8",
userAgent: "AIWROK-SmartMonitor/2.0"
};
// 数据存储路径(通过框架API动态获取)
var DATA_PATH = project.getResourcesPath() + "/api_monitor_data.txt";
var CACHE_PATH = project.getResourcesPath() + "/api_cache.txt";
/**
* 时间戳格式化
*/
function formatTimestamp() {
var now = new Date();
return now.getFullYear() + "-" +
String(now.getMonth() + 1).padStart(2, '0') + "-" +
String(now.getDate()).padStart(2, '0') + " " +
String(now.getHours()).padStart(2, '0') + ":" +
String(now.getMinutes()).padStart(2, '0') + ":" +
String(now.getSeconds()).padStart(2, '0');
}
/**
* 保存数据到文件
*/
function saveData(filePath, data) {
try {
txt.writeFile(filePath, data, false); // false=覆盖模式
printl("✓ 数据已保存到: " + filePath);
return true;
} catch (e) {
printl("✗ 保存失败: " + e.toString());
return false;
}
}
/**
* 从文件读取数据
*/
function loadData(filePath) {
try {
var content = txt.readFile(filePath);
if (content && content.length > 0) {
return content;
}
return null;
} catch (e) {
// 文件不存在或读取失败时返回null
return null;
}
}
// =============================================================================
// 1. 智能API健康监控系统
// =============================================================================
function apiHealthMonitor() {
printl("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
printl("📊 模块1: API健康监控系统");
printl("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
var apis = [
{ name: "百度", url: "https://www.baidu.com", type: "web" },
{ name: "GitHub", url: "https://api.github.com", type: "api" },
{ name: "IP查询", url: "http://ip-api.com/ip", type: "api" }
];
var results = [];
for (var i = 0; i < apis.length; i++) {
var api = apis;
printl("\n测试: " + api.name + " (" + api.url + ")");
try {
var startTime = new Date().getTime();
var http = new OkHttp();
http.setTimeout(API_CONFIG.timeout, API_CONFIG.timeout, 5000);
http.setHeader("User-Agent", API_CONFIG.userAgent);
var response = http.get(api.url);
var endTime = new Date().getTime();
var duration = endTime - startTime;
var status = {
name: api.name,
url: api.url,
success: response !== null && response.length > 0,
duration: duration,
size: response ? response.length : 0,
timestamp: formatTimestamp()
};
if (status.success) {
printl("✅ 成功 | 耗时: " + duration + "ms | 大小: " + status.size + "字节");
} else {
printl("❌ 失败 | 耗时: " + duration + "ms");
}
results.push(status);
} catch (error) {
printl("⚠️ 异常: " + error.toString().substring(0, 60));
results.push({
name: api.name,
url: api.url,
success: false,
duration: 0,
size: 0,
timestamp: formatTimestamp(),
error: error.toString()
});
}
}
// 保存监控结果
var report = "API健康监控报告 [" + formatTimestamp() + "]\n";
report += "========================================\n";
for (var j = 0; j < results.length; j++) {
var r = results;
report += r.name + ": " + (r.success ? "✅正常" : "❌异常") +
" | 耗时:" + r.duration + "ms\n";
}
saveData(DATA_PATH, report);
printl("\n📄 监控报告已保存");
return results;
}
// =============================================================================
// 2. 动态表单构建器与POST提交
// =============================================================================
function dynamicFormBuilder() {
printl("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
printl("📝 模块2: 动态表单构建器");
printl("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
// 模拟用户输入构建表单
var formFields = {
username: "user_" + Math.floor(Math.random() * 1000),
email: "test" + Math.floor(Math.random() * 100) + "@example.com",
age: String(20 + Math.floor(Math.random() * 30)),
action: "register",
timestamp: String(new Date().getTime())
};
printl("构建的表单数据:");
for (var key in formFields) {
printl("" + key + " = " + formFields);
}
// 方式1: 字符串拼接
var formData = "";
var keys = Object.keys(formFields);
for (var i = 0; i < keys.length; i++) {
if (i > 0) formData += "&";
formData += keys + "=" + encodeURIComponent(formFields]);
}
printl("\n表单字符串: " + formData);
try {
var http = new OkHttp();
http.setTimeout(API_CONFIG.timeout, API_CONFIG.timeout, 5000);
http.setCharset(API_CONFIG.charset);
var response = http.postForm("https://httpbin.org/post", formData);
if (response) {
printl("\n✅ POST表单提交成功");
try {
var result = JSON.parse(response);
if (result.form) {
printl("服务器接收到的数据:");
printl(JSON.stringify(result.form, null, 2));
}
} catch (e) {
printl("响应预览: " + response.substring(0, 200));
}
}
} catch (error) {
printl("❌ POST表单提交失败: " + error.toString());
}
// 方式2: Map对象
printl("\n--- 使用Map对象方式 ---");
try {
var http2 = new OkHttp();
http2.setTimeout(API_CONFIG.timeout, API_CONFIG.timeout, 5000);
http2.setCharset(API_CONFIG.charset);
var mapData = new Map();
for (var key2 in formFields) {
mapData.add(key2, formFields);
}
var response2 = http2.post("https://httpbin.org/post", mapData);
if (response2) {
printl("✅ Map方式POST成功");
printl("响应长度: " + response2.length + " 字节");
}
} catch (error) {
printl("❌ Map方式POST失败: " + error.toString());
}
}
// =============================================================================
// 3. JSON数据交换与缓存机制
// =============================================================================
function jsonDataExchangeWithCache() {
printl("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
printl("💾 模块3: JSON数据交换与缓存");
printl("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
// 检查缓存
var cachedData = loadData(CACHE_PATH);
if (cachedData) {
printl("📦 发现缓存数据,加载...");
try {
var cacheObj = JSON.parse(cachedData);
printl("缓存时间: " + cacheObj.cachedAt);
printl("缓存条目数: " + (cacheObj.data ? cacheObj.data.length : 0));
} catch (e) {
printl("缓存格式错误,将重新获取");
cachedData = null;
}
}
// 构建复杂JSON数据
var requestData = {
userId: "user_" + Math.floor(Math.random() * 10000),
preferences: {
theme: "dark",
language: "zh-CN",
notifications: true
},
tags: ["developer", "automation", "testing"],
metadata: {
platform: "iOS",
version: "2.0",
buildTime: new Date().toISOString()
}
};
printl("\n发送的JSON数据:");
printl(JSON.stringify(requestData, null, 2));
try {
var http = new OkHttp();
http.setTimeout(API_CONFIG.timeout, API_CONFIG.timeout, 5000);
http.setCharset(API_CONFIG.charset);
http.setHeader("Content-Type", "application/json");
http.setHeader("Accept", "application/json");
var response = http.json("https://httpbin.org/post", requestData);
if (response) {
printl("\n✅ JSON请求成功");
try {
var result = JSON.parse(response);
// 提取服务器返回的数据
if (result.json) {
printl("\n服务器收到的JSON:");
printl(JSON.stringify(result.json, null, 2));
}
// 创建缓存对象
var cacheObject = {
cachedAt: formatTimestamp(),
requestId: result.headers ? result.headers["X-Request-Id"] : "unknown",
data: result.json || requestData,
responseSize: response.length
};
// 保存缓存
var cacheJson = JSON.stringify(cacheObject, null, 2);
saveData(CACHE_PATH, cacheJson);
printl("\n💾 数据已缓存到: " + CACHE_PATH);
} catch (parseError) {
printl("JSON解析失败: " + parseError.toString());
printl("原始响应: " + response.substring(0, 200));
}
}
} catch (error) {
printl("❌ JSON请求失败: " + error.toString());
}
}
// =============================================================================
// 4. 多接口并发请求模拟(串行执行)
// =============================================================================
function concurrentRequestsSimulation() {
printl("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
printl("⚡ 模块4: 多接口并发请求模拟");
printl("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
var endpoints = [
{ name: "获取Headers", url: "https://httpbin.org/headers" },
{ name: "获取IP", url: "https://httpbin.org/ip" },
{ name: "获取User-Agent", url: "https://httpbin.org/user-agent" },
{ name: "延迟测试", url: "https://httpbin.org/delay/1" }
];
var allResults = [];
var totalStartTime = new Date().getTime();
for (var i = 0; i < endpoints.length; i++) {
var endpoint = endpoints;
printl("\n[" + (i + 1) + "/" + endpoints.length + "] 请求: " + endpoint.name);
try {
var startTime = new Date().getTime();
var http = new OkHttp();
http.setTimeout(10000, 10000, 5000);
http.setHeader("User-Agent", API_CONFIG.userAgent);
http.setHeader("X-Request-Index", String(i));
var response = http.get(endpoint.url);
var endTime = new Date().getTime();
var duration = endTime - startTime;
var result = {
index: i,
name: endpoint.name,
url: endpoint.url,
success: response !== null,
duration: duration,
size: response ? response.length : 0,
timestamp: formatTimestamp()
};
if (result.success) {
printl("✅ 完成 | " + duration + "ms | " + result.size + "字节");
// 尝试提取关键信息
try {
var jsonResp = JSON.parse(response);
if (jsonResp.origin) {
printl("📍 IP: " + jsonResp.origin);
}
if (jsonResp["user-agent"]) {
printl("🌐 UA: " + jsonResp["user-agent"].substring(0, 50));
}
} catch (e) {
// 忽略解析错误
}
} else {
printl("❌ 失败 | " + duration + "ms");
}
allResults.push(result);
} catch (error) {
printl("⚠️ 异常: " + error.toString().substring(0, 60));
allResults.push({
index: i,
name: endpoint.name,
success: false,
duration: 0,
error: error.toString()
});
}
}
var totalEndTime = new Date().getTime();
var totalTime = totalEndTime - totalStartTime;
// 统计信息
var successCount = 0;
var totalDuration = 0;
for (var j = 0; j < allResults.length; j++) {
if (allResults.success) {
successCount++;
totalDuration += allResults.duration;
}
}
printl("\n📊 请求统计:");
printl("总请求数: " + endpoints.length);
printl("成功数: " + successCount);
printl("失败数: " + (endpoints.length - successCount));
printl("总耗时: " + totalTime + "ms");
printl("平均耗时: " + (successCount > 0 ? Math.round(totalDuration / successCount) : 0) + "ms");
// 保存统计结果
var statsReport = "并发请求统计 [" + formatTimestamp() + "]\n";
statsReport += "========================================\n";
statsReport += "总请求: " + endpoints.length + " | 成功: " + successCount + " | 失败: " + (endpoints.length - successCount) + "\n";
statsReport += "总耗时: " + totalTime + "ms\n";
statsReport += "详细结果:\n";
for (var k = 0; k < allResults.length; k++) {
var r = allResults;
statsReport += "[" + r.name + "] " + (r.success ? "✅" : "❌") + " " + r.duration + "ms\n";
}
saveData(DATA_PATH, statsReport);
printl("\n📄 统计报告已保存");
}
// =============================================================================
// 5. Cookie会话管理与状态保持
// =============================================================================
function cookieSessionManager() {
printl("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
printl("🍪 模块5: Cookie会话管理");
printl("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
var http = new OkHttp();
http.setTimeout(API_CONFIG.timeout, API_CONFIG.timeout, 5000);
http.setCharset(API_CONFIG.charset);
http.setHeader("User-Agent", API_CONFIG.userAgent);
// 步骤1: 设置Cookie
printl("\n步骤1: 设置会话Cookie");
try {
var sessionId = "sess_" + Math.random().toString(36).substring(2, 15);
var userId = "uid_" + Math.floor(Math.random() * 10000);
var setUrl = "https://httpbin.org/cookies/set?session_id=" + sessionId + "&user_id=" + userId;
var response1 = http.get(setUrl);
if (response1) {
printl("✅ Cookie设置请求已发送");
printl("Session ID: " + sessionId);
printl("User ID: " + userId);
}
} catch (error) {
printl("❌ Cookie设置失败: " + error.toString());
}
// 步骤2: 获取当前Cookie
printl("\n步骤2: 获取当前Cookie");
try {
var cookies = http.getCookie();
if (cookies && cookies.length > 0) {
printl("✅ 当前Cookie:");
printl("" + cookies);
} else {
printl("ℹ️未获取到Cookie(某些服务可能不返回Cookie)");
}
} catch (error) {
printl("⚠️获取Cookie异常: " + error.toString());
}
// 步骤3: 验证Cookie是否携带
printl("\n步骤3: 验证Cookie携带");
try {
var verifyUrl = "https://httpbin.org/cookies";
var response3 = http.get(verifyUrl);
if (response3) {
printl("✅ Cookie验证请求成功");
try {
var cookieData = JSON.parse(response3);
if (cookieData.cookies) {
printl("服务器收到的Cookie:");
printl("" + JSON.stringify(cookieData.cookies, null, 2));
}
} catch (e) {
printl("响应预览: " + response3.substring(0, 200));
}
}
} catch (error) {
printl("❌ Cookie验证失败: " + error.toString());
}
// 步骤4: 清除Cookie(通过新实例)
printl("\n步骤4: 创建新会话(清除旧Cookie)");
try {
var http2 = new OkHttp();
http2.setTimeout(API_CONFIG.timeout, API_CONFIG.timeout, 5000);
http2.setHeader("User-Agent", API_CONFIG.userAgent);
var cookies2 = http2.getCookie();
if (!cookies2 || cookies2.length === 0) {
printl("✅ 新会话无Cookie(已隔离)");
} else {
printl("ℹ️新会话Cookie: " + cookies2);
}
} catch (error) {
printl("⚠️新会话创建异常: " + error.toString());
}
}
// =============================================================================
// 6. 智能重试机制与错误处理
// =============================================================================
function smartRetryMechanism() {
printl("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
printl("🔄 模块6: 智能重试机制");
printl("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
var testUrls = [
"https://httpbin.org/status/200",// 正常
"https://httpbin.org/status/404",// 404
"https://invalid.domain.test", // 无效域名
"https://httpbin.org/delay/2" // 延迟
];
var maxRetries = 3;
var retryDelay = 1000; // 毫秒
for (var i = 0; i < testUrls.length; i++) {
var url = testUrls;
printl("\n测试URL [" + (i + 1) + "/" + testUrls.length + "]: " + url);
var success = false;
var lastError = null;
for (var attempt = 1; attempt <= maxRetries; attempt++) {
printl("尝试 " + attempt + "/" + maxRetries + "...");
try {
var startTime = new Date().getTime();
var http = new OkHttp();
http.setTimeout(5000, 5000, 3000);
http.setHeader("User-Agent", API_CONFIG.userAgent);
http.setHeader("X-Retry-Attempt", String(attempt));
var response = http.get(url);
var endTime = new Date().getTime();
var duration = endTime - startTime;
// 改进判断: response不为null即视为请求完成(即使内容为空)
if (response !== null && response !== undefined) {
printl("✅ 成功 | 耗时: " + duration + "ms | 大小: " + response.length + "字节");
success = true;
break;
} else {
printl("⚠️无响应对象 | 耗时: " + duration + "ms");
lastError = "无响应对象";
}
} catch (error) {
var errorMsg = error.toString().substring(0, 60);
printl("❌ 失败: " + errorMsg);
lastError = errorMsg;
// 如果是最后一次尝试,不再等待
if (attempt < maxRetries) {
printl("⏳ 等待 " + retryDelay + "ms 后重试...");
// 注意:实际使用时可能需要sleep,这里简化处理
}
}
}
if (!success) {
printl("💥 最终失败,已重试 " + maxRetries + " 次");
printl("最后错误: " + lastError);
}
}
printl("\n📊 重试机制测试完成");
}
// =============================================================================
// 7. 链式调用与高级配置
// =============================================================================
function advancedChainCall() {
printl("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
printl("⛓️模块7: 链式调用与高级配置");
printl("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
// 示例1: 完整配置调用
printl("\n示例1: 完整配置调用");
try {
var http1 = new OkHttp();
http1.setTimeout(8000, 8000, 5000);
http1.setCharset("UTF-8");
http1.setHeader("User-Agent", API_CONFIG.userAgent);
http1.setHeader("Accept", "application/json");
http1.setHeader("X-Custom-ID", "chain_test_001");
var response1 = http1.get("https://httpbin.org/get");
if (response1) {
printl("✅ 配置调用成功");
printl("响应长度: " + response1.length + " 字节");
try {
var data1 = JSON.parse(response1);
if (data1.headers) {
printl("请求头已发送到服务器");
if (data1.headers["X-Custom-Id"]) {
printl("自定义头 X-Custom-ID: " + data1.headers["X-Custom-Id"]);
}
}
} catch (e) {
printl("响应预览: " + response1.substring(0, 150));
}
}
} catch (error) {
printl("❌ 配置调用失败: " + error.toString());
}
// 示例2: 条件化链式调用
printl("\n示例2: 条件化配置");
try {
var http = new OkHttp();
http.setTimeout(API_CONFIG.timeout, API_CONFIG.timeout, 5000);
http.setCharset(API_CONFIG.charset);
http.setHeader("User-Agent", API_CONFIG.userAgent);
// 根据条件添加额外头
var useCompression = true;
if (useCompression) {
http.setHeader("Accept-Encoding", "gzip, deflate");
printl("已启用压缩支持");
}
var enableCache = false;
if (enableCache) {
http.setHeader("Cache-Control", "max-age=3600");
printl("已启用缓存");
} else {
http.setHeader("Cache-Control", "no-cache");
printl("已禁用缓存");
}
var response2 = http.get("https://httpbin.org/headers");
if (response2) {
printl("✅ 条件化配置请求成功");
printl("响应长度: " + response2.length + " 字节");
}
} catch (error) {
printl("❌ 条件化配置失败: " + error.toString());
}
// 示例3: 批量请求配置复用
printl("\n示例3: 配置复用");
try {
// 创建基础配置
var baseHttp = new OkHttp();
baseHttp.setTimeout(API_CONFIG.timeout, API_CONFIG.timeout, 5000);
baseHttp.setCharset(API_CONFIG.charset);
baseHttp.setHeader("User-Agent", API_CONFIG.userAgent);
baseHttp.setHeader("X-Base-Config", "shared");
printl("基础配置已创建");
// 复用配置进行多次请求
var urls = [
"https://httpbin.org/get",
"https://httpbin.org/ip",
"https://httpbin.org/user-agent"
];
for (var i = 0; i < urls.length; i++) {
try {
var resp = baseHttp.get(urls);
if (resp) {
printl("[" + (i + 1) + "/" + urls.length + "] ✅ 成功 | " + resp.length + "字节");
} else {
printl("[" + (i + 1) + "/" + urls.length + "] ❌ 失败");
}
} catch (e) {
printl("[" + (i + 1) + "/" + urls.length + "] ⚠️ 异常");
}
}
printl("✅ 配置复用测试完成");
} catch (error) {
printl("❌ 配置复用失败: " + error.toString());
}
}
// =============================================================================
// 主程序 - 智能API监控与管理工具
// =============================================================================
function main() {
printl("╔════════════════════════════════════════╗");
printl("║ AIWROK 智能API监控与管理工具 v2.0 ║");
printl("║ 高级网络HTTP综合实战应用 ║");
printl("╚════════════════════════════════════════╝");
printl("\n启动时间: " + formatTimestamp());
printl("数据路径: " + DATA_PATH);
printl("缓存路径: " + CACHE_PATH);
printl("\n开始执行各个模块...\n");
// 执行所有模块
apiHealthMonitor(); // 模块1: API健康监控
dynamicFormBuilder(); // 模块2: 动态表单构建
jsonDataExchangeWithCache(); // 模块3: JSON数据交换与缓存
concurrentRequestsSimulation();// 模块4: 多接口并发请求
cookieSessionManager(); // 模块5: Cookie会话管理
smartRetryMechanism(); // 模块6: 智能重试机制
advancedChainCall(); // 模块7: 链式调用与高级配置
printl("\n╔════════════════════════════════════════╗");
printl("║ 所有模块执行完成 ║");
printl("╚════════════════════════════════════════╝");
printl("\n💡 提示:");
printl("• 监控数据和统计报告已保存到文件");
printl("• 可根据实际需求修改API地址和参数");
printl("• 建议在网络良好的环境下运行");
printl("• 部分测试API可能需要较长时间响应");
printl("\n🎯 本示例展示了:");
printl("✓ API健康监控与自动化报告");
printl("✓ 动态表单构建与POST提交");
printl("✓ JSON数据交换与本地缓存机制");
printl("✓ 多接口批量请求与统计分析");
printl("✓ Cookie会话管理与状态保持");
printl("✓ 智能重试机制与错误处理");
printl("✓ 链式调用与配置复用技巧");
printl("\n完成时间: " + formatTimestamp());
}
// 直接执行
main();
页:
[1]