YYPOST群发软件 发表于 7 天前

苹果iOS脚本天气信息查询工具


苹果iOS脚本天气信息查询工具



/**
* AIWROK软件苹果iOS - 天气信息查询工具
* 交流QQ群711841924 | 苹果内测QQ群648461709
*
* 功能特点:
* 1. 支持多个城市查询
* 2. 自动重试机制
* 3. 友好的格式化输出
* 4. 完整的错误处理
*/

// =============================================================================
// 配置区域
// =============================================================================

var WEATHER_CONFIG = {
    // 默认查询城市(可以修改为你所在的城市)
    defaultCity: "北京",
   
    // API超时时间(毫秒)
    timeout: 5000,
   
    // 最大重试次数
    maxRetries: 3
};

// =============================================================================
// 核心功能函数
// =============================================================================

/**
* 获取指定城市的天气信息
* @param {String} city - 城市名称
* @returns {Object|null} 天气数据对象或null
*/
function getWeatherInfo(city) {
    printl("🌤️ 正在查询 [" + city + "] 的天气信息...");
   
    var http = new OkHttp();
   
    // 设置超时时间
    http.setTimeout(WEATHER_CONFIG.timeout, WEATHER_CONFIG.timeout, WEATHER_CONFIG.timeout);
   
    // 设置请求头
    http.setHeader("User-Agent", "AIWROK-Weather/1.0");
    http.setHeader("Accept", "application/json");
    http.setCharset("UTF-8");
   
    // 使用免费的天气API(Open-Meteo,无需API Key)
    // 注意:这里需要先获取城市坐标,为简化示例,我们使用固定坐标
    var coordinates = getCityCoordinates(city);
   
    if (!coordinates) {
      printl("❌ 未找到城市 [" + city + "] 的坐标信息");
      return null;
    }
   
    var apiUrl = "https://api.open-meteo.com/v1/forecast?latitude=" +
               coordinates.lat + "&longitude=" + coordinates.lon +
               "¤t=temperature_2m,relative_humidity_2m,apparent_temperature," +
               "weather_code,wind_speed_10m&daily=temperature_2m_max,temperature_2m_min" +
               "&timezone=auto&forecast_days=3";
   
    try {
      printl("📡 发送请求到天气服务器...");
      var startTime = new Date().getTime();
      var response = http.get(apiUrl);
      var endTime = new Date().getTime();
      var duration = endTime - startTime;
      
      if (!response || response.length === 0) {
            printl("❌ 服务器返回空响应");
            return null;
      }
      
      printl("⏱️ 响应时间: " + duration + "ms");
      
      // 解析JSON响应
      var weatherData = JSON.parse(response);
      
      if (!weatherData || !weatherData.current) {
            printl("❌ 响应数据格式异常");
            return null;
      }
      
      return {
            city: city,
            current: weatherData.current,
            daily: weatherData.daily,
            fetchTime: new Date().toLocaleString()
      };
      
    } catch (error) {
      var errorMsg = error.toString();
      printl("❌ 请求失败: " + errorMsg.substring(0, 100));
      
      if (errorMsg.indexOf('timeout') > -1) {
            printl("原因: 连接超时,请检查网络");
      } else if (errorMsg.indexOf('SSL') > -1) {
            printl("原因: SSL证书问题");
      }
      
      return null;
    }
}

/**
* 获取城市坐标(简化版,仅包含常见城市)
* @param {String} city - 城市名称
* @returns {Object|null} 包含lat和lon的对象
*/
function getCityCoordinates(city) {
    var cityMap = {
      "北京": { lat: 39.9042, lon: 116.4074 },
      "上海": { lat: 31.2304, lon: 121.4737 },
      "广州": { lat: 23.1291, lon: 113.2644 },
      "深圳": { lat: 22.5431, lon: 114.0579 },
      "成都": { lat: 30.5728, lon: 104.0668 },
      "杭州": { lat: 30.2741, lon: 120.1551 },
      "武汉": { lat: 30.5928, lon: 114.3055 },
      "西安": { lat: 34.3416, lon: 108.9398 },
      "南京": { lat: 32.0603, lon: 118.7969 },
      "重庆": { lat: 29.4316, lon: 106.9123 }
    };
   
    return cityMap || null;
}

/**
* 格式化天气代码为中文描述
* @param {Number} code - WMO天气代码
* @returns {String} 天气描述
*/
function formatWeatherCode(code) {
    var weatherMap = {
      0: "晴朗 ☀️",
      1: "主要晴朗 🌤️",
      2: "部分多云 ⛅",
      3: "阴天 ☁️",
      45: "雾 🌫️",
      48: "雾凇 🌫️",
      51: "毛毛雨 🌦️",
      53: "中度毛毛雨 🌧️",
      55: "大毛毛雨 🌧️",
      61: "小雨 🌧️",
      63: "中雨 🌧️",
      65: "大雨 🌧️",
      71: "小雪 ❄️",
      73: "中雪 ❄️",
      75: "大雪 ❄️",
      95: "雷雨 ⛈️",
      96: "雷阵雨伴冰雹 ⛈️",
      99: "强雷阵雨伴冰雹 ⛈️"
    };
   
    return weatherMap || "未知天气 (" + code + ")";
}

