YYPOST群发软件 发表于 2026-6-25 06:46:03

苹果脚本网络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&#128196; 监控报告已保存");
   
    return results;
}

// =============================================================================
// 2. 动态表单构建器与POST提交
// =============================================================================
function dynamicFormBuilder() {
    printl("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    printl("&#128221; 模块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("&#128190; 模块3: JSON数据交换与缓存");
    printl("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
   
    // 检查缓存
    var cachedData = loadData(CACHE_PATH);
    if (cachedData) {
      printl("&#128230; 发现缓存数据,加载...");
      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&#128190; 数据已缓存到: " + 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("&#128205; IP: " + jsonResp.origin);
                  }
                  if (jsonResp["user-agent"]) {
                        printl("&#127760; 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&#128202; 请求统计:");
    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&#128196; 统计报告已保存");
}

// =============================================================================
// 5. Cookie会话管理与状态保持
// =============================================================================
function cookieSessionManager() {
    printl("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    printl("&#127850; 模块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("&#128260; 模块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("&#128165; 最终失败,已重试 " + maxRetries + " 次");
            printl("最后错误: " + lastError);
      }
    }
   
    printl("\n&#128202; 重试机制测试完成");
}

// =============================================================================
// 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&#128161; 提示:");
    printl("• 监控数据和统计报告已保存到文件");
    printl("• 可根据实际需求修改API地址和参数");
    printl("• 建议在网络良好的环境下运行");
    printl("• 部分测试API可能需要较长时间响应");
    printl("\n&#127919; 本示例展示了:");
    printl("✓ API健康监控与自动化报告");
    printl("✓ 动态表单构建与POST提交");
    printl("✓ JSON数据交换与本地缓存机制");
    printl("✓ 多接口批量请求与统计分析");
    printl("✓ Cookie会话管理与状态保持");
    printl("✓ 智能重试机制与错误处理");
    printl("✓ 链式调用与配置复用技巧");
    printl("\n完成时间: " + formatTimestamp());
}

// 直接执行
main();


页: [1]
查看完整版本: 苹果脚本网络API监控与数据管理工具