botserver/templates/public-apis.gbai/public-apis.gbdialog/weather-apis.vbs

244 lines
7.8 KiB
Text

REM General Bots: Weather APIs - Free Weather Data Integration
REM Based on public-apis list - No authentication required
REM ============================================
REM WEATHER KEYWORD - 7Timer! Astro Weather
REM ============================================
PARAM location AS string LIKE "116.39,39.90"
DESCRIPTION "Get 7-day astronomical weather forecast for stargazing and astronomy"
coordinates = SPLIT(location, ",")
lat = coordinates[0]
lon = coordinates[1]
weather_data = GET "http://www.7timer.info/bin/api.pl?lon=" + lon + "&lat=" + lat + "&product=astro&output=json"
result = NEW OBJECT
result.location = location
result.dataseries = weather_data.dataseries
result.init = weather_data.init
TALK "📡 7Timer Astro Weather for " + location + ":"
TALK "Initialization time: " + result.init
FOR EACH forecast IN result.dataseries
timepoint = forecast.timepoint
cloudcover = forecast.cloudcover
seeing = forecast.seeing
transparency = forecast.transparency
TALK "⏰ +" + timepoint + "h | ☁️ Cloud: " + cloudcover + " | 👁️ Seeing: " + seeing + " | 🔭 Transparency: " + transparency
END FOR
RETURN result
REM ============================================
REM WEATHER KEYWORD - 7Timer! Civil Weather
REM ============================================
PARAM location AS string LIKE "116.39,39.90"
DESCRIPTION "Get 7-day civil weather forecast with temperature and precipitation"
coordinates = SPLIT(location, ",")
lat = coordinates[0]
lon = coordinates[1]
weather_data = GET "http://www.7timer.info/bin/api.pl?lon=" + lon + "&lat=" + lat + "&product=civil&output=json"
result = NEW OBJECT
result.location = location
result.forecast = weather_data.dataseries
TALK "🌤️ 7-Day Weather Forecast for " + location + ":"
FOR EACH day IN result.forecast
timepoint = day.timepoint
temp = day.temp2m
weather_type = day.weather
wind = day.wind10m.speed
TALK "Day " + timepoint + ": " + weather_type + " | 🌡️ " + temp + "°C | 💨 Wind: " + wind + " km/h"
END FOR
RETURN result
REM ============================================
REM WEATHER KEYWORD - Open-Meteo (No API Key)
REM ============================================
PARAM latitude AS number LIKE 52.52
PARAM longitude AS number LIKE 13.41
DESCRIPTION "Get real-time weather data from Open-Meteo (70+ years of historical data available)"
weather_url = "https://api.open-meteo.com/v1/forecast?latitude=" + latitude + "&longitude=" + longitude + "&current_weather=true&hourly=temperature_2m,relativehumidity_2m,precipitation,weathercode,windspeed_10m"
weather_data = GET weather_url
current = weather_data.current_weather
result = NEW OBJECT
result.temperature = current.temperature
result.windspeed = current.windspeed
result.winddirection = current.winddirection
result.weathercode = current.weathercode
result.time = current.time
TALK "🌍 Open-Meteo Weather Report"
TALK "📍 Location: " + latitude + ", " + longitude
TALK "🌡️ Temperature: " + result.temperature + "°C"
TALK "💨 Wind Speed: " + result.windspeed + " km/h"
TALK "🧭 Wind Direction: " + result.winddirection + "°"
TALK "⏰ Updated: " + result.time
RETURN result
REM ============================================
REM WEATHER KEYWORD - MetaWeather Location Search
REM ============================================
PARAM city AS string LIKE "London"
DESCRIPTION "Search for weather location ID by city name"
search_url = "https://www.metaweather.com/api/location/search/?query=" + city
locations = GET search_url
IF UBOUND(locations) > 0 THEN
result = NEW OBJECT
result.locations = locations
TALK "🔍 Found " + UBOUND(locations) + " location(s) for '" + city + "':"
FOR EACH loc IN locations
TALK "📍 " + loc.title + " (WOEID: " + loc.woeid + ") - " + loc.location_type
END FOR
RETURN result
ELSE
TALK "❌ No locations found for: " + city
RETURN NULL
END IF
REM ============================================
REM WEATHER KEYWORD - Rain Viewer Radar Map
REM ============================================
DESCRIPTION "Get available rain radar map timestamps for visualization"
radar_data = GET "https://api.rainviewer.com/public/weather-maps.json"
result = NEW OBJECT
result.host = radar_data.host
result.radar_past = radar_data.radar.past
result.radar_nowcast = radar_data.radar.nowcast
TALK "🌧️ Rain Viewer Radar Data Available"
TALK "📡 Host: " + result.host
TALK "📊 Past radar images: " + UBOUND(result.radar_past)
TALK "🔮 Nowcast images: " + UBOUND(result.radar_nowcast)
IF UBOUND(result.radar_past) > 0 THEN
latest = result.radar_past[UBOUND(result.radar_past) - 1]
map_url = result.host + latest.path + "/256/{z}/{x}/{y}/2/1_1.png"
TALK "🗺️ Latest radar map template: " + map_url
END IF
RETURN result
REM ============================================
REM WEATHER KEYWORD - OpenSenseMap Weather Stations
REM ============================================
PARAM bbox AS string LIKE "7.6,51.2,7.8,51.3"
DESCRIPTION "Get data from personal weather stations (senseBoxes) in a bounding box"
stations_url = "https://api.opensensemap.org/boxes?bbox=" + bbox + "&phenomenon=temperature"
stations = GET stations_url
result = NEW OBJECT
result.count = UBOUND(stations)
result.stations = stations
TALK "🌡️ OpenSenseMap Weather Stations in area: " + bbox
TALK "📊 Found " + result.count + " active stations"
counter = 0
FOR EACH station IN stations
IF counter < 5 THEN
TALK "📍 " + station.name + " (" + station.exposure + ")"
IF station.currentLocation THEN
TALK " Location: " + station.currentLocation.coordinates[1] + ", " + station.currentLocation.coordinates[0]
END IF
END IF
counter = counter + 1
END FOR
IF result.count > 5 THEN
TALK "... and " + (result.count - 5) + " more stations"
END IF
RETURN result
REM ============================================
REM WEATHER KEYWORD - AQICN Air Quality
REM ============================================
PARAM city AS string LIKE "beijing"
DESCRIPTION "Get Air Quality Index data for major cities (Note: API key recommended for production)"
aqi_url = "https://api.waqi.info/feed/" + city + "/?token=demo"
aqi_data = GET aqi_url
IF aqi_data.status = "ok" THEN
result = NEW OBJECT
result.aqi = aqi_data.data.aqi
result.city = aqi_data.data.city.name
result.time = aqi_data.data.time.s
aqi_level = ""
IF result.aqi <= 50 THEN
aqi_level = "Good 😊"
ELSE IF result.aqi <= 100 THEN
aqi_level = "Moderate 😐"
ELSE IF result.aqi <= 150 THEN
aqi_level = "Unhealthy for Sensitive Groups 😷"
ELSE IF result.aqi <= 200 THEN
aqi_level = "Unhealthy 😨"
ELSE IF result.aqi <= 300 THEN
aqi_level = "Very Unhealthy 🤢"
ELSE
aqi_level = "Hazardous ☠️"
END IF
TALK "🌫️ Air Quality Index for " + result.city
TALK "📊 AQI: " + result.aqi + " - " + aqi_level
TALK "⏰ Updated: " + result.time
RETURN result
ELSE
TALK "❌ Could not fetch AQI data for: " + city
RETURN NULL
END IF
REM ============================================
REM WEATHER KEYWORD - Get Weather Icon
REM ============================================
PARAM condition AS string LIKE "sunny"
DESCRIPTION "Get weather emoji/icon based on condition"
condition_lower = LCASE(condition)
icon = "🌡️"
IF INSTR(condition_lower, "sun") > 0 OR INSTR(condition_lower, "clear") > 0 THEN
icon = "☀️"
ELSE IF INSTR(condition_lower, "cloud") > 0 THEN
icon = "☁️"
ELSE IF INSTR(condition_lower, "rain") > 0 THEN
icon = "🌧️"
ELSE IF INSTR(condition_lower, "snow") > 0 THEN
icon = "❄️"
ELSE IF INSTR(condition_lower, "storm") > 0 OR INSTR(condition_lower, "thunder") > 0 THEN
icon = "⛈️"
ELSE IF INSTR(condition_lower, "fog") > 0 OR INSTR(condition_lower, "mist") > 0 THEN
icon = "🌫️"
ELSE IF INSTR(condition_lower, "wind") > 0 THEN
icon = "💨"
END IF
RETURN icon