mirror of
				https://github.com/LiteyukiStudio/LiteyukiBot.git
				synced 2025-10-31 19:36:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			172 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import aiohttp
 | ||
| 
 | ||
| from .qw_models import *
 | ||
| import httpx
 | ||
| 
 | ||
| from ...utils.base.data_manager import get_memory_data
 | ||
| from ...utils.base.language import Language
 | ||
| 
 | ||
| dev_url = "https://devapi.qweather.com/"  # 开发HBa
 | ||
| com_url = "https://api.qweather.com/"  # 正式环境
 | ||
| 
 | ||
| 
 | ||
| def get_qw_lang(lang: str) -> str:
 | ||
|     if lang in ["zh-HK", "zh-TW"]:
 | ||
|         return "zh-hant"
 | ||
|     elif lang.startswith("zh"):
 | ||
|         return "zh"
 | ||
|     elif lang.startswith("en"):
 | ||
|         return "en"
 | ||
|     else:
 | ||
|         return lang
 | ||
| 
 | ||
| 
 | ||
| async def check_key_dev(key: str) -> bool:
 | ||
|     url = "https://api.qweather.com/v7/weather/now?"
 | ||
|     params = {
 | ||
|             "location": "101010100",
 | ||
|             "key"     : key,
 | ||
|     }
 | ||
|     async with aiohttp.ClientSession() as client:
 | ||
|         resp = await client.get(url, params=params)
 | ||
|         return (await resp.json()).get("code") != "200"  # 查询不到付费数据为开发版
 | ||
| 
 | ||
| 
 | ||
| def get_local_data(ulang_code: str) -> dict:
 | ||
|     """
 | ||
|     获取本地化数据
 | ||
|     Args:
 | ||
|         ulang_code:
 | ||
| 
 | ||
|     Returns:
 | ||
| 
 | ||
|     """
 | ||
|     ulang = Language(ulang_code)
 | ||
|     return {
 | ||
|             "monday"   : ulang.get("weather.monday"),
 | ||
|             "tuesday"  : ulang.get("weather.tuesday"),
 | ||
|             "wednesday": ulang.get("weather.wednesday"),
 | ||
|             "thursday" : ulang.get("weather.thursday"),
 | ||
|             "friday"   : ulang.get("weather.friday"),
 | ||
|             "saturday" : ulang.get("weather.saturday"),
 | ||
|             "sunday"   : ulang.get("weather.sunday"),
 | ||
|             "today"    : ulang.get("weather.today"),
 | ||
|             "tomorrow" : ulang.get("weather.tomorrow"),
 | ||
|             "day"      : ulang.get("weather.day"),
 | ||
|             "night"    : ulang.get("weather.night"),
 | ||
|             "no_aqi"   : ulang.get("weather.no_aqi"),
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
| async def city_lookup(
 | ||
|         location: str,
 | ||
|         key: str,
 | ||
|         adm: str = "",
 | ||
|         number: int = 20,
 | ||
|         lang: str = "zh",
 | ||
| ) -> CityLookup:
 | ||
|     """
 | ||
|     通过关键字搜索城市信息
 | ||
|     Args:
 | ||
|         location:
 | ||
|         key:
 | ||
|         adm:
 | ||
|         number:
 | ||
|         lang: 可传入标准i18n语言代码,如zh-CN、en-US等
 | ||
| 
 | ||
|     Returns:
 | ||
| 
 | ||
|     """
 | ||
|     url = "https://geoapi.qweather.com/v2/city/lookup?"
 | ||
|     params = {
 | ||
|             "location": location,
 | ||
|             "adm"     : adm,
 | ||
|             "number"  : number,
 | ||
|             "key"     : key,
 | ||
|             "lang"    : lang,
 | ||
|     }
 | ||
|     async with httpx.AsyncClient() as client:
 | ||
|         resp = await client.get(url, params=params)
 | ||
|         return CityLookup.parse_obj(resp.json())
 | ||
| 
 | ||
| 
 | ||
| async def get_weather_now(
 | ||
|         key: str,
 | ||
|         location: str,
 | ||
|         lang: str = "zh",
 | ||
|         unit: str = "m",
 | ||
|         dev: bool = get_memory_data("is_dev", True),
 | ||
| ) -> dict:
 | ||
|     url_path = "v7/weather/now?"
 | ||
|     url = dev_url + url_path if dev else com_url + url_path
 | ||
|     params = {
 | ||
|             "location": location,
 | ||
|             "key"     : key,
 | ||
|             "lang"    : lang,
 | ||
|             "unit"    : unit,
 | ||
|     }
 | ||
|     async with httpx.AsyncClient() as client:
 | ||
|         resp = await client.get(url, params=params)
 | ||
|         return resp.json()
 | ||
| 
 | ||
| 
 | ||
| async def get_weather_daily(
 | ||
|         key: str,
 | ||
|         location: str,
 | ||
|         lang: str = "zh",
 | ||
|         unit: str = "m",
 | ||
|         dev: bool = get_memory_data("is_dev", True),
 | ||
| ) -> dict:
 | ||
|     url_path = "v7/weather/%dd?" % (7 if dev else 30)
 | ||
|     url = dev_url + url_path if dev else com_url + url_path
 | ||
|     params = {
 | ||
|             "location": location,
 | ||
|             "key"     : key,
 | ||
|             "lang"    : lang,
 | ||
|             "unit"    : unit,
 | ||
|     }
 | ||
|     async with httpx.AsyncClient() as client:
 | ||
|         resp = await client.get(url, params=params)
 | ||
|         return resp.json()
 | ||
| 
 | ||
| 
 | ||
| async def get_weather_hourly(
 | ||
|         key: str,
 | ||
|         location: str,
 | ||
|         lang: str = "zh",
 | ||
|         unit: str = "m",
 | ||
|         dev: bool = get_memory_data("is_dev", True),
 | ||
| ) -> dict:
 | ||
|     url_path = "v7/weather/%dh?" % (24 if dev else 168)
 | ||
|     url = dev_url + url_path if dev else com_url + url_path
 | ||
|     params = {
 | ||
|             "location": location,
 | ||
|             "key"     : key,
 | ||
|             "lang"    : lang,
 | ||
|             "unit"    : unit,
 | ||
|     }
 | ||
|     async with httpx.AsyncClient() as client:
 | ||
|         resp = await client.get(url, params=params)
 | ||
|         return resp.json()
 | ||
| 
 | ||
| 
 | ||
| async def get_airquality(
 | ||
|         key: str,
 | ||
|         location: str,
 | ||
|         lang: str,
 | ||
|         pollutant: bool = False,
 | ||
|         station: bool = False,
 | ||
|         dev: bool = get_memory_data("is_dev", True),
 | ||
| ) -> dict:
 | ||
|     url_path = f"airquality/v1/now/{location}?"
 | ||
|     url = dev_url + url_path if dev else com_url + url_path
 | ||
|     params = {
 | ||
|             "key"      : key,
 | ||
|             "lang"     : lang,
 | ||
|             "pollutant": pollutant,
 | ||
|             "station"  : station,
 | ||
|     }
 | ||
|     async with httpx.AsyncClient() as client:
 | ||
|         resp = await client.get(url, params=params)
 | ||
|         return resp.json()
 |