mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-09-29 08:39:59 +08:00
fix
This commit is contained in:
@@ -1,10 +1,9 @@
|
||||
from nonebot import on_regex
|
||||
from .data_source import get_weather_of_city
|
||||
from .data_source import get_weather_of_city, update_city, get_city_list
|
||||
from nonebot.adapters.cqhttp import Bot, MessageEvent, GroupMessageEvent
|
||||
from jieba import posseg
|
||||
from services.log import logger
|
||||
from nonebot.typing import T_State
|
||||
from .config import city_list
|
||||
import re
|
||||
from utils.utils import get_message_text
|
||||
|
||||
@@ -26,14 +25,9 @@ async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
msg += "市"
|
||||
city = ""
|
||||
if msg:
|
||||
citys = []
|
||||
for x in city_list.keys():
|
||||
for city in city_list[x]:
|
||||
citys.append(city)
|
||||
city_list = get_city_list()
|
||||
for word in posseg.lcut(msg):
|
||||
if word.word in city_list.keys():
|
||||
await weather.finish("不要查一个省的天气啊,这么大查起来很累人的..", at_sender=True)
|
||||
if word.flag == "ns" or word.word[:-1] in citys:
|
||||
if word.flag == "ns" or word.word[:-1] in city_list:
|
||||
city = str(word.word).strip()
|
||||
break
|
||||
if word.word == "火星":
|
||||
|
||||
@@ -1,327 +0,0 @@
|
||||
city_list = {
|
||||
"北京": ["北京"],
|
||||
"天津": ["天津"],
|
||||
"山西": ["太原", "阳泉", "晋城", "长治", "临汾", "运城", "忻州", "吕梁", "晋中", "大同", "朔州"],
|
||||
"河北": [
|
||||
"沧州",
|
||||
"石家庄",
|
||||
"唐山",
|
||||
"保定",
|
||||
"廊坊",
|
||||
"衡水",
|
||||
"邯郸",
|
||||
"邢台",
|
||||
"张家口",
|
||||
"辛集",
|
||||
"秦皇岛",
|
||||
"定州",
|
||||
"承德",
|
||||
"涿州",
|
||||
],
|
||||
"山东": [
|
||||
"济南",
|
||||
"淄博",
|
||||
"聊城",
|
||||
"德州",
|
||||
"滨州",
|
||||
"济宁",
|
||||
"菏泽",
|
||||
"枣庄",
|
||||
"烟台",
|
||||
"威海",
|
||||
"泰安",
|
||||
"青岛",
|
||||
"临沂",
|
||||
"莱芜",
|
||||
"东营",
|
||||
"潍坊",
|
||||
"日照",
|
||||
],
|
||||
"河南": [
|
||||
"郑州",
|
||||
"新乡",
|
||||
"鹤壁",
|
||||
"安阳",
|
||||
"焦作",
|
||||
"濮阳",
|
||||
"开封",
|
||||
"驻马店",
|
||||
"商丘",
|
||||
"三门峡",
|
||||
"南阳",
|
||||
"洛阳",
|
||||
"周口",
|
||||
"许昌",
|
||||
"信阳",
|
||||
"漯河",
|
||||
"平顶山",
|
||||
"济源",
|
||||
],
|
||||
"广东": [
|
||||
"珠海",
|
||||
"中山",
|
||||
"肇庆",
|
||||
"深圳",
|
||||
"清远",
|
||||
"揭阳",
|
||||
"江门",
|
||||
"惠州",
|
||||
"河源",
|
||||
"广州",
|
||||
"佛山",
|
||||
"东莞",
|
||||
"潮州",
|
||||
"汕尾",
|
||||
"梅州",
|
||||
"阳江",
|
||||
"云浮",
|
||||
"韶关",
|
||||
"湛江",
|
||||
"汕头",
|
||||
"茂名",
|
||||
],
|
||||
"浙江": ["舟山", "温州", "台州", "绍兴", "衢州", "宁波", "丽水", "金华", "嘉兴", "湖州", "杭州"],
|
||||
"宁夏": ["中卫", "银川", "吴忠", "石嘴山", "固原"],
|
||||
"江苏": [
|
||||
"镇江",
|
||||
"扬州",
|
||||
"盐城",
|
||||
"徐州",
|
||||
"宿迁",
|
||||
"无锡",
|
||||
"苏州",
|
||||
"南通",
|
||||
"南京",
|
||||
"连云港",
|
||||
"淮安",
|
||||
"常州",
|
||||
"泰州",
|
||||
],
|
||||
"湖南": [
|
||||
"长沙",
|
||||
"邵阳",
|
||||
"怀化",
|
||||
"株洲",
|
||||
"张家界",
|
||||
"永州",
|
||||
"益阳",
|
||||
"湘西",
|
||||
"娄底",
|
||||
"衡阳",
|
||||
"郴州",
|
||||
"岳阳",
|
||||
"常德",
|
||||
"湘潭",
|
||||
],
|
||||
"吉林": ["长春", "长春", "通化", "松原", "四平", "辽源", "吉林", "延边", "白山", "白城"],
|
||||
"福建": ["漳州", "厦门", "福州", "三明", "莆田", "宁德", "南平", "龙岩", "泉州"],
|
||||
"甘肃": [
|
||||
"张掖",
|
||||
"陇南",
|
||||
"兰州",
|
||||
"嘉峪关",
|
||||
"白银",
|
||||
"武威",
|
||||
"天水",
|
||||
"庆阳",
|
||||
"平凉",
|
||||
"临夏",
|
||||
"酒泉",
|
||||
"金昌",
|
||||
"甘南",
|
||||
"定西",
|
||||
],
|
||||
"陕西": ["榆林", "西安", "延安", "咸阳", "渭南", "铜川", "商洛", "汉中", "宝鸡", "安康"],
|
||||
"辽宁": [
|
||||
"营口",
|
||||
"铁岭",
|
||||
"沈阳",
|
||||
"盘锦",
|
||||
"辽阳",
|
||||
"锦州",
|
||||
"葫芦岛",
|
||||
"阜新",
|
||||
"抚顺",
|
||||
"丹东",
|
||||
"大连",
|
||||
"朝阳",
|
||||
"本溪",
|
||||
"鞍山",
|
||||
],
|
||||
"江西": ["鹰潭", "宜春", "上饶", "萍乡", "南昌", "景德镇", "吉安", "抚州", "新余", "九江", "赣州"],
|
||||
"黑龙江": [
|
||||
"伊春",
|
||||
"七台河",
|
||||
"牡丹江",
|
||||
"鸡西",
|
||||
"黑河",
|
||||
"鹤岗",
|
||||
"哈尔滨",
|
||||
"大兴安岭",
|
||||
"绥化",
|
||||
"双鸭山",
|
||||
"齐齐哈尔",
|
||||
"佳木斯",
|
||||
"大庆",
|
||||
],
|
||||
"安徽": [
|
||||
"宣城",
|
||||
"铜陵",
|
||||
"六安",
|
||||
"黄山",
|
||||
"淮南",
|
||||
"合肥",
|
||||
"阜阳",
|
||||
"亳州",
|
||||
"安庆",
|
||||
"池州",
|
||||
"宿州",
|
||||
"芜湖",
|
||||
"马鞍山",
|
||||
"淮北",
|
||||
"滁州",
|
||||
"蚌埠",
|
||||
],
|
||||
"湖北": [
|
||||
"孝感",
|
||||
"武汉",
|
||||
"十堰",
|
||||
"荆门",
|
||||
"黄冈",
|
||||
"襄阳",
|
||||
"咸宁",
|
||||
"随州",
|
||||
"黄石",
|
||||
"恩施",
|
||||
"鄂州",
|
||||
"荆州",
|
||||
"宜昌",
|
||||
"潜江",
|
||||
"天门",
|
||||
"神农架",
|
||||
"仙桃",
|
||||
],
|
||||
"青海": ["西宁", "海西", "海东", "玉树", "黄南", "海南", "海北", "果洛"],
|
||||
"新疆": [
|
||||
"乌鲁木齐",
|
||||
"克州",
|
||||
"阿勒泰",
|
||||
"五家渠",
|
||||
"石河子",
|
||||
"伊犁",
|
||||
"吐鲁番",
|
||||
"塔城",
|
||||
"克拉玛依",
|
||||
"喀什",
|
||||
"和田",
|
||||
"哈密",
|
||||
"昌吉",
|
||||
"博尔塔拉",
|
||||
"阿克苏",
|
||||
"巴音郭楞",
|
||||
"阿拉尔",
|
||||
"图木舒克",
|
||||
"铁门关",
|
||||
],
|
||||
"贵州": ["铜仁", "黔东南", "贵阳", "安顺", "遵义", "黔西南", "黔南", "六盘水", "毕节"],
|
||||
"四川": [
|
||||
"遂宁",
|
||||
"攀枝花",
|
||||
"眉山",
|
||||
"凉山",
|
||||
"成都",
|
||||
"巴中",
|
||||
"广安",
|
||||
"自贡",
|
||||
"甘孜",
|
||||
"资阳",
|
||||
"宜宾",
|
||||
"雅安",
|
||||
"内江",
|
||||
"南充",
|
||||
"绵阳",
|
||||
"泸州",
|
||||
"凉山",
|
||||
"乐山",
|
||||
"广元",
|
||||
"甘孜",
|
||||
"德阳",
|
||||
"达州",
|
||||
"阿坝",
|
||||
],
|
||||
"上海": ["上海"],
|
||||
"广西": [
|
||||
"南宁",
|
||||
"贵港",
|
||||
"玉林",
|
||||
"梧州",
|
||||
"钦州",
|
||||
"柳州",
|
||||
"来宾",
|
||||
"贺州",
|
||||
"河池",
|
||||
"桂林",
|
||||
"防城港",
|
||||
"崇左",
|
||||
"北海",
|
||||
"百色",
|
||||
],
|
||||
"西藏": ["拉萨", "山南", "日喀则", "那曲", "林芝", "昌都", "阿里"],
|
||||
"云南": [
|
||||
"昆明",
|
||||
"红河",
|
||||
"大理",
|
||||
"玉溪",
|
||||
"昭通",
|
||||
"西双版纳",
|
||||
"文山",
|
||||
"曲靖",
|
||||
"普洱",
|
||||
"怒江",
|
||||
"临沧",
|
||||
"丽江",
|
||||
"红河",
|
||||
"迪庆",
|
||||
"德宏",
|
||||
"大理",
|
||||
"楚雄",
|
||||
"保山",
|
||||
],
|
||||
"内蒙古": [
|
||||
"呼和浩特",
|
||||
"乌兰察布",
|
||||
"兴安",
|
||||
"赤峰",
|
||||
"呼伦贝尔",
|
||||
"锡林郭勒",
|
||||
"乌海",
|
||||
"通辽",
|
||||
"巴彦淖尔",
|
||||
"阿拉善",
|
||||
"鄂尔多斯",
|
||||
"包头",
|
||||
],
|
||||
"海南": [
|
||||
"海口",
|
||||
"三沙",
|
||||
"三亚",
|
||||
"临高",
|
||||
"五指山",
|
||||
"陵水",
|
||||
"文昌",
|
||||
"万宁",
|
||||
"白沙",
|
||||
"乐东",
|
||||
"澄迈",
|
||||
"屯昌",
|
||||
"定安",
|
||||
"东方",
|
||||
"保亭",
|
||||
"琼中",
|
||||
"琼海",
|
||||
"儋州",
|
||||
"昌江",
|
||||
],
|
||||
"重庆": ["重庆"],
|
||||
"台湾": ["台北", "高雄", "基隆", "台中", "台南", "新竹", "嘉义", "新北", "桃园"],
|
||||
}
|
||||
@@ -1,21 +1,99 @@
|
||||
import requests
|
||||
from services.log import logger
|
||||
from utils.message_builder import image
|
||||
from utils.user_agent import get_user_agent
|
||||
from configs.path_config import TXT_PATH
|
||||
from asyncio.exceptions import TimeoutError
|
||||
from typing import List
|
||||
from nonebot import Driver
|
||||
from pathlib import Path
|
||||
import aiohttp
|
||||
import ujson as json
|
||||
import nonebot
|
||||
|
||||
driver: Driver = nonebot.get_driver()
|
||||
|
||||
china_city = Path(TXT_PATH) / "china_city.json"
|
||||
|
||||
try:
|
||||
with open(china_city, "r", encoding="utf8") as f:
|
||||
data = json.load(f)
|
||||
except FileNotFoundError:
|
||||
data = {}
|
||||
|
||||
|
||||
async def get_weather_of_city(city) -> str:
|
||||
url = "http://wthrcdn.etouch.cn/weather_mini?city=" + city
|
||||
data_json = requests.get(url).json()
|
||||
if "desc" in data_json:
|
||||
if data_json["desc"] == "invilad-citykey":
|
||||
return "你为啥不查火星的天气呢?小真寻只支持国内天气查询!!" + image("shengqi", "zhenxun")
|
||||
elif data_json["desc"] == "OK":
|
||||
w_type = data_json["data"]["forecast"][0]["type"]
|
||||
w_max = data_json["data"]["forecast"][0]["high"][3:]
|
||||
w_min = data_json["data"]["forecast"][0]["low"][3:]
|
||||
fengli = data_json["data"]["forecast"][0]["fengli"][9:-3]
|
||||
ganmao = data_json["data"]["ganmao"]
|
||||
fengxiang = data_json["data"]["forecast"][0]["fengxiang"]
|
||||
repass = f"{city}的天气是 {w_type} 天\n最高温度: {w_max}\n最低温度: {w_min}\n风力: {fengli} {fengxiang}\n{ganmao}"
|
||||
return repass
|
||||
async def get_weather_of_city(city: str) -> str:
|
||||
code = _check_exists_city(city)
|
||||
if code == 999:
|
||||
return "不要查一个省份的天气啊,很累人的!"
|
||||
elif code == 998:
|
||||
return "真寻只可以查询国内的天气喔..."
|
||||
else:
|
||||
return "好像出错了?"
|
||||
async with aiohttp.ClientSession(headers=get_user_agent()) as session:
|
||||
async with session.get(
|
||||
f"http://wthrcdn.etouch.cn/weather_mini?city={city}", timeout=5
|
||||
) as res:
|
||||
data_json = json.loads(await res.text(encoding="utf8"))
|
||||
if "desc" in data_json:
|
||||
if data_json["desc"] == "invilad-citykey":
|
||||
return "你为啥不查火星的天气呢?小真寻只支持国内天气查询!!" + image(
|
||||
"shengqi", "zhenxun"
|
||||
)
|
||||
elif data_json["desc"] == "OK":
|
||||
w_type = data_json["data"]["forecast"][0]["type"]
|
||||
w_max = data_json["data"]["forecast"][0]["high"][3:]
|
||||
w_min = data_json["data"]["forecast"][0]["low"][3:]
|
||||
fengli = data_json["data"]["forecast"][0]["fengli"][9:-3]
|
||||
ganmao = data_json["data"]["ganmao"]
|
||||
fengxiang = data_json["data"]["forecast"][0]["fengxiang"]
|
||||
repass = f"{city}的天气是 {w_type} 天\n最高温度: {w_max}\n最低温度: {w_min}\n风力: {fengli} {fengxiang}\n{ganmao}"
|
||||
return repass
|
||||
else:
|
||||
return "好像出错了?"
|
||||
|
||||
|
||||
# 更新城市
|
||||
@driver.on_startup
|
||||
async def update_city():
|
||||
global data
|
||||
try:
|
||||
async with aiohttp.ClientSession(headers=get_user_agent()) as session:
|
||||
async with session.get(
|
||||
"http://www.weather.com.cn/data/city3jdata/china.html", timeout=5
|
||||
) as res:
|
||||
provinces_data = json.loads(await res.text(encoding="utf8"))
|
||||
for province in provinces_data.keys():
|
||||
data[provinces_data[province]] = []
|
||||
async with session.get(
|
||||
f"http://www.weather.com.cn/data/city3jdata/provshi/{province}.html",
|
||||
timeout=5,
|
||||
) as res:
|
||||
city_data = json.loads(await res.text(encoding="utf8"))
|
||||
for city in city_data.keys():
|
||||
data[provinces_data[province]].append(city_data[city])
|
||||
with open(china_city, "w", encoding="utf8") as f:
|
||||
json.dump(data, f, indent=4, ensure_ascii=False)
|
||||
logger.info("自动更新城市列表完成.....")
|
||||
except TimeoutError:
|
||||
logger.info("自动更新城市列表超时.....")
|
||||
|
||||
|
||||
# 城市是否存在或是否是省份
|
||||
def _check_exists_city(city: str) -> int:
|
||||
city = city if city[-1] != "市" else city[:-1]
|
||||
for province in data.keys():
|
||||
# 查询省份了
|
||||
if city == province and len(data[province]) != 1:
|
||||
return 999
|
||||
for city_ in data[province]:
|
||||
if city_ == city:
|
||||
return 200
|
||||
return 998
|
||||
|
||||
|
||||
def get_city_list() -> List[str]:
|
||||
global data
|
||||
city_list = []
|
||||
for p in data.keys():
|
||||
for c in data[p]:
|
||||
city_list.append(c)
|
||||
return city_list
|
||||
|
||||
Reference in New Issue
Block a user