/**
* 格式化并显示天气信息
* @param {Object} weatherData - 天气数据对象
*/
function displayWeatherInfo(weatherData) {
    if (!weatherData) {
      printl("❌ 没有可显示的天气数据");
      return;
    }
   
    printl("\n" + "=".repeat(50));
    printl("🌍 天气报告 - " + weatherData.city);
    printl("📅 查询时间: " + weatherData.fetchTime);
    printl("=".repeat(50));
   
    // 当前天气
    var current = weatherData.current;
    printl("\n📊 当前天气:");
    printl("温度: " + current.temperature_2m + "°C");
    printl("体感温度: " + current.apparent_temperature + "°C");
    printl("湿度: " + current.relative_humidity_2m + "%");
    printl("风速: " + current.wind_speed_10m + " km/h");
    printl("天气状况: " + formatWeatherCode(current.weather_code));
   
    // 未来几天预报
    if (weatherData.daily && weatherData.daily.time) {
      printl("\n📅 未来天气预报:");
      var times = weatherData.daily.time;
      var maxTemps = weatherData.daily.temperature_2m_max;
      var minTemps = weatherData.daily.temperature_2m_min;
      
      for (var i = 0; i < Math.min(times.length, 3); i++) {
            var dateStr = times;
            var maxTemp = maxTemps;
            var minTemp = minTemps;
            
            printl("" + dateStr + ": " + minTemp + "°C ~ " + maxTemp + "°C");
      }
    }
   
    printl("=".repeat(50) + "\n");
}

/**
* 带重试机制的天气查询
* @param {String} city - 城市名称
* @param {Number} retries - 剩余重试次数
* @returns {Object|null} 天气数据
*/
function getWeatherWithRetry(city, retries) {
    if (retries === undefined) {
      retries = WEATHER_CONFIG.maxRetries;
    }
   
    for (var attempt = 1; attempt <= retries; attempt++) {
      printl("\n--- 第 " + attempt + "/" + retries + " 次尝试 ---");
      
      var result = getWeatherInfo(city);
      
      if (result) {
            printl("✅ 成功获取天气数据");
            return result;
      }
      
      if (attempt < retries) {
            printl("⚠️ 准备重试...");
            // 短暂延迟后重试(注释掉可能不存在的sleep函数)
            // sleep.millisecond(1000);
      }
    }
   
    printl("❌ 经过 " + retries + " 次尝试后仍然失败");
    return null;
}

/**
* 批量查询多个城市天气
* @param {Array} cities - 城市名称数组
*/
function queryMultipleCities(cities) {
    printl("\n&#127760; 开始批量查询 " + cities.length + " 个城市的天气\n");
   
    var results = [];
   
    for (var i = 0; i < cities.length; i++) {
      var city = cities;
      printl("\n[" + (i + 1) + "/" + cities.length + "] 查询: " + city);
      
      var weatherData = getWeatherWithRetry(city, 2);
      
      if (weatherData) {
            results.push(weatherData);
            displayWeatherInfo(weatherData);
      } else {
            printl("⚠️ 跳过城市: " + city);
      }
      
      // 避免频繁请求(注释掉可能不存在的sleep函数)
      // if (i < cities.length - 1) {
      //   sleep.millisecond(500);
      // }
    }
   
    printl("\n&#128202; 查询完成统计:");
    printl("总计: " + cities.length + " 个城市");
    printl("成功: " + results.length + " 个");
    printl("失败: " + (cities.length - results.length) + " 个");
   
    return results;
}

// =============================================================================
// 主程序入口
// =============================================================================

function main() {
    printl("========================================");
    printl("&#127780;️ AIWROK 天气信息查询工具 v1.0");
    printl("适用于苹果iOS系统");
    printl("========================================\n");
   
    // 示例1: 查询单个城市
    printl("【示例1】查询单个城市天气");
    var singleCityWeather = getWeatherWithRetry(WEATHER_CONFIG.defaultCity);
    if (singleCityWeather) {
      displayWeatherInfo(singleCityWeather);
    }
   
    // 示例2: 批量查询多个城市
    printl("\n【示例2】批量查询多个城市天气");
    var cities = ["北京", "上海", "广州", "深圳"];
    var batchResults = queryMultipleCities(cities);
   
    // 示例3: 查询用户自定义城市
    printl("\n【示例3】查询其他城市");
    var otherCities = ["成都", "杭州", "武汉"];
    queryMultipleCities(otherCities);
   
    printl("\n========================================");
    printl("✅ 所有查询任务完成");
    printl("========================================");
}

// 执行主程序
main();


页: [1]
查看完整版本: 苹果iOS脚本天气信息查询工具