diff --git a/Apilot.py b/Apilot.py
index 5032c7d..f5ff803 100644
--- a/Apilot.py
+++ b/Apilot.py
@@ -25,6 +25,7 @@ def __init__(self):
super().__init__()
try:
self.conf = super().load_config()
+ self.condition_2_and_3_cities = None # 天气查询,存储重复城市信息,Initially set to None
if not self.conf:
logger.warn("[Apilot] inited but alapi_token not found in config")
self.alapi_token = None # Setting a default value for alapi_token
@@ -40,7 +41,7 @@ def on_handle_context(self, e_context: EventContext):
ContextType.TEXT
]:
return
- content = e_context["context"].content
+ content = e_context["context"].content.strip()
logger.debug("[Apilot] on_handle_context. content: %s" % content)
if content == "早报":
@@ -60,19 +61,29 @@ def on_handle_context(self, e_context: EventContext):
# Extract the part after "快递"
tracking_number = content[2:].strip()
+ tracking_number = tracking_number.replace(':', ':') # 替换可能出现的中文符号
# Check if alapi_token is available before calling the function
if not self.alapi_token:
self.handle_error("alapi_token not configured", "快递请求失败")
reply = self.create_reply(ReplyType.TEXT, "请先配置alapi的token")
else:
+ # Check if the tracking_number starts with "SF" for Shunfeng (顺丰) Express
+ if tracking_number.startswith("SF"):
+ # Check if the user has included the last four digits of the phone number
+ if ':' not in tracking_number:
+ reply = self.create_reply(ReplyType.TEXT, "顺丰快递需要补充寄/收件人手机号后四位,格式:SF12345:0000")
+ e_context["reply"] = reply
+ e_context.action = EventAction.BREAK_PASS # 事件结束,并跳过处理context的默认逻辑
+ return # End the function here
+
# Call query_express_info function with the extracted tracking_number and the alapi_token from config
content = self.query_express_info(self.alapi_token, tracking_number)
reply = self.create_reply(ReplyType.TEXT, content)
e_context["reply"] = reply
e_context.action = EventAction.BREAK_PASS # 事件结束,并跳过处理context的默认逻辑
- match = re.match(r'^([\u4e00-\u9fa5]{2}座)$', content)
- if match:
+ horoscope_match = re.match(r'^([\u4e00-\u9fa5]{2}座)$', content)
+ if horoscope_match:
if content in ZODIAC_MAPPING:
zodiac_english = ZODIAC_MAPPING[content]
content = self.get_horoscope(zodiac_english)
@@ -82,30 +93,49 @@ def on_handle_context(self, e_context: EventContext):
e_context["reply"] = reply
e_context.action = EventAction.BREAK_PASS # 事件结束,并跳过处理context的默认逻辑
- if content == "微博热搜":
- content = self.get_weibo_hot_trends()
+ hot_trend_match = re.search(r'(.{1,6})热榜$', content)
+ if hot_trend_match:
+ hot_trends_type = hot_trend_match.group(1).strip() # 提取匹配的组并去掉可能的空格
+ content = self.get_hot_trends(hot_trends_type)
reply = self.create_reply(ReplyType.TEXT, content)
e_context["reply"] = reply
e_context.action = EventAction.BREAK_PASS # 事件结束,并跳过处理context的默认逻辑
+
# 天气查询
- weather_match = re.search(r'([\u4e00-\u9fa5]{1,6})的?天气$', content)
+ weather_match = re.search(r'([\u4e00-\u9fa5]{1,6}|\d{1,10})\s*的?天气$', content)
if weather_match:
- # 如果匹配成功,提取第一个捕获组(可能包含“的”的城市名)
- city_with_optional_de = weather_match.group(1)
- # 移除可能存在的“的”
- city = city_with_optional_de.replace('的', '')
+ # 如果匹配成功,提取第一个捕获组
+ content = weather_match.group(1)
if not self.alapi_token:
self.handle_error("alapi_token not configured", "天气请求失败")
reply = self.create_reply(ReplyType.TEXT, "请先配置alapi的token")
else:
- content = self.get_weather(self.alapi_token, city)
+ content = self.get_weather(self.alapi_token, content)
reply = self.create_reply(ReplyType.TEXT, content)
e_context["reply"] = reply
e_context.action = EventAction.BREAK_PASS # 事件结束,并跳过处理context的默认逻辑
- def get_help_text(self, **kwargs):
- help_text = "\n🐳发送“早报”、“摸鱼”、“微博热搜”、“星座名称”会有惊喜!\n📦快递查询:<快递+快递单号>\n🌦️天气查询:城市+天气"
+ def get_help_text(self, verbose=False, **kwargs):
+ short_help_text = " 发送特定指令以获取早报、查询天气、星座运势、快递信息等!"
+
+ if not verbose:
+ return short_help_text
+
+ help_text = "📚 发送关键词获取特定信息!\n"
+
+ # 娱乐和信息类
+ help_text += "\n🎉 娱乐与资讯:\n"
+ help_text += " 🌅 早报: 发送“早报”获取早报。\n"
+ help_text += " 🐟 摸鱼: 发送“摸鱼”获取摸鱼人日历。\n"
+ help_text += " 🔥 热榜: 发送“xx热榜”查看支持的热榜。\n"
+
+ # 查询类
+ help_text += "\n🔍 查询工具:\n"
+ help_text += " 🌦️ 天气: 发送“城市+天气”查天气,如“北京天气”。\n"
+ help_text += " 📦 快递: 发送“快递+单号”查询快递状态。如“快递112345655”\n"
+ help_text += " 🌌 星座: 发送星座名称查看今日运势,如“白羊座”。\n"
+
return help_text
@@ -150,7 +180,6 @@ def get_moyu_calendar(self):
except Exception as e:
return self.handle_error(e, "获取摸鱼日历信息失败")
-
def get_horoscope(self, astro_sign: str, time_period: str = "today"):
url = BASE_URL_VVHAN + "horoscope"
params = {
@@ -191,24 +220,33 @@ def get_horoscope(self, astro_sign: str, time_period: str = "today"):
except Exception as e:
return self.handle_error(e, "获取星座信息失败")
-
- def get_weibo_hot_trends(self):
- url = BASE_URL_VVHAN + "wbhot"
- try:
- data = self.make_request(url, "GET")
- if isinstance(data, dict) and data['success'] == True:
- output = []
- topics = data['data']
- output.append(f'更新时间:{data["time"]}\n')
- for i, topic in enumerate(topics[:15], 1):
- formatted_str = f"{i}. {topic['title']} ({topic['hot']} 浏览)\nURL: {topic['url']}\n"
- output.append(formatted_str)
- return "\n".join(output)
- else:
- return self.handle_error(data, "热榜获取失败")
- except Exception as e:
- return self.handle_error(e, "获取热搜失败")
-
+ def get_hot_trends(self, hot_trends_type):
+ # 查找映射字典以获取API参数
+ hot_trends_type_en = hot_trend_types.get(hot_trends_type, None)
+ if hot_trends_type_en is not None:
+ url = BASE_URL_VVHAN + "hotlist?type=" + hot_trends_type_en
+ try:
+ data = self.make_request(url, "GET")
+ if isinstance(data, dict) and data['success'] == True:
+ output = []
+ topics = data['data']
+ output.append(f'更新时间:{data["update_time"]}\n')
+ for i, topic in enumerate(topics[:15], 1):
+ hot = topic.get('hot', '无热度参数, 0')
+ formatted_str = f"{i}. {topic['title']} ({hot} 浏览)\nURL: {topic['url']}\n"
+ output.append(formatted_str)
+ return "\n".join(output)
+ else:
+ return self.handle_error(data, "热榜获取失败")
+ except Exception as e:
+ return self.handle_error(e, "获取热榜失败")
+ else:
+ supported_types = "/".join(hot_trend_types.keys())
+ final_output = (
+ f"👉 已支持的类型有:\n\n {supported_types}\n"
+ f"\n📝 请按照以下格式发送:\n 类型+热榜 例如:微博热榜"
+ )
+ return final_output
def query_express_info(self, alapi_token, tracking_number, com="", order="asc"):
url = BASE_URL_ALAPI + "kd"
@@ -238,12 +276,28 @@ def query_express_info(self, alapi_token, tracking_number, com="", order="asc"):
except Exception as e:
return self.handle_error(e, "快递查询失败")
- def get_weather(self, alapi_token, city: str):
+ def get_weather(self, alapi_token, city_or_id: str):
url = BASE_URL_ALAPI + 'tianqi'
- params = {
- 'city': city,
- 'token': f'{alapi_token}' # 请将你的token填在这里
- }
+ # 判断使用id还是city请求api
+ if city_or_id.isnumeric(): # 判断是否为纯数字,也即是否为 city_id
+ params = {
+ 'city_id': city_or_id,
+ 'token': f'{alapi_token}'
+ }
+ else:
+ city_info = self.check_multiple_city_ids(city_or_id)
+ if city_info:
+ data = city_info['data']
+ formatted_city_info = "\n".join(
+ [f"{idx + 1}) {entry['province']}--{entry['leader']}, ID: {entry['city_id']}"
+ for idx, entry in enumerate(data)]
+ )
+ return f"查询 <{city_or_id}> 具有多条数据:\n{formatted_city_info}\n请使用id查询,发送“id天气”"
+
+ params = {
+ 'city': city_or_id,
+ 'token': f'{alapi_token}'
+ }
try:
weather_data = self.make_request(url, "GET", params=params)
if isinstance(weather_data, dict) and weather_data.get('code') == 200:
@@ -330,7 +384,6 @@ def create_reply(self, reply_type, content):
reply.content = content
return reply
-
def handle_error(self, error, message):
logger.error(f"{message},错误信息:{error}")
return message
@@ -341,6 +394,25 @@ def is_valid_url(self, url):
return all([result.scheme, result.netloc])
except ValueError:
return False
+
+ def load_city_conditions(self):
+ if self.condition_2_and_3_cities is None:
+ try:
+ json_file_path = os.path.join(os.path.dirname(__file__), 'duplicate-citys.json')
+ with open(json_file_path, 'r', encoding='utf-8') as f:
+ self.condition_2_and_3_cities = json.load(f)
+ except Exception as e:
+ return self.handle_error(e, "加载condition_2_and_3_cities.json失败")
+
+
+ def check_multiple_city_ids(self, city):
+ self.load_city_conditions()
+ city_info = self.condition_2_and_3_cities.get(city, None)
+ if city_info:
+ return city_info
+ return None
+
+
ZODIAC_MAPPING = {
'白羊座': 'aries',
'金牛座': 'taurus',
@@ -355,3 +427,16 @@ def is_valid_url(self, url):
'水瓶座': 'aquarius',
'双鱼座': 'pisces'
}
+
+hot_trend_types = {
+ "微博": "wbHot",
+ "虎扑": "huPu",
+ "知乎": "zhihuHot",
+ "哔哩哔哩": "bili",
+ "36氪": "36Ke",
+ "抖音": "douyinHot",
+ "少数派": "ssPai",
+ "IT最新": "itNews",
+ "IT科技": "itInfo"
+
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index c560994..9baca8e 100644
--- a/README.md
+++ b/README.md
@@ -18,9 +18,8 @@
复制插件目录的`config.json.template`文件并重命名为`config.json`,在`alapi_token`字段填入申请的token,token申请点击这里[alapi](https://admin.alapi.cn/account/center)
### 使用
-* 对话框发送“早报”、“摸鱼”、"微博热搜"、”任意星座名称”可以直接返回对应的内容!
+* 对话框发送“早报”、“摸鱼”、"微博热搜(已更新为"微博热榜)"、”任意星座名称”可以直接返回对应的内容!
-
@@ -34,13 +33,16 @@
* 快递查询格式:快递+快递编号。如:快递YT2505082504474,如下图!
-
-
+
* 天气查询格式:城市+天气。如:成都天气。(支持3400+城市天气,输入不正确或者查询失败返回北京天气)
-
+
+
+* 热榜查询。支持:<微博/虎扑/知乎/哔哩哔哩/36氪/抖音/少数派/IT最新/IT科技>
+
+
diff --git a/duplicate-citys.json b/duplicate-citys.json
new file mode 100644
index 0000000..66c19a1
--- /dev/null
+++ b/duplicate-citys.json
@@ -0,0 +1,1192 @@
+{
+ "朝阳": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "北京",
+ "leader": "北京",
+ "city_id": "101010300"
+ },
+ {
+ "province": "吉林",
+ "leader": "长春",
+ "city_id": "101060110"
+ },
+ {
+ "province": "辽宁",
+ "leader": "朝阳",
+ "city_id": "101071201"
+ }
+ ]
+ },
+ "通州": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "北京",
+ "leader": "北京",
+ "city_id": "101010600"
+ },
+ {
+ "province": "江苏",
+ "leader": "南通",
+ "city_id": "101190509"
+ }
+ ]
+ },
+ "宝山": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "上海",
+ "leader": "上海",
+ "city_id": "101020300"
+ },
+ {
+ "province": "黑龙江",
+ "leader": "双鸭山",
+ "city_id": "101051309"
+ }
+ ]
+ },
+ "长宁": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "上海",
+ "leader": "长宁",
+ "city_id": "101021300"
+ },
+ {
+ "province": "四川",
+ "leader": "宜宾",
+ "city_id": "101271106"
+ }
+ ]
+ },
+ "普陀": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "上海",
+ "leader": "普陀",
+ "city_id": "101021500"
+ },
+ {
+ "province": "浙江",
+ "leader": "舟山",
+ "city_id": "101211105"
+ }
+ ]
+ },
+ "和平": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "天津",
+ "leader": "和平",
+ "city_id": "101030800"
+ },
+ {
+ "province": "辽宁",
+ "leader": "沈阳",
+ "city_id": "101070107"
+ },
+ {
+ "province": "广东",
+ "leader": "河源",
+ "city_id": "101281204"
+ }
+ ]
+ },
+ "河东": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "天津",
+ "leader": "河东",
+ "city_id": "101031200"
+ },
+ {
+ "province": "山东",
+ "leader": "临沂",
+ "city_id": "101120913"
+ }
+ ]
+ },
+ "江北": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "重庆",
+ "leader": "江北",
+ "city_id": "101043700"
+ },
+ {
+ "province": "浙江",
+ "leader": "宁波",
+ "city_id": "101210409"
+ }
+ ]
+ },
+ "甘南": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "黑龙江",
+ "leader": "齐齐哈尔",
+ "city_id": "101050204"
+ },
+ {
+ "province": "甘肃",
+ "leader": "甘南",
+ "city_id": "101161209"
+ }
+ ]
+ },
+ "东安": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "黑龙江",
+ "leader": "牡丹江",
+ "city_id": "101050308"
+ },
+ {
+ "province": "湖南",
+ "leader": "永州",
+ "city_id": "101251403"
+ }
+ ]
+ },
+ "西安": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "黑龙江",
+ "leader": "牡丹江",
+ "city_id": "101050311"
+ },
+ {
+ "province": "吉林",
+ "leader": "辽源",
+ "city_id": "101060705"
+ },
+ {
+ "province": "陕西",
+ "leader": "西安",
+ "city_id": "101110101"
+ }
+ ]
+ },
+ "向阳": {
+ "condition": 3,
+ "data": [
+ {
+ "province": "黑龙江",
+ "leader": "佳木斯",
+ "city_id": "101050408"
+ },
+ {
+ "province": "黑龙江",
+ "leader": "鹤岗",
+ "city_id": "101051204"
+ }
+ ]
+ },
+ "郊区": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "黑龙江",
+ "leader": "佳木斯",
+ "city_id": "101050411"
+ },
+ {
+ "province": "山西",
+ "leader": "阳泉",
+ "city_id": "101100305"
+ },
+ {
+ "province": "山西",
+ "leader": "长治",
+ "city_id": "101100512"
+ },
+ {
+ "province": "安徽",
+ "leader": "铜陵",
+ "city_id": "101221304"
+ }
+ ]
+ },
+ "西林": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "黑龙江",
+ "leader": "伊春",
+ "city_id": "101050808"
+ },
+ {
+ "province": "广西",
+ "leader": "百色",
+ "city_id": "101301009"
+ }
+ ]
+ },
+ "大同": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "黑龙江",
+ "leader": "大庆",
+ "city_id": "101050910"
+ },
+ {
+ "province": "山西",
+ "leader": "大同",
+ "city_id": "101100201"
+ }
+ ]
+ },
+ "新兴": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "黑龙江",
+ "leader": "七台河",
+ "city_id": "101051001"
+ },
+ {
+ "province": "广东",
+ "leader": "云浮",
+ "city_id": "101281403"
+ }
+ ]
+ },
+ "梨树": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "黑龙江",
+ "leader": "鸡西",
+ "city_id": "101051108"
+ },
+ {
+ "province": "吉林",
+ "leader": "四平",
+ "city_id": "101060403"
+ }
+ ]
+ },
+ "南山": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "黑龙江",
+ "leader": "鹤岗",
+ "city_id": "101051206"
+ },
+ {
+ "province": "广东",
+ "leader": "深圳",
+ "city_id": "101280604"
+ }
+ ]
+ },
+ "兴安": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "黑龙江",
+ "leader": "鹤岗",
+ "city_id": "101051207"
+ },
+ {
+ "province": "广西",
+ "leader": "桂林",
+ "city_id": "101300506"
+ }
+ ]
+ },
+ "东山": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "黑龙江",
+ "leader": "鹤岗",
+ "city_id": "101051208"
+ },
+ {
+ "province": "福建",
+ "leader": "漳州",
+ "city_id": "101230608"
+ }
+ ]
+ },
+ "兴山": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "黑龙江",
+ "leader": "鹤岗",
+ "city_id": "101051209"
+ },
+ {
+ "province": "湖北",
+ "leader": "宜昌",
+ "city_id": "101200904"
+ }
+ ]
+ },
+ "宽城": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "吉林",
+ "leader": "长春",
+ "city_id": "101060109"
+ },
+ {
+ "province": "河北",
+ "leader": "承德",
+ "city_id": "101090409"
+ }
+ ]
+ },
+ "昌邑": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "吉林",
+ "leader": "吉林",
+ "city_id": "101060207"
+ },
+ {
+ "province": "山东",
+ "leader": "潍坊",
+ "city_id": "101120606"
+ }
+ ]
+ },
+ "铁西": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "吉林",
+ "leader": "四平",
+ "city_id": "101060406"
+ },
+ {
+ "province": "辽宁",
+ "leader": "沈阳",
+ "city_id": "101070111"
+ },
+ {
+ "province": "辽宁",
+ "leader": "鞍山",
+ "city_id": "101070306"
+ }
+ ]
+ },
+ "铁东": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "吉林",
+ "leader": "四平",
+ "city_id": "101060407"
+ },
+ {
+ "province": "辽宁",
+ "leader": "鞍山",
+ "city_id": "101070305"
+ }
+ ]
+ },
+ "大安": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "吉林",
+ "leader": "白城",
+ "city_id": "101060603"
+ },
+ {
+ "province": "四川",
+ "leader": "自贡",
+ "city_id": "101270306"
+ }
+ ]
+ },
+ "龙山": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "吉林",
+ "leader": "辽源",
+ "city_id": "101060704"
+ },
+ {
+ "province": "湖南",
+ "leader": "湘西",
+ "city_id": "101251507"
+ }
+ ]
+ },
+ "中山": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "辽宁",
+ "leader": "大连",
+ "city_id": "101070208"
+ },
+ {
+ "province": "广东",
+ "leader": "中山",
+ "city_id": "101281701"
+ }
+ ]
+ },
+ "海城": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "辽宁",
+ "leader": "鞍山",
+ "city_id": "101070304"
+ },
+ {
+ "province": "广西",
+ "leader": "北海",
+ "city_id": "101301304"
+ }
+ ]
+ },
+ "平山": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "辽宁",
+ "leader": "本溪",
+ "city_id": "101070503"
+ },
+ {
+ "province": "河北",
+ "leader": "石家庄",
+ "city_id": "101090111"
+ }
+ ]
+ },
+ "东港": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "辽宁",
+ "leader": "丹东",
+ "city_id": "101070604"
+ },
+ {
+ "province": "山东",
+ "leader": "日照",
+ "city_id": "101121504"
+ }
+ ]
+ },
+ "太和": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "辽宁",
+ "leader": "锦州",
+ "city_id": "101070708"
+ },
+ {
+ "province": "安徽",
+ "leader": "阜阳",
+ "city_id": "101220806"
+ }
+ ]
+ },
+ "海州": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "辽宁",
+ "leader": "阜新",
+ "city_id": "101070903"
+ },
+ {
+ "province": "江苏",
+ "leader": "连云港",
+ "city_id": "101191006"
+ }
+ ]
+ },
+ "清河": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "辽宁",
+ "leader": "铁岭",
+ "city_id": "101071107"
+ },
+ {
+ "province": "河北",
+ "leader": "邢台",
+ "city_id": "101090914"
+ },
+ {
+ "province": "江苏",
+ "leader": "淮安",
+ "city_id": "101190907"
+ }
+ ]
+ },
+ "连山": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "辽宁",
+ "leader": "葫芦岛",
+ "city_id": "101071405"
+ },
+ {
+ "province": "广东",
+ "leader": "清远",
+ "city_id": "101281304"
+ }
+ ]
+ },
+ "新城": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "内蒙古",
+ "leader": "呼和浩特",
+ "city_id": "101080108"
+ },
+ {
+ "province": "陕西",
+ "leader": "西安",
+ "city_id": "101110108"
+ }
+ ]
+ },
+ "青山": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "内蒙古",
+ "leader": "包头",
+ "city_id": "101080210"
+ },
+ {
+ "province": "湖北",
+ "leader": "武汉",
+ "city_id": "101200112"
+ }
+ ]
+ },
+ "海南": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "内蒙古",
+ "leader": "乌海",
+ "city_id": "101080303"
+ },
+ {
+ "province": "青海",
+ "leader": "海南",
+ "city_id": "101150402"
+ }
+ ]
+ },
+ "长安": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "河北",
+ "leader": "石家庄",
+ "city_id": "101090119"
+ },
+ {
+ "province": "陕西",
+ "leader": "西安",
+ "city_id": "101110102"
+ }
+ ]
+ },
+ "桥西": {
+ "condition": 3,
+ "data": [
+ {
+ "province": "河北",
+ "leader": "石家庄",
+ "city_id": "101090120"
+ },
+ {
+ "province": "河北",
+ "leader": "张家口",
+ "city_id": "101090316"
+ },
+ {
+ "province": "河北",
+ "leader": "邢台",
+ "city_id": "101090919"
+ }
+ ]
+ },
+ "新华": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "河北",
+ "leader": "石家庄",
+ "city_id": "101090121"
+ },
+ {
+ "province": "河北",
+ "leader": "沧州",
+ "city_id": "101090715"
+ },
+ {
+ "province": "河南",
+ "leader": "平顶山",
+ "city_id": "101180509"
+ }
+ ]
+ },
+ "桥东": {
+ "condition": 3,
+ "data": [
+ {
+ "province": "河北",
+ "leader": "张家口",
+ "city_id": "101090315"
+ },
+ {
+ "province": "河北",
+ "leader": "邢台",
+ "city_id": "101090903"
+ }
+ ]
+ },
+ "开平": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "河北",
+ "leader": "唐山",
+ "city_id": "101090516"
+ },
+ {
+ "province": "广东",
+ "leader": "江门",
+ "city_id": "101281103"
+ }
+ ]
+ },
+ "矿区": {
+ "condition": 3,
+ "data": [
+ {
+ "province": "山西",
+ "leader": "大同",
+ "city_id": "101100209"
+ },
+ {
+ "province": "山西",
+ "leader": "阳泉",
+ "city_id": "101100304"
+ }
+ ]
+ },
+ "山阳": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "陕西",
+ "leader": "商洛",
+ "city_id": "101110608"
+ },
+ {
+ "province": "河南",
+ "leader": "焦作",
+ "city_id": "101181111"
+ }
+ ]
+ },
+ "市中": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "山东",
+ "leader": "济南",
+ "city_id": "101120108"
+ },
+ {
+ "province": "山东",
+ "leader": "枣庄",
+ "city_id": "101121406"
+ },
+ {
+ "province": "四川",
+ "leader": "内江",
+ "city_id": "101271206"
+ },
+ {
+ "province": "四川",
+ "leader": "乐山",
+ "city_id": "101271410"
+ }
+ ]
+ },
+ "栖霞": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "山东",
+ "leader": "烟台",
+ "city_id": "101120507"
+ },
+ {
+ "province": "江苏",
+ "leader": "南京",
+ "city_id": "101190112"
+ }
+ ]
+ },
+ "河口": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "山东",
+ "leader": "东营",
+ "city_id": "101121202"
+ },
+ {
+ "province": "云南",
+ "leader": "红河",
+ "city_id": "101290313"
+ }
+ ]
+ },
+ "沙湾": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "新疆",
+ "leader": "塔城",
+ "city_id": "101131107"
+ },
+ {
+ "province": "四川",
+ "leader": "乐山",
+ "city_id": "101271411"
+ }
+ ]
+ },
+ "城关": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "西藏",
+ "leader": "拉萨",
+ "city_id": "101140109"
+ },
+ {
+ "province": "甘肃",
+ "leader": "兰州",
+ "city_id": "101160105"
+ }
+ ]
+ },
+ "大通": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "青海",
+ "leader": "西宁",
+ "city_id": "101150102"
+ },
+ {
+ "province": "安徽",
+ "leader": "淮南",
+ "city_id": "101220404"
+ }
+ ]
+ },
+ "城中": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "青海",
+ "leader": "西宁",
+ "city_id": "101150106"
+ },
+ {
+ "province": "广西",
+ "leader": "柳州",
+ "city_id": "101300303"
+ }
+ ]
+ },
+ "安宁": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "甘肃",
+ "leader": "兰州",
+ "city_id": "101160108"
+ },
+ {
+ "province": "云南",
+ "leader": "昆明",
+ "city_id": "101290112"
+ }
+ ]
+ },
+ "金川": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "甘肃",
+ "leader": "金昌",
+ "city_id": "101160603"
+ },
+ {
+ "province": "四川",
+ "leader": "阿坝",
+ "city_id": "101271907"
+ }
+ ]
+ },
+ "东乡": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "甘肃",
+ "leader": "临夏",
+ "city_id": "101161106"
+ },
+ {
+ "province": "江西",
+ "leader": "抚州",
+ "city_id": "101240411"
+ }
+ ]
+ },
+ "襄城": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "河南",
+ "leader": "许昌",
+ "city_id": "101180403"
+ },
+ {
+ "province": "湖北",
+ "leader": "襄阳",
+ "city_id": "101200209"
+ }
+ ]
+ },
+ "鼓楼": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "河南",
+ "leader": "开封",
+ "city_id": "101180808"
+ },
+ {
+ "province": "江苏",
+ "leader": "南京",
+ "city_id": "101190111"
+ },
+ {
+ "province": "江苏",
+ "leader": "徐州",
+ "city_id": "101190808"
+ },
+ {
+ "province": "福建",
+ "leader": "福州",
+ "city_id": "101230106"
+ }
+ ]
+ },
+ "鹤山": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "河南",
+ "leader": "鹤壁",
+ "city_id": "101181204"
+ },
+ {
+ "province": "广东",
+ "leader": "江门",
+ "city_id": "101281108"
+ }
+ ]
+ },
+ "云龙": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "江苏",
+ "leader": "徐州",
+ "city_id": "101190809"
+ },
+ {
+ "province": "云南",
+ "leader": "大理",
+ "city_id": "101290202"
+ }
+ ]
+ },
+ "华容": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "湖北",
+ "leader": "鄂州",
+ "city_id": "101200303"
+ },
+ {
+ "province": "湖南",
+ "leader": "岳阳",
+ "city_id": "101251002"
+ }
+ ]
+ },
+ "西湖": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "浙江",
+ "leader": "杭州",
+ "city_id": "101210113"
+ },
+ {
+ "province": "江西",
+ "leader": "南昌",
+ "city_id": "101240107"
+ }
+ ]
+ },
+ "象山": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "浙江",
+ "leader": "宁波",
+ "city_id": "101210406"
+ },
+ {
+ "province": "广西",
+ "leader": "桂林",
+ "city_id": "101300516"
+ }
+ ]
+ },
+ "台江": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "福建",
+ "leader": "福州",
+ "city_id": "101230109"
+ },
+ {
+ "province": "贵州",
+ "leader": "黔东南",
+ "city_id": "101260510"
+ }
+ ]
+ },
+ "永定": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "福建",
+ "leader": "龙岩",
+ "city_id": "101230706"
+ },
+ {
+ "province": "湖南",
+ "leader": "张家界",
+ "city_id": "101251105"
+ }
+ ]
+ },
+ "昌江": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "江西",
+ "leader": "景德镇",
+ "city_id": "101240804"
+ },
+ {
+ "province": "海南",
+ "leader": "昌江",
+ "city_id": "101310206"
+ }
+ ]
+ },
+ "资阳": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "湖南",
+ "leader": "益阳",
+ "city_id": "101250706"
+ },
+ {
+ "province": "四川",
+ "leader": "资阳",
+ "city_id": "101271301"
+ }
+ ]
+ },
+ "白云": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "贵州",
+ "leader": "贵阳",
+ "city_id": "101260102"
+ },
+ {
+ "province": "广东",
+ "leader": "广州",
+ "city_id": "101280110"
+ }
+ ]
+ },
+ "钟山": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "贵州",
+ "leader": "六盘水",
+ "city_id": "101260805"
+ },
+ {
+ "province": "广西",
+ "leader": "贺州",
+ "city_id": "101300704"
+ }
+ ]
+ },
+ "东兴": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "四川",
+ "leader": "内江",
+ "city_id": "101271202"
+ },
+ {
+ "province": "广西",
+ "leader": "防城港",
+ "city_id": "101301403"
+ }
+ ]
+ },
+ "九龙": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "四川",
+ "leader": "甘孜",
+ "city_id": "101271805"
+ },
+ {
+ "province": "香港",
+ "leader": "香港",
+ "city_id": "101320102"
+ }
+ ]
+ },
+ "南沙": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "广东",
+ "leader": "广州",
+ "city_id": "101280112"
+ },
+ {
+ "province": "海南",
+ "leader": "三沙",
+ "city_id": "101310304"
+ }
+ ]
+ },
+ "兴宁": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "广东",
+ "leader": "梅州",
+ "city_id": "101280402"
+ },
+ {
+ "province": "广西",
+ "leader": "南宁",
+ "city_id": "101300102"
+ }
+ ]
+ },
+ "五华": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "广东",
+ "leader": "梅州",
+ "city_id": "101280408"
+ },
+ {
+ "province": "云南",
+ "leader": "昆明",
+ "city_id": "101290102"
+ }
+ ]
+ },
+ "金平": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "广东",
+ "leader": "汕头",
+ "city_id": "101280506"
+ },
+ {
+ "province": "云南",
+ "leader": "红河",
+ "city_id": "101290312"
+ }
+ ]
+ },
+ "江城": {
+ "condition": 2,
+ "data": [
+ {
+ "province": "广东",
+ "leader": "阳江",
+ "city_id": "101281805"
+ },
+ {
+ "province": "云南",
+ "leader": "普洱",
+ "city_id": "101290907"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git "a/img/\345\256\211\350\243\205.png" "b/img/\345\256\211\350\243\205.png"
index 27840fa..dcfc892 100644
Binary files "a/img/\345\256\211\350\243\205.png" and "b/img/\345\256\211\350\243\205.png" differ
diff --git "a/img/\346\221\270\351\261\274.png" "b/img/\346\221\270\351\261\274.png"
index 9ecd1c1..734410a 100644
Binary files "a/img/\346\221\270\351\261\274.png" and "b/img/\346\221\270\351\261\274.png" differ
diff --git "a/img/\346\230\237\345\272\247.png" "b/img/\346\230\237\345\272\247.png"
index 0447551..a10d8f5 100644
Binary files "a/img/\346\230\237\345\272\247.png" and "b/img/\346\230\237\345\272\247.png" differ
diff --git "a/img/\347\203\255\346\246\234.png" "b/img/\347\203\255\346\246\234.png"
new file mode 100644
index 0000000..6ec0f92
Binary files /dev/null and "b/img/\347\203\255\346\246\234.png" differ