 | |  |  | 苹果脚本网络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[i];
- 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[j];
- 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[key]);
- }
-
- // 方式1: 字符串拼接
- var formData = "";
- var keys = Object.keys(formFields);
- for (var i = 0; i < keys.length; i++) {
- if (i > 0) formData += "&";
- formData += keys[i] + "=" + encodeURIComponent(formFields[keys[i]]);
- }
-
- 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[key2]);
- }
-
- 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[i];
- 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[j].success) {
- successCount++;
- totalDuration += allResults[j].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[k];
- 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[i];
- 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[i]);
- 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();
复制代码
| |  | |  |
|