From fe1879f574abfafeccd08cdde9a3d6f8060828f3 Mon Sep 17 00:00:00 2001 From: hibiki <775757368@qq.com> Date: Wed, 30 Jun 2021 19:50:55 +0800 Subject: [PATCH] update --- configs/config.py | 263 +- models/sigin_group_user.py | 24 +- plugins/aconfig/__init__.py | 4 +- plugins/admin_bot_manage/__init__.py | 10 +- plugins/admin_bot_manage/data_source.py | 10 +- plugins/admin_help/__init__.py | 16 +- plugins/ai/__init__.py | 8 +- plugins/ai/data_source.py | 15 +- plugins/alapi/cover.py | 6 +- plugins/alapi/util.py | 2 +- plugins/ban/__init__.py | 2 +- plugins/broadcast/__init__.py | 4 +- plugins/bt/__init__.py | 4 +- plugins/bt/data_source.py | 4 +- plugins/check/data_source.py | 4 +- plugins/coser/__init__.py | 6 +- plugins/delete_img/__init__.py | 4 +- plugins/dialogue/__init__.py | 6 +- plugins/draw_card/__init__.py | 2 +- plugins/draw_card/announcement.py | 41 +- plugins/draw_card/util.py | 2 +- plugins/epic/__init__.py | 2 +- plugins/epic/data_source.py | 6 +- plugins/fake_msg.py | 4 +- plugins/fudu.py | 6 +- plugins/genshin/almanac/__init__.py | 4 +- plugins/genshin/material_remind/__init__.py | 118 +- .../genshin/qiu_qiu_translation/__init__.py | 2 +- .../genshin/query_resource_points/__init__.py | 2 +- .../query_resource_points/query_resource.py | 2 +- plugins/group_handle/__init__.py | 2 +- plugins/group_level/__init__.py | 24 +- plugins/group_welcome_msg.py | 2 +- plugins/help/__init__.py | 4 +- plugins/help/config.py | 13 +- plugins/help/data_source.py | 16 +- plugins/hook.py | 10 +- plugins/jitang.py | 4 +- plugins/last_chat/data_source.py | 2 +- plugins/luxun/__init__.py | 8 +- plugins/member_activity_handle.py | 214 + plugins/move_img/__init__.py | 2 +- plugins/mute.py | 4 +- plugins/nickname.py | 2 +- plugins/nonebot_plugin_manager/__init__.py | 21 +- plugins/nonebot_plugin_manager/data.py | 8 +- .../nonebot_plugin_picsearcher/__init__.py | 2 +- plugins/nonebot_plugin_picsearcher/ascii2d.py | 6 +- .../nonebot_plugin_picsearcher/saucenao.py | 6 +- plugins/one_friend/__init__.py | 10 +- plugins/open_cases/__init__.py | 2 +- plugins/open_cases/open_cases_c.py | 39 +- plugins/open_cases/utils.py | 6 +- plugins/parse_bilibili_json.py | 6 +- plugins/pid_search.py | 100 + plugins/pixiv/__init__.py | 2 +- plugins/pixiv/data_source.py | 6 +- plugins/poke/__init__.py | 4 +- plugins/quotations.py | 2 +- plugins/reimu/__init__.py | 2 +- plugins/reimu/data_source.py | 4 +- plugins/remind/__init__.py | 4 +- plugins/russian/__init__.py | 13 +- plugins/russian/data_source.py | 2 +- plugins/search_anime/__init__.py | 2 +- plugins/search_anime/data_source.py | 2 +- plugins/search_buff_skin_price/__init__.py | 2 +- plugins/search_buff_skin_price/data_source.py | 4 +- plugins/send_dinggong_voice/__init__.py | 4 +- plugins/send_img/__init__.py | 115 +- plugins/send_setu/__init__.py | 3 +- plugins/send_setu/data_source.py | 11 +- plugins/shop/buy.py | 2 +- plugins/shop/gold.py | 2 +- plugins/shop/gold_redbag/__init__.py | 4 +- plugins/shop/gold_redbag/data_source.py | 6 +- plugins/shop/reset_today_gold.py | 2 +- plugins/shop/shop_handle/__init__.py | 4 +- plugins/shop/shop_handle/data_source.py | 4 +- plugins/shop/use/__init__.py | 2 +- plugins/sign_in/__init__.py | 67 +- plugins/sign_in/group_user_checkin.py | 89 +- plugins/songpicker2/music_163.py | 2 +- plugins/statistics_handle.py | 134 + plugins/super_cmd/__init__.py | 7 +- plugins/super_help/__init__.py | 13 +- plugins/test.py | 53 +- plugins/translate/__init__.py | 2 +- plugins/translate/data_source.py | 4 +- plugins/update_gocqhttp/__init__.py | 2 +- plugins/update_gocqhttp/data_source.py | 4 +- plugins/update_info.py | 2 +- plugins/update_pic.py | 8 +- plugins/update_setu/__init__.py | 2 +- plugins/update_setu/data_source.py | 6 +- plugins/upload_img/__init__.py | 4 +- plugins/weather/__init__.py | 2 +- plugins/weather/data_source.py | 2 +- plugins/what_anime/__init__.py | 4 +- plugins/what_anime/data_source.py | 4 +- plugins/white2black_img.py | 8 +- plugins/yiqing/__init__.py | 2 +- plugins/yiqing/data_source.py | 4 +- utils/browser.py | 59 + utils/data_utils.py | 24 + utils/img_utils.py | 326 + utils/init_result.py | 88 + utils/langconv.py | 274 + utils/user_agent.py | 47 + utils/utils.py | 252 + utils/zh_wiki.py | 8275 +++++++++++++++++ 111 files changed, 10620 insertions(+), 454 deletions(-) create mode 100644 plugins/member_activity_handle.py create mode 100644 plugins/pid_search.py create mode 100644 plugins/statistics_handle.py create mode 100644 utils/browser.py create mode 100644 utils/data_utils.py create mode 100644 utils/img_utils.py create mode 100644 utils/init_result.py create mode 100644 utils/langconv.py create mode 100644 utils/user_agent.py create mode 100644 utils/utils.py create mode 100644 utils/zh_wiki.py diff --git a/configs/config.py b/configs/config.py index 5258e915..4a4eddeb 100644 --- a/configs/config.py +++ b/configs/config.py @@ -12,7 +12,7 @@ USE_CONFIG_FILE = False # API KEY(必要) -LOLICON_KEY: str = "" # lolicon +LOLICON_KEY: str = "" # lolicon(不需要了,可不填) RSSHUBAPP: str = "https://rsshub.app/" # rsshub ALAPI_TOKEN: str = "" # ALAPI # 图灵 @@ -22,7 +22,7 @@ TL_KEY: List[str] = [] # 如果填写了bind就不需要再填写后面的字段了#) # 示例:"bind": "postgresql://user:password@127.0.0.1:5432/database" bind: str = '' -sql_name: str = '' +sql_name: str = 'postgresql' user: str = '' password: str = '' address: str = '' @@ -72,7 +72,7 @@ MUTE_DEFAULT_TIME: int = 7 # 刷屏检测默认规定时间 MUTE_DEFAULT_DURATION: int = 10 # 刷屏检测默禁言时长(分钟) -# 注:即在 MALICIOUS_CHECK_TIME 时间内触发相同命令 MALICIOUS_BAN_COUNT 将被ban MALICIOUS_BAN_TIME 分钟 +# 注:即在 MALICIOUS_CHECK_TIME 时间内触发相同命令 MALICIOUS_BAN_COUNT 将被 ban MALICIOUS_BAN_TIME 分钟 MALICIOUS_BAN_TIME: int = 30 # 恶意命令触发检测触发后ban的时长(分钟) MALICIOUS_BAN_COUNT: int = 8 # 恶意命令触发检测最大触发次数 MALICIOUS_CHECK_TIME: int = 5 # 恶意命令触发检测规定时间内(秒) @@ -84,6 +84,7 @@ UPLOAD_LEVEL: int = 6 # 上传图片权限 BAN_LEVEL: int = 5 # BAN权限 OC_LEVEL: int = 2 # 开关群功能权限 MUTE_LEVEL: int = 5 # 更改禁言设置权限 +MEMBER_ACTIVITY_LEVEL = 5 # 群员活跃检测设置权限 # 需要为哪些群更新最新版gocq吗?(上传最新版gocq) # 示例:[434995955, 239483248] @@ -98,94 +99,6 @@ DOWNLOAD_SETU: bool = True # 是否自动同意好友添加 AUTO_ADD_FRIEND: bool = True - -# 模块与对应命令 -# 用于生成帮助图片 和 开关功能 -plugins2name_dict = { - 'sign_in': ['签到'], - 'send_img': ['发送图片', '萝莉', '美图', '壁纸'], - 'send_setu': ['色图', '涩图', '瑟图', '查色图'], - 'white2black': ['黑白图', '黑白草图'], - 'coser': ['coser', 'cos'], - 'quotations': ['语录'], - 'jitang': ['鸡汤'], - 'send_dinggong_voice': ['骂我', '骂老子', '骂劳资'], - 'open_cases': ['开箱', '我的开箱', '群开箱统计', '我的金色'], - 'luxun': ['鲁迅说过', '鲁迅说'], - 'fake_msg': ['假消息'], - 'buy': ['购买', '购买道具'], - 'my_gold': ['我的金币'], - 'my_props': ['我的道具'], - 'shop_handle': ['商店'], - 'update_pic': ['图片', '操作图片', '修改图片'], - 'search_buff_skin_price': ['查询皮肤'], - 'weather': ['天气', '查询天气', '天气查询'], - 'yiqing': ['疫情', '疫情查询', '查询疫情'], - 'what_anime': ['识番'], - 'search_anime': ['搜番'], - 'songpicker2': ['点歌'], - 'epic': ['epic'], - 'pixiv': ['pixiv', 'p站排行', '搜图'], - 'poke': ['戳一戳', '拍一拍'], - 'draw_card': ['抽卡', '游戏抽卡', '原神抽卡', '方舟抽卡', '坎公骑冠剑抽卡', 'pcr抽卡', 'fgo抽卡', '碧蓝抽卡', '碧蓝航线抽卡', '阴阳师抽卡'], - 'ai': ['ai', 'Ai', 'AI', 'aI'], - 'one_friend': ['我有一个朋友', '我有一个朋友想问问'], - 'translate': ['翻译', '英翻', '翻英', '日翻', '翻日', '韩翻', '翻韩'], - 'nonebot_plugin_picsearcher': ['识图'], - 'almanac': ['原神黄历', '黄历'], - 'material_remind': ['今日素材', '天赋材料'], - 'qiu_qiu_translation': ['丘丘翻译', '丘丘一下', '丘丘语翻译'], - 'query_resource_points': ['原神资源查询', '原神资源列表'], - 'russian': ['俄罗斯轮盘', '俄罗斯转盘', '装弹'], - 'gold_redbag': ['塞红包', '红包', '抢红包'], - 'poetry': ['念诗', '来首诗', '念首诗'], - 'comments_163': ['到点了', '12点了', '网易云热评', '网易云评论'], - 'cover': ['b封面'], -} - -# 功能所需的群权限 -plugins2level_dict = { - 'sign_in': 5, - 'send_img': 5, - 'send_setu': 9, - 'white2black': 5, - 'coser': 9, - 'quotations': 5, - 'jitang': 5, - 'send_dinggong_voice': 5, - 'open_cases': 5, - 'luxun': 5, - 'fake_msg': 5, - 'buy': 5, - 'my_gold': 5, - 'my_props': 5, - 'shop_handle': 5, - 'update_pic': 5, - 'search_buff_skin_price': 5, - 'weather': 5, - 'yiqing': 5, - 'what_anime': 5, - 'search_anime': 5, - 'songpicker2': 5, - 'epic': 5, - 'pixiv': 9, - 'poke': 5, - 'draw_card': 5, - 'ai': 5, - 'one_friend': 5, - 'translate': 5, - 'nonebot_plugin_picsearcher': 5, - 'almanac': 5, - 'material_remind': 5, - 'qiu_qiu_translation': 5, - 'query_resource_points': 5, - 'russian': 5, - 'gold_redbag': 5, - 'poetry': 5, - 'comments_163': 5, - 'cover': 5, -} - # 群管理员功能 与 对应权限 admin_plugins_auth = { 'admin_bot_manage': OC_LEVEL, @@ -195,6 +108,173 @@ admin_plugins_auth = { 'upload_img': UPLOAD_LEVEL, 'admin_help': 1, 'mute': MUTE_LEVEL, + 'member_activity_handle': MEMBER_ACTIVITY_LEVEL +} + + +# 模块与对应命令和对应群权限 +# 用于生成帮助图片 和 开关功能 +plugins2info_dict = { + 'sign_in': { + 'level': 5, + 'cmd': ['签到'] + }, + 'send_img': { + 'level': 5, + 'cmd': ['发送图片', '发图', '萝莉', '美图', '壁纸'] + }, + 'send_setu': { + 'level': 9, + 'cmd': ['色图', '涩图', '瑟图', '查色图'] + }, + 'white2black': { + 'level': 5, + 'cmd': ['黑白图', '黑白草图'] + }, + 'coser': { + 'level': 9, + 'cmd': ['coser', 'cos'] + }, + 'quotations': { + 'level': 5, + 'cmd': ['语录'] + }, + 'jitang': { + 'level': 5, + 'cmd': ['鸡汤'] + }, + 'send_dinggong_voice': { + 'level': 5, + 'cmd': ['骂我', '骂老子', '骂劳资'] + }, + 'open_cases': { + 'level': 5, + 'cmd': ['开箱', '我的开箱', '群开箱统计', '我的金色'] + }, + 'luxun': { + 'level': 5, + 'cmd': ['鲁迅说', '鲁迅说过'] + }, + 'fake_msg': { + 'level': 5, + 'cmd': ['假消息'] + }, + 'buy': { + 'level': 5, + 'cmd': ['购买', '购买道具'] + }, + 'my_gold': { + 'level': 5, + 'cmd': ['我的金币'] + }, + 'my_props': { + 'level': 5, + 'cmd': ['我的道具'] + }, + 'shop_handle': { + 'level': 5, + 'cmd': ['商店'] + }, + 'update_pic': { + 'level': 5, + 'cmd': ['图片', '操作图片', '修改图片'] + }, + 'search_buff_skin_price': { + 'level': 5, + 'cmd': ['查询皮肤'] + }, + 'weather': { + 'level': 5, + 'cmd': ['天气', '查询天气', '天气查询'] + }, + 'yiqing': { + 'level': 5, + 'cmd': ['疫情', '疫情查询', '查询疫情'] + }, + 'what_anime': { + 'level': 5, + 'cmd': ['识番'] + }, + 'search_anime': { + 'level': 5, + 'cmd': ['搜番'] + }, + 'songpicker2': { + 'level': 5, + 'cmd': ['点歌'] + }, + 'epic': { + 'level': 5, + 'cmd': ['epic'] + }, + 'pixiv': { + 'level': 9, + 'cmd': ['pixiv', 'p站排行', '搜图'] + }, + 'poke': { + 'level': 5, + 'cmd': ['戳一戳', '拍一拍'] + }, + 'draw_card': { + 'level': 5, + 'cmd': ['抽卡', '游戏抽卡', '原神抽卡', '方舟抽卡', '坎公骑冠剑抽卡', 'pcr抽卡', 'fgo抽卡', '碧蓝抽卡', '碧蓝航线抽卡', '阴阳师抽卡'] + }, + 'ai': { + 'level': 5, + 'cmd': ['ai', 'Ai', 'AI', 'aI'] + }, + 'one_friend': { + 'level': 5, + 'cmd': ['我有一个朋友', '我有一个朋友想问问'] + }, + 'translate': { + 'level': 5, + 'cmd': ['翻译', '英翻', '翻英', '日翻', '翻日', '韩翻', '翻韩'] + }, + 'nonebot_plugin_picsearcher': { + 'level': 5, + 'cmd': ['识图'] + }, + 'almanac': { + 'level': 5, + 'cmd': ['原神黄历', '黄历'] + }, + 'material_remind': { + 'level': 5, + 'cmd': ['今日素材', '天赋材料'] + }, + 'qiu_qiu_translation': { + 'level': 5, + 'cmd': ['丘丘翻译', '丘丘一下', '丘丘语翻译'] + }, + 'query_resource_points': { + 'level': 5, + 'cmd': ['原神资源查询', '原神资源列表'] + }, + 'russian': { + 'level': 5, + 'cmd': ['俄罗斯轮盘', '俄罗斯转盘', '装弹'] + }, + 'gold_redbag': { + 'level': 5, + 'cmd': ['塞红包', '红包', '抢红包'] + }, + 'poetry': { + 'level': 5, + 'cmd': ['念诗', '来首诗', '念首诗'] + }, + 'comments_163': { + 'level': 5, + 'cmd': ['到点了', '12点了', '网易云热评', '网易云评论'] + }, + 'cover': { + 'level': 5, + 'cmd': ['b封面', 'B封面'] + }, + 'pid_search': { + 'level': 9, + 'cmd': ['p搜', 'P搜'] + } } if TL_M_KEY: @@ -204,7 +284,6 @@ if SYSTEM_PROXY: if ALAPI_M_TOKEN: ALAPI_TOKEN = ALAPI_M_TOKEN - # 配置文件应用 if USE_CONFIG_FILE: config = get_config_data() diff --git a/models/sigin_group_user.py b/models/sigin_group_user.py index 4b659182..8b1df594 100644 --- a/models/sigin_group_user.py +++ b/models/sigin_group_user.py @@ -38,22 +38,16 @@ class SignGroupUser(db.Model): async def query_impression_all(cls, belonging_group: int) -> 'list,list': impression_list = [] user_qq_list = [] - query = cls.query.where( - (cls.belonging_group == belonging_group) - ) + user_group = [] + if belonging_group: + query = cls.query.where( + (cls.belonging_group == belonging_group) + ) + else: + query = cls.query for user in await query.gino.all(): impression_list.append(user.impression) user_qq_list.append(user.user_qq) - return user_qq_list, impression_list + user_group.append(user.belonging_group) + return user_qq_list, impression_list, user_group - @classmethod - async def query_glod_all(cls, belonging_group: int) -> 'list,list': - glod_list = [] - user_qq_list = [] - query = cls.query.where( - (cls.belonging_group == belonging_group) - ) - for user in await query.gino.all(): - glod_list.append(user.glod) - user_qq_list.append(user.user_qq) - return user_qq_list, glod_list diff --git a/plugins/aconfig/__init__.py b/plugins/aconfig/__init__.py index 2c7c81fa..676be9e9 100644 --- a/plugins/aconfig/__init__.py +++ b/plugins/aconfig/__init__.py @@ -1,14 +1,14 @@ import random from nonebot import on_keyword import os -from util.init_result import image +from utils.init_result import image from configs.path_config import IMAGE_PATH from nonebot import on_command from nonebot.rule import to_me from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, MessageEvent from nonebot.adapters.cqhttp.permission import GROUP -from util.utils import FreqLimiter +from utils.utils import FreqLimiter __plugin_name__ = '基本设置 [Hidden]' diff --git a/plugins/admin_bot_manage/__init__.py b/plugins/admin_bot_manage/__init__.py index 30db6692..582aab08 100644 --- a/plugins/admin_bot_manage/__init__.py +++ b/plugins/admin_bot_manage/__init__.py @@ -1,12 +1,12 @@ from nonebot import on_command -from util.utils import get_message_text, get_message_imgs, scheduler, get_bot +from utils.utils import get_message_text, get_message_imgs, scheduler, get_bot from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from .data_source import set_group_status, custom_group_welcome, change_group_switch, \ update_member_info, group_current_status from nonebot.adapters.cqhttp.permission import GROUP from services.log import logger -from configs.config import plugins2name_dict +from configs.config import plugins2info_dict from nonebot.plugin import export __plugin_name__ = '自定义进群欢迎消息' @@ -18,8 +18,8 @@ export = export() export.update_member_info = update_member_info cmds = [] -for cmd_list in plugins2name_dict.values(): - for cmd in cmd_list: +for cmd_list in plugins2info_dict.values(): + for cmd in cmd_list['cmd']: cmds.append(f'开启{cmd}') cmds.append(f'关闭{cmd}') cmds = set(cmds) @@ -35,7 +35,7 @@ group_status = on_command('oc_reminds', aliases={'开启早晚安', '关闭早 '群通知状态'}, permission=GROUP, priority=1, block=True) switch_rule = on_command('switch_rule', aliases=cmds, permission=GROUP, priority=4, block=True) -custom_welcome = on_command('自定义进群欢迎消息', aliases={'自定义欢迎消息', '自定义群欢迎消息'}, permission=GROUP, priority=5, block=True) +custom_welcome = on_command('自定义进群欢迎消息', aliases={'自定义欢迎消息', '自定义群欢迎消息', '设置群欢迎消息'}, permission=GROUP, priority=5, block=True) refresh_member_group = on_command("更新群组成员列表", aliases={"更新群组成员信息"}, permission=GROUP, priority=5, block=True) diff --git a/plugins/admin_bot_manage/data_source.py b/plugins/admin_bot_manage/data_source.py index e91a5908..e0e5d389 100644 --- a/plugins/admin_bot_manage/data_source.py +++ b/plugins/admin_bot_manage/data_source.py @@ -4,11 +4,11 @@ from configs.path_config import DATA_PATH import os import aiofiles import aiohttp -from util.init_result import image -from util.utils import get_local_proxy, get_bot +from utils.init_result import image +from utils.utils import get_local_proxy, get_bot from pathlib import Path from nonebot import require -from configs.config import plugins2name_dict +from configs.config import plugins2info_dict from models.group_member_info import GroupInfoUser import time from datetime import datetime @@ -136,8 +136,8 @@ async def change_group_switch(cmd: str, group_id: int): pass except FileNotFoundError: pass - for plugin_cmd in plugins2name_dict.keys(): - if cmd in plugins2name_dict[plugin_cmd]: + for plugin_cmd in plugins2info_dict.keys(): + if cmd in plugins2info_dict[plugin_cmd]['cmd']: # print(plugin_list[plugin_cmd]) if status == '开启': # if group_id in plugin_list[plugin_cmd]: diff --git a/plugins/admin_help/__init__.py b/plugins/admin_help/__init__.py index 8ad6e868..5b0f73dd 100644 --- a/plugins/admin_help/__init__.py +++ b/plugins/admin_help/__init__.py @@ -2,9 +2,9 @@ from nonebot import on_command from nonebot.typing import T_State from nonebot.adapters import Bot from nonebot.adapters.cqhttp import GroupMessageEvent -from util.img_utils import CreateImg +from utils.img_utils import CreateImg from configs.path_config import IMAGE_PATH -from util.init_result import image +from utils.init_result import image __plugin_name__ = '管理帮助 [Hidden]' @@ -16,10 +16,14 @@ __plugin_usage__ = '''管理帮助(权限等级): 5.将用户拉入真寻黑名单 --> .ban/.unban(5) 6.刷屏禁言相关 --> 指令:刷屏检测设置/设置检测时间 \t\t/设置检测次数/设置禁言时长(5) - 7.上传图片(6) - 8.移动图片(7) - 9.删除图片(7) -对我说 “指令名 帮助” 获取对应详细帮助 + 7.群员活跃度相关 --> 指令:群员活跃检测设置 + 设置群员活跃检测时长(天) + 添加群员活跃检测白名单[at]... + 查看群员活跃检测白名单(5) + 8.上传图片(6) + 9.移动图片(7) + 10.删除图片(7) +对我说 “真寻帮助 指令” 获取对应详细帮助 群主与管理员默认 5 级权限 ''' diff --git a/plugins/ai/__init__.py b/plugins/ai/__init__.py index 510643f4..a957c681 100644 --- a/plugins/ai/__init__.py +++ b/plugins/ai/__init__.py @@ -3,8 +3,8 @@ from services.log import logger from nonebot import on_message from nonebot.rule import to_me from nonebot.typing import T_State -from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, PrivateMessageEvent -from util.utils import get_message_text, get_message_imgs +from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, PrivateMessageEvent, Message +from utils.utils import get_message_text, get_message_imgs from models.friend_user import FriendUser from models.group_member_info import GroupInfoUser @@ -32,7 +32,7 @@ async def _(bot: Bot, event: PrivateMessageEvent, state: T_State): result = await get_qqbot_chat_result(msg, img, event.user_id, nickname) logger.info(f"USER {event.user_id} 问题:{msg}\n回答:{result}") if result: - await ai.finish(result) + await ai.finish(Message(result)) else: await ai.finish(no_result()) @@ -55,7 +55,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): result = await get_qqbot_chat_result(msg, img, event.user_id, nickname) logger.info(f"问题:{msg}\n回答:{result}") if result: - await ai.finish(result) + await ai.finish(Message(result)) else: await ai.finish(no_result()) diff --git a/plugins/ai/data_source.py b/plugins/ai/data_source.py index 208959d3..8e6484ee 100644 --- a/plugins/ai/data_source.py +++ b/plugins/ai/data_source.py @@ -4,8 +4,9 @@ import random import os from configs.path_config import IMAGE_PATH, DATA_PATH from services.log import logger -from util.init_result import image -from util.utils import get_bot +from utils.init_result import image, face +from utils.utils import get_bot +import re try: import ujson as json @@ -100,7 +101,13 @@ async def get_qqbot_chat_result(text: str, img_url: str, user_id: int, user_name content = content.replace('{br}', '\n') if content.find('提示') != -1: content = content[:content.find('提示')] - + while True: + r = re.search('{face:(.*)}', content) + if r: + id_ = r.group(1) + content = content.replace('{' + f'face:{id_}' + '}', str(face(id_))) + else: + break return content if resp_payload['results']: for result in resp_payload['results']: @@ -111,7 +118,7 @@ async def get_qqbot_chat_result(text: str, img_url: str, user_id: int, user_name if len(user_name) < 5: if random.random() < 0.5: user_name = "~".join(user_name) + '~' - if random.random() < 0.5: + if random.random() < 0.2: if user_name.find('大人') == -1: user_name += '大~人~' text = text.replace('小主人', user_name) diff --git a/plugins/alapi/cover.py b/plugins/alapi/cover.py index da66692c..c0ee425d 100644 --- a/plugins/alapi/cover.py +++ b/plugins/alapi/cover.py @@ -2,8 +2,8 @@ from nonebot import on_command from nonebot.adapters.cqhttp import Bot, MessageEvent, Message from nonebot.typing import T_State from configs.config import ALAPI_TOKEN -from util.init_result import image -from util.utils import get_message_text +from utils.init_result import image +from utils.utils import get_message_text from .util import get_data from services.log import logger @@ -12,7 +12,7 @@ __plugin_usage__ = '用法: b封面 (链接,av,bv,cv,直播id)\n\t' \ '示例:b封面 av86863038' -cover = on_command('b封面', priority=5, block=True) +cover = on_command('b封面', aliases={'B封面'}, priority=5, block=True) cover_url = 'https://v2.alapi.cn/api/bilibili/cover' diff --git a/plugins/alapi/util.py b/plugins/alapi/util.py index 1eb4d1bb..a4ae61fb 100644 --- a/plugins/alapi/util.py +++ b/plugins/alapi/util.py @@ -1,5 +1,5 @@ import aiohttp -from util.utils import get_local_proxy +from utils.utils import get_local_proxy async def get_data(url: str, params: dict): diff --git a/plugins/ban/__init__.py b/plugins/ban/__init__.py index 982d228a..1a54ac28 100644 --- a/plugins/ban/__init__.py +++ b/plugins/ban/__init__.py @@ -5,7 +5,7 @@ from nonebot.typing import T_State from nonebot.adapters import Bot from nonebot.adapters.cqhttp import GroupMessageEvent from nonebot.adapters.cqhttp.permission import GROUP -from util.utils import get_message_at, get_message_text, is_number +from utils.utils import get_message_at, get_message_text, is_number from services.log import logger from models.group_member_info import GroupInfoUser diff --git a/plugins/broadcast/__init__.py b/plugins/broadcast/__init__.py index bf01a6c4..5f861bab 100644 --- a/plugins/broadcast/__init__.py +++ b/plugins/broadcast/__init__.py @@ -3,10 +3,10 @@ from nonebot.typing import T_State from nonebot.adapters import Bot, Event from nonebot.permission import SUPERUSER import asyncio -from util.utils import get_message_text, get_message_imgs +from utils.utils import get_message_text, get_message_imgs from services.log import logger from models.group_remind import GroupRemind -from util.init_result import image +from utils.init_result import image __plugin_name__ = "广播 [Hidden]" diff --git a/plugins/bt/__init__.py b/plugins/bt/__init__.py index 18cca9ed..df84b7a6 100644 --- a/plugins/bt/__init__.py +++ b/plugins/bt/__init__.py @@ -4,9 +4,9 @@ from services.log import logger from nonebot.typing import T_State from nonebot.adapters import Bot from nonebot.adapters.cqhttp import PrivateMessageEvent -from util.utils import get_message_text +from utils.utils import get_message_text from nonebot.adapters.cqhttp.permission import PRIVATE -from util.utils import UserExistLimiter +from utils.utils import UserExistLimiter from asyncio.exceptions import TimeoutError from aiohttp.client_exceptions import ServerDisconnectedError diff --git a/plugins/bt/data_source.py b/plugins/bt/data_source.py index 1b99c144..bab3c462 100644 --- a/plugins/bt/data_source.py +++ b/plugins/bt/data_source.py @@ -1,8 +1,8 @@ -from util.user_agent import get_user_agent +from utils.user_agent import get_user_agent import aiohttp from configs.config import MAXINFO_BT from bs4 import BeautifulSoup -from util.utils import get_local_proxy +from utils.utils import get_local_proxy import platform if platform.system() == 'Windows': import asyncio diff --git a/plugins/check/data_source.py b/plugins/check/data_source.py index 9911e300..49de9365 100644 --- a/plugins/check/data_source.py +++ b/plugins/check/data_source.py @@ -2,10 +2,10 @@ import psutil import aiohttp import time from datetime import datetime -from util.user_agent import get_user_agent +from utils.user_agent import get_user_agent from asyncio.exceptions import TimeoutError from aiohttp.client_exceptions import ClientConnectorError -from util.utils import get_local_proxy +from utils.utils import get_local_proxy import asyncio from services.log import logger diff --git a/plugins/coser/__init__.py b/plugins/coser/__init__.py index 9eeaa2c6..cd9a7ece 100644 --- a/plugins/coser/__init__.py +++ b/plugins/coser/__init__.py @@ -1,9 +1,9 @@ from nonebot import on_command -from util.utils import get_message_text +from utils.utils import get_message_text from nonebot.typing import T_State from nonebot.adapters import Bot, Event from services.log import logger -from util.init_result import image +from utils.init_result import image import requests __plugin_name__ = 'coser' @@ -11,7 +11,7 @@ __plugin_name__ = 'coser' __plugin_usage__ = '用法:发送‘coser’' -coser = on_command('cos', aliases={'coser', '括丝'}, priority=5, block=True) +coser = on_command('cos', aliases={'coser', '括丝', 'COS', 'Cos', 'cOS', 'coS'}, priority=5, block=True) url_2 = 'http://api.rosysun.cn/cos' diff --git a/plugins/delete_img/__init__.py b/plugins/delete_img/__init__.py index e3686ae2..9567edd3 100644 --- a/plugins/delete_img/__init__.py +++ b/plugins/delete_img/__init__.py @@ -1,13 +1,13 @@ from configs.path_config import IMAGE_PATH, TEMP_PATH import os -from util.init_result import image +from utils.init_result import image from services.log import logger from nonebot import on_command from nonebot.rule import to_me from nonebot.typing import T_State from nonebot.adapters import Bot, Event from configs.config import IMAGE_DIR_LIST -from util.utils import is_number, cn2py +from utils.utils import is_number, cn2py __plugin_name__ = '删除图片' __plugin_usage__ = '删除图片帮助:\n\t' \ diff --git a/plugins/dialogue/__init__.py b/plugins/dialogue/__init__.py index 5490edfc..c03d8873 100644 --- a/plugins/dialogue/__init__.py +++ b/plugins/dialogue/__init__.py @@ -2,10 +2,10 @@ from nonebot import on_command from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, MessageEvent, Message from nonebot.permission import SUPERUSER -from util.utils import get_message_text, is_number, get_message_imgs -from util.init_result import image +from utils.utils import get_message_text, is_number, get_message_imgs +from utils.init_result import image from services.log import logger -from util.init_result import at +from utils.init_result import at __plugin_name__ = '联系管理员' diff --git a/plugins/draw_card/__init__.py b/plugins/draw_card/__init__.py index b87fb502..99a450f9 100644 --- a/plugins/draw_card/__init__.py +++ b/plugins/draw_card/__init__.py @@ -17,7 +17,7 @@ from .config import PRTS_FLAG, PRETTY_FLAG, GUARDIAN_FLAG, GENSHIN_FLAG, PCR_FLA from .async_update_game_info import async_update_game import re import asyncio -from util.utils import scheduler +from utils.utils import scheduler from services.log import logger __plugin_name__ = '游戏抽卡' diff --git a/plugins/draw_card/announcement.py b/plugins/draw_card/announcement.py index dd049e86..822439d1 100644 --- a/plugins/draw_card/announcement.py +++ b/plugins/draw_card/announcement.py @@ -49,7 +49,7 @@ def check_write(data: dict, up_char_file): else: with open(up_char_file, 'r', encoding='utf8') as f: old_data = json.load(f) - if is_expired(data['char']): + if is_expired(old_data['char']): return old_data else: with open(up_char_file, 'w', encoding='utf8') as f: @@ -239,14 +239,32 @@ class PrettyAnnouncement: context = soup.find('div', {'class': 'mw-parser-output'}) data['char']['title'] = title data['card']['title'] = title - time = str(context.find_all('big')[1].text) + for big in context.find_all('big'): + r = re.search(r'\d{1,2}/\d{1,2} \d{1,2}:\d{1,2}', str(big.text)) + if r: + time = str(big.text) + break + else: + logger.error('赛马娘UP无法找到活动日期....取消更新UP池子...') + return + # raise Exception('赛马娘UP无法找到活动日期....') time = time.replace('~', '-').replace('/', '月').split(' ') time = time[0] + '日 ' + time[1] + ' - ' + time[3] + '日 ' + time[4] data['char']['time'] = time data['card']['time'] = time for p in context.find_all('p'): - if str(p).find('当期UP赛马娘') != -1: - data['char']['pool_img'] = p.find('img')['src'] + if str(p).find('当期UP赛马娘') != -1 and str(p).find('■') != -1: + if not data['char']['pool_img']: + try: + data['char']['pool_img'] = p.find('img')['src'] + except TypeError: + for center in context.find_all('center'): + try: + img = center.find('img') + if img and str(img['alt']).find('新马娘') != -1 and str(img['alt']).find('总览') == 1: + data['char']['pool_img'] = img['src'] + except (TypeError, KeyError): + pass r = re.findall(r'.*?当期UP赛马娘([\s\S]*)<奖励内容>.*?', str(p)) if r: for x in r: @@ -261,8 +279,19 @@ class PrettyAnnouncement: data['char']['up_char']['2'][char_name] = '70' elif star == 1: data['char']['up_char']['1'][char_name] = '70' - if str(p).find('(当期UP对象)') != -1 and str(p).find('赛马娘') == -1: - data['card']['pool_img'] = p.find('img')['src'] + if str(p).find('(当期UP对象)') != -1 and str(p).find('赛马娘') == -1 and str(p).find('■') != -1: + # data['card']['pool_img'] = p.find('img')['src'] + if not data['char']['pool_img']: + try: + data['char']['pool_img'] = p.find('img')['src'] + except TypeError: + for center in context.find_all('center'): + try: + img = center.find('img') + if img and str(img['alt']).find('新卡') != -1 and str(img['alt']).find('总览') == 1: + data['card']['pool_img'] = img['src'] + except (TypeError, KeyError): + pass r = re.search(r'■全?新?支援卡(当期UP对象)([\s\S]*)

', str(p)) if r: rmsg = r.group(1).strip() diff --git a/plugins/draw_card/util.py b/plugins/draw_card/util.py index 662f5e01..7156feb1 100644 --- a/plugins/draw_card/util.py +++ b/plugins/draw_card/util.py @@ -10,7 +10,7 @@ from .config import path_dict from configs.path_config import IMAGE_PATH import nonebot import pypinyin -from util.img_utils import CreateImg +from utils.img_utils import CreateImg import platform from services.log import logger import random diff --git a/plugins/epic/__init__.py b/plugins/epic/__init__.py index d99532a6..dbce0aec 100644 --- a/plugins/epic/__init__.py +++ b/plugins/epic/__init__.py @@ -2,7 +2,7 @@ from nonebot import on_command from services.log import logger from nonebot.adapters.cqhttp import Bot, MessageEvent from nonebot.typing import T_State -from util.utils import scheduler, get_bot +from utils.utils import scheduler, get_bot from .data_source import get_epic_game from models.group_remind import GroupRemind from nonebot.adapters.cqhttp.exception import ActionFailed diff --git a/plugins/epic/data_source.py b/plugins/epic/data_source.py index 1d2e1021..b9f48eeb 100644 --- a/plugins/epic/data_source.py +++ b/plugins/epic/data_source.py @@ -1,11 +1,11 @@ import aiohttp import aiofiles -from util.utils import get_local_proxy +from utils.utils import get_local_proxy import feedparser import platform -from util.init_result import image +from utils.init_result import image from configs.path_config import IMAGE_PATH -from util.user_agent import get_user_agent +from utils.user_agent import get_user_agent if platform.system() == 'Windows': import asyncio asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) diff --git a/plugins/fake_msg.py b/plugins/fake_msg.py index 4453ec2e..8f95deed 100644 --- a/plugins/fake_msg.py +++ b/plugins/fake_msg.py @@ -1,8 +1,8 @@ from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, MessageEvent from nonebot import on_command -from util.utils import get_message_imgs, get_message_text -from util.init_result import share +from utils.utils import get_message_imgs, get_message_text +from utils.init_result import share from services.log import logger diff --git a/plugins/fudu.py b/plugins/fudu.py index 6ec5f076..95f86e5a 100644 --- a/plugins/fudu.py +++ b/plugins/fudu.py @@ -1,10 +1,10 @@ from nonebot.adapters.cqhttp.permission import GROUP from configs.path_config import IMAGE_PATH -from util.img_utils import get_img_hash +from utils.img_utils import get_img_hash import random -from util.init_result import image +from utils.init_result import image from nonebot import on_message -from util.utils import get_message_text, get_message_imgs, get_local_proxy +from utils.utils import get_message_text, get_message_imgs, get_local_proxy from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, GroupMessageEvent import aiohttp diff --git a/plugins/genshin/almanac/__init__.py b/plugins/genshin/almanac/__init__.py index 8abff492..0d0cfc97 100644 --- a/plugins/genshin/almanac/__init__.py +++ b/plugins/genshin/almanac/__init__.py @@ -1,11 +1,11 @@ from .alc import get_almanac_base64_str, load_data import os -from util.utils import get_bot, scheduler +from utils.utils import get_bot, scheduler from nonebot import on_command from models.level_user import LevelUser from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, GroupMessageEvent -from util.init_result import image +from utils.init_result import image from services.log import logger from models.group_remind import GroupRemind diff --git a/plugins/genshin/material_remind/__init__.py b/plugins/genshin/material_remind/__init__.py index 0abd8bd4..f36ecc4c 100644 --- a/plugins/genshin/material_remind/__init__.py +++ b/plugins/genshin/material_remind/__init__.py @@ -1,72 +1,80 @@ -from nonebot import on_command +from nonebot import on_command, Driver from nonebot.typing import T_State -from nonebot.adapters.cqhttp import Bot, MessageEvent -from util.init_result import image +from nonebot.adapters.cqhttp import Bot, MessageEvent, Message +from utils.init_result import image +from utils.browser import get_browser +from configs.path_config import IMAGE_PATH +import nonebot +from services.log import logger +from utils.utils import scheduler +from nonebot.permission import SUPERUSER +import os import time +driver: Driver = nonebot.get_driver() + material = on_command('今日素材', aliases={'今日材料', '今天素材', '今天材料'}, priority=5, block=True) -role_material = on_command('天赋材料', priority=5, block=True) +super_cmd = on_command('更新原神今日素材', permission=SUPERUSER, priority=1, block=True) -def get_today_material(name: str): - # 返回今天的材料图片CQ码 - if name == '天赋材料': - return image('天赋材料.png', "genshin/material/") - week = time.strftime("%w") - png_name = '' - if week == "0": - return "今天是周日,所有材料副本都开放了。" - elif week in ["1", "4"]: - png_name = f"{name}_周一周四.png" - elif week in ["2", "5"]: - png_name = f"{name}_周二周五.png" - elif week in ["3", "6"]: - png_name = f"{name}_周三周六.png" - - return image(png_name, "genshin/material/") - - -# @sv.on_fullmatch('开启原神每日素材提醒') -# async def open_remind(bot , ev): -# gid = str(ev.group_id) -# if not (gid in group_list): -# group_list.append(gid) -# save_group_list() -# await bot.send(ev, "每日提醒已开启,每天8点会发送今日素材") -# -# -# @sv.on_fullmatch('关闭原神每日素材提醒') -# async def off_remind(bot , ev): -# gid = str(ev.group_id) -# if gid in group_list: -# group_list.remove(gid) -# save_group_list() -# await bot.send(ev, "每日提醒已关闭") @material.handle() async def _(bot: Bot, event: MessageEvent, state: T_State): if time.strftime("%w") == "0": await material.send("今天是周日,所有材料副本都开放了。") return - arms_material_CQ = get_today_material("武器突破材料") - roles_material_CQ = get_today_material("角色天赋材料") - await material.send(arms_material_CQ + roles_material_CQ) + await material.send(Message(image('daily_material.png', 'genshin') + '\n※ 黄历数据来源于 genshin.pub')) + logger.info( + f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})" + f" 发送查看今日素材") -@role_material.handle() +@super_cmd.handle() async def _(bot: Bot, event: MessageEvent, state: T_State): - await material.send(get_today_material("天赋材料")) + try: + await update_image() + await super_cmd.send('更新成功...') + logger.info(f'更新每日天赋素材成功...') + except Exception as e: + await super_cmd.send(f'更新出错e:{e}') + logger.error(f'更新每日天赋素材出错 e:{e}') + + +@driver.on_startup +async def update_image(): + try: + if os.path.exists(f'{IMAGE_PATH}/genshin/daily_material.png'): + os.remove(f'{IMAGE_PATH}/genshin/daily_material.png') + browser = await get_browser() + url = 'https://genshin.pub/daily' + page = await browser.new_page() + await page.goto(url, wait_until='networkidle', timeout=10000) + await page.set_viewport_size({"width": 2560, "height": 1080}) + await page.click("button") + card = await page.query_selector(".GSContainer_inner_border_box__21_vs") + card = await card.bounding_box() + await page.screenshot(path=f'{IMAGE_PATH}/genshin/daily_material.png', clip=card, timeout=100000) + await page.close() + except Exception: + logger.warning('win环境下 使用playwright失败....请替换环境至linux') + pass + + +@scheduler.scheduled_job( + 'cron', + hour=0, + minute=1, +) +async def _(): + for _ in range(5): + try: + await update_image() + logger.info(f'更新每日天赋素材成功...') + break + except Exception as e: + logger.error(f'更新每日天赋素材出错 e:{e}') + + + -# @sv.scheduled_job('cron', hour='8') -# async def material_remind(): -# # 每日提醒 -# if time.strftime("%w") == "0": -# # 如果今天是周日就不发了 -# return -# bot = get_bot() -# arms_material_CQ = get_today_material("武器突破材料") -# roles_material_CQ = get_today_material("角色天赋材料") -# for gid in group_list: -# await bot.send_group_msg(group_id=int(gid), message=arms_material_CQ) -# await bot.send_group_msg(group_id=int(gid), message=roles_material_CQ) diff --git a/plugins/genshin/qiu_qiu_translation/__init__.py b/plugins/genshin/qiu_qiu_translation/__init__.py index d3bc61d6..fd6585ad 100644 --- a/plugins/genshin/qiu_qiu_translation/__init__.py +++ b/plugins/genshin/qiu_qiu_translation/__init__.py @@ -2,7 +2,7 @@ from .qiu_translation import qiu_qiu_word_translation, qiu_qiu_phrase_translatio from nonebot.adapters.cqhttp import Bot, MessageEvent from nonebot.typing import T_State from nonebot import on_command -from util.utils import get_message_text +from utils.utils import get_message_text from services.log import logger __plugin_name__ = '丘丘语翻译' diff --git a/plugins/genshin/query_resource_points/__init__.py b/plugins/genshin/query_resource_points/__init__.py index e9893b7a..63e2be49 100644 --- a/plugins/genshin/query_resource_points/__init__.py +++ b/plugins/genshin/query_resource_points/__init__.py @@ -1,7 +1,7 @@ from nonebot import on_command, on_regex from nonebot.rule import to_me from .query_resource import get_resource_map_mes, get_resource_list_mes, up_label_and_point_list -from util.utils import get_message_text, scheduler +from utils.utils import get_message_text, scheduler from nonebot.adapters.cqhttp import Bot, MessageEvent from nonebot.typing import T_State import os diff --git a/plugins/genshin/query_resource_points/query_resource.py b/plugins/genshin/query_resource_points/query_resource.py index 2c4451ed..51df9484 100644 --- a/plugins/genshin/query_resource_points/query_resource.py +++ b/plugins/genshin/query_resource_points/query_resource.py @@ -6,7 +6,7 @@ import os import time import base64 from configs.path_config import IMAGE_PATH -from util.init_result import image +from utils.init_result import image from services.log import logger import asyncio import nonebot diff --git a/plugins/group_handle/__init__.py b/plugins/group_handle/__init__.py index 4bd25779..c17e068a 100644 --- a/plugins/group_handle/__init__.py +++ b/plugins/group_handle/__init__.py @@ -1,6 +1,6 @@ from nonebot import on_notice, on_request from configs.path_config import IMAGE_PATH, DATA_PATH -from util.init_result import image +from utils.init_result import image import os import random from models.group_member_info import GroupInfoUser diff --git a/plugins/group_level/__init__.py b/plugins/group_level/__init__.py index aead7cca..3e4a9d8a 100644 --- a/plugins/group_level/__init__.py +++ b/plugins/group_level/__init__.py @@ -1,5 +1,5 @@ from nonebot import on_command, on_regex -from util.utils import get_message_text, is_number +from utils.utils import get_message_text, is_number, FreqLimiter from nonebot.rule import to_me from services.log import logger from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, MessageEvent, GROUP @@ -7,7 +7,7 @@ from nonebot.typing import T_State from nonebot.matcher import Matcher from nonebot.permission import SUPERUSER from pathlib import Path -from configs.config import plugins2level_dict, plugins2name_dict +from configs.config import plugins2info_dict from nonebot.message import run_preprocessor, IgnoredException try: import ujson as json @@ -17,6 +17,8 @@ except ModuleNotFoundError: __plugin_name__ = '群权限' __plugin_usage__ = '区分权限功能' +flmt = FreqLimiter(60) + group_level_data = Path() / 'data'/ 'manager' / 'group_level.json' group_level_data.parent.mkdir(exist_ok=True, parents=True) group_data = {} @@ -26,15 +28,19 @@ if group_level_data.exists(): @run_preprocessor async def _(matcher: Matcher, bot: Bot, event: GroupMessageEvent, state: T_State): + if not isinstance(event, MessageEvent): + return if matcher.type == 'message' and matcher.priority not in [1, 9]: if isinstance(event, GroupMessageEvent): if not group_data.get(str(event.group_id)): group_data[str(event.group_id)] = 5 - if plugins2level_dict.get(matcher.module): - if plugins2level_dict[matcher.module] > group_data[str(event.group_id)]: + if plugins2info_dict.get(matcher.module): + if plugins2info_dict[matcher.module]['level'] > group_data[str(event.group_id)]: try: - await bot.send_group_msg(group_id=event.group_id, message='群权限不足...') - except: + if flmt.check(event.group_id): + flmt.start_cd(event.group_id) + await bot.send_group_msg(group_id=event.group_id, message='群权限不足...') + except Exception: pass raise IgnoredException('群权限不足') @@ -72,9 +78,9 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): if group_data.get(str(event.group_id)): level = group_data[str(event.group_id)] tmp = '' - for plugin in plugins2level_dict: - if plugins2level_dict[plugin] > level: - plugin_name = plugins2name_dict[plugin][0] + for plugin in plugins2info_dict: + if plugins2info_dict[plugin]['level'] > level: + plugin_name = plugins2info_dict[plugin]['cmd'][0] if plugin_name == 'pixiv': plugin_name = '搜图 p站排行' tmp += f'{plugin_name}\n' diff --git a/plugins/group_welcome_msg.py b/plugins/group_welcome_msg.py index 23f55937..984eaee7 100644 --- a/plugins/group_welcome_msg.py +++ b/plugins/group_welcome_msg.py @@ -3,7 +3,7 @@ from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.adapters.cqhttp.permission import GROUP from configs.path_config import DATA_PATH -from util.init_result import image +from utils.init_result import image import os from pathlib import Path try: diff --git a/plugins/help/__init__.py b/plugins/help/__init__.py index b5e551de..e69f4455 100644 --- a/plugins/help/__init__.py +++ b/plugins/help/__init__.py @@ -3,11 +3,11 @@ from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, PrivateMessageEvent from nonebot.typing import T_State from nonebot.rule import to_me from configs.path_config import DATA_PATH -from util.init_result import image +from utils.init_result import image import os from .data_source import create_help_img, create_group_help_img, get_plugin_help from nonebot import require -from util.utils import get_message_text +from utils.utils import get_message_text export = require("nonebot_plugin_manager") diff --git a/plugins/help/config.py b/plugins/help/config.py index 41ec4918..2c7cdcff 100644 --- a/plugins/help/config.py +++ b/plugins/help/config.py @@ -14,14 +14,15 @@ utility_help = { 'epic': 'epic速速白嫖 --> 指令:epic', 'pixiv_r': 'P站排行榜直接冲 --> 指令:p站排行(可含参数)', 'pixiv_s': 'P站的图随便搜搜 --> 指令:搜图(可含参数)', + 'pid_search': '通过PID搜索图片 --> 指令:p搜 [pid]', 'translate': '出国旅游助手(狗头) --> 指令:英翻/翻英/日翻/翻日/韩翻/翻韩', 'cover': '快捷的b站封面获取方式 --> 指令:b封面 [连接/av/bv/cv/直播id]' } # 娱乐 entertainment_help = { - 'sign_in': '签到(影响色图几率和开箱次数) --> 指令:签到/我的签到/好感度排行', - 'send_img': '发送图片 --> 指令:美图/萝莉/壁纸', - 'send_setu': '不要小看涩图啊混蛋! --> 指令:色图/n张色图/n张xx色图/查色图/...(请查看 色图 帮助)', + 'sign_in': '签到(影响色图和开箱) --> 指令:签到/我的签到/好感度排行/好感度总榜/好感度总榜[屏蔽我/显示我]', + 'send_img': '发送图片 --> 指令:美图/萝莉/壁纸/(美图/萝莉/壁纸[id])/N张图xx(N<=9)', + 'send_setu': '不要小看涩图啊混蛋! --> 指令:色图/色图[id]/n张色图/n张xx色图/查色图/...(请查看 色图 帮助)', 'white2black_img': '黑白草图 --> 指令:黑白图/黑白草图', 'coser': '三次元也不戳 --> 指令:coser', 'jitang': '不喝点什么不舒服 --> 指令:鸡汤/语录', @@ -42,7 +43,7 @@ entertainment_help = { 'one_friend': '我有一个朋友想问问... --> 指令:我有一个朋友想问问xxx(内容)', 'nickname': '区区昵称! --> 指令:以后叫我xx(昵称)/我是谁/取消昵称', 'almanac': '这是一张正经的黄历 --> 指令:原神黄历', - 'material_remind': '看看原神今天要刷什么 --> 指令:今日素材/天赋材料', + 'material_remind': '看看原神今天要刷什么 --> 指令:今日素材/今日材料/今天素材/今天材料', 'qiu_qiu_translation': '这家伙到底在说什么? --> 指令:丘丘翻译/丘丘一下/丘丘语翻译', 'query_resource_points': '地图资源速速查看 --> 指令:原神资源查询xx/原神资源列表/哪里有xx/xx在哪(xx=资源名称)', 'russian': '紧张刺激的俄罗斯轮盘 --> 指令:俄罗斯轮盘帮助', @@ -58,5 +59,7 @@ other_help = [ '有人记得你是什么时候加入我们的 --> 指令:我的信息', '让我看看更新了什么 --> 指令:更新信息', '真寻给我把话收回去! --> 指令:撤回 [id](默认0)', - '群拥有的权限 --> 指令:查看群权限 ' + '群拥有的权限 --> 指令:查看群权限', + '数据统计可视化_1 --> 指令:功能调用统计/日功能调用统计/周功能调用统计/月功能调用统计', + '数据统计可视化_2 --> 指令:周功能调用统计 [功能名称]/月功能调用统计 [功能名称]' ] diff --git a/plugins/help/data_source.py b/plugins/help/data_source.py index a3fc7997..9b14d860 100644 --- a/plugins/help/data_source.py +++ b/plugins/help/data_source.py @@ -1,18 +1,18 @@ -from util.img_utils import CreateImg +from utils.img_utils import CreateImg from configs.path_config import IMAGE_PATH, DATA_PATH import ujson as json import os from .config import * from nonebot import require from configs.config import INITIAL_OPEN_CASE_COUNT, INITIAL_SETU_PROBABILITY, ADMIN_DEFAULT_AUTH -from configs.config import plugins2name_dict +from configs.config import plugins2info_dict import nonebot export = require("nonebot_plugin_manager") width = 1500 e_height = 0 -u_height = 850 +u_height = 950 o_height = 1500 # f_height = @@ -49,7 +49,7 @@ def create_help_img(): A.paste(e, (0, 0)) A.paste(u, (0, u_height)) A.paste(o, (0, o_height)) - A.text((10, h * 0.76), '大部分交互功能可以通过输入‘取消’,‘算了’来取消当前交互\n对真寻说 “真寻帮助 指令名” 获取对应详细帮助\n' + A.text((10, h * 0.68), '大部分交互功能可以通过输入‘取消’,‘算了’来取消当前交互\n对真寻说 “真寻帮助 指令名” 获取对应详细帮助\n' '可以通过 “滴滴滴- [消息]” 联系管理员(有趣的想法尽管来吧!<还有Bug和建议>)' '\n[群管理员请看 管理员帮助(群主与管理员自带 5 级权限)]\n\n' '\t「如果真寻回复了一些不符合人设的话,那是因为每日白嫖的图灵次数已用完,使用的是备用接口【QAQ】」') @@ -99,10 +99,10 @@ def create_group_help_img(group_id: int): A.paste(u, (0, u_height)) A.paste(o, (0, o_height)) # A.text((width, 10), f'总开关【{"√" if data["总开关"] else "×"}】') - A.text((10, h * 0.76), '大部分交互功能可以通过输入‘取消’,‘算了’来取消当前交互\n对真寻说 “真寻帮助 指令名” 获取对应详细帮助\n' + A.text((10, h * 0.68), '大部分交互功能可以通过输入‘取消’,‘算了’来取消当前交互\n对真寻说 “真寻帮助 指令名” 获取对应详细帮助\n' '可以通过 “滴滴滴- [消息]” 联系管理员(有趣的想法尽管来吧!<还有Bug和建议>)' f'\n[群管理员请看 管理员帮助(群主与管理员自带 {ADMIN_DEFAULT_AUTH} 级权限)]') - A.text((10, h * 0.81), f"【注】「色图概率:好感度 + {int(INITIAL_SETU_PROBABILITY*100)}%\n" + A.text((10, h * 0.77), f"【注】「色图概率:好感度 + {int(INITIAL_SETU_PROBABILITY*100)}%\n" f"\t\t每 3 点好感度 + 1次开箱,初始 {INITIAL_OPEN_CASE_COUNT} 次\n" f"\t\t开启/关闭功能只需输入‘开启/关闭 指令名’(每个功能的第一个指令)」\n" f"\t\t示例:开启签到\n" @@ -144,8 +144,8 @@ def rcmd(dfg): def get_plugin_help(msg: str) -> str: plugin = None - for p in plugins2name_dict.keys(): - if msg in plugins2name_dict[p]: + for p in plugins2info_dict.keys(): + if msg in plugins2info_dict[p]['cmd']: plugin = nonebot.plugin.get_plugin(p) break if plugin: diff --git a/plugins/hook.py b/plugins/hook.py index f7bbc5a7..38fd58da 100644 --- a/plugins/hook.py +++ b/plugins/hook.py @@ -4,8 +4,8 @@ from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, MessageEvent, PrivateMessageEvent, GroupMessageEvent from configs.config import BAN_RESULT, admin_plugins_auth, MALICIOUS_BAN_TIME, MALICIOUS_CHECK_TIME, MALICIOUS_BAN_COUNT from models.ban_user import BanUser -from util.utils import is_number, static_flmt, BanCheckLimiter -from util.init_result import at +from utils.utils import is_number, static_flmt, BanCheckLimiter +from utils.init_result import at from services.log import logger from models.level_user import LevelUser try: @@ -17,6 +17,8 @@ except ModuleNotFoundError: # 检查是否被ban @run_preprocessor async def _(matcher: Matcher, bot: Bot, event: MessageEvent, state: T_State): + if not isinstance(event, MessageEvent): + return if matcher.type == 'message' and matcher.priority not in [1, 9]: if await BanUser.isban(event.user_id) and str(event.user_id) not in bot.config.superusers: time = await BanUser.check_ban_time(event.user_id) @@ -51,6 +53,8 @@ _blmt = BanCheckLimiter(MALICIOUS_CHECK_TIME, MALICIOUS_BAN_COUNT) # 恶意触发命令检测 @run_preprocessor async def _(matcher: Matcher, bot: Bot, event: GroupMessageEvent, state: T_State): + if not isinstance(event, MessageEvent): + return if matcher.type == 'message' and matcher.priority not in [1, 9]: if state["_prefix"]["raw_command"]: # print(state["_prefix"]["raw_command"]) @@ -77,6 +81,8 @@ async def _(matcher: Matcher, bot: Bot, event: GroupMessageEvent, state: T_State # 权限检测 @run_preprocessor async def _(matcher: Matcher, bot: Bot, event: MessageEvent, state: T_State): + if not isinstance(event, MessageEvent): + return if await BanUser.isban(event.user_id): return if matcher.module in admin_plugins_auth.keys() and matcher.priority not in [1, 9]: diff --git a/plugins/jitang.py b/plugins/jitang.py index 58fa3649..44b73146 100644 --- a/plugins/jitang.py +++ b/plugins/jitang.py @@ -1,9 +1,7 @@ from nonebot import on_command -from util.user_agent import get_user_agent +from utils.user_agent import get_user_agent from services.log import logger from nonebot.adapters.cqhttp import Bot, Event -from nonebot.matcher import Matcher -from nonebot.message import run_preprocessor, IgnoredException from nonebot.typing import T_State import aiohttp from asyncio.exceptions import TimeoutError diff --git a/plugins/last_chat/data_source.py b/plugins/last_chat/data_source.py index 87e93fbd..7f89b49f 100644 --- a/plugins/last_chat/data_source.py +++ b/plugins/last_chat/data_source.py @@ -1,5 +1,5 @@ from configs.path_config import DATA_PATH -from util.utils import get_bot +from utils.utils import get_bot from models.group_remind import GroupRemind from datetime import datetime import time diff --git a/plugins/luxun/__init__.py b/plugins/luxun/__init__.py index add6ab97..7a9dafd1 100644 --- a/plugins/luxun/__init__.py +++ b/plugins/luxun/__init__.py @@ -4,10 +4,10 @@ from configs.path_config import IMAGE_PATH, TTF_PATH from nonebot import on_command from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, MessageEvent -from util.init_result import image +from utils.init_result import image from services.log import logger -from util.utils import UserExistLimiter, get_message_text -from util.img_utils import pic2b64 +from utils.utils import UserExistLimiter, get_message_text +from utils.img_utils import pic2b64 __plugin_name__ = '鲁迅说' @@ -16,7 +16,7 @@ __plugin_usage__ = '用法:鲁迅说 [消息]' _ulmt = UserExistLimiter() -luxun = on_command("鲁迅说过", aliases={"鲁迅说"}) +luxun = on_command("鲁迅说过", aliases={"鲁迅说"}, priority=5, block=True) @luxun.handle() diff --git a/plugins/member_activity_handle.py b/plugins/member_activity_handle.py new file mode 100644 index 00000000..a61ce714 --- /dev/null +++ b/plugins/member_activity_handle.py @@ -0,0 +1,214 @@ +from nonebot import on_message, on_command +import time +from utils.utils import scheduler, get_bot, get_message_text, is_number, get_message_at +from models.group_member_info import GroupInfoUser +from services.log import logger +from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, GROUP +from nonebot.typing import T_State +from pathlib import Path +from configs.path_config import DATA_PATH +try: + import ujson as json +except ModuleNotFoundError: + import json + +__plugin_name__ = '群员发言检测 [Hidden]' + + +check_activity = on_message(priority=1, permission=GROUP, block=False) + +show_setting = on_command('群员活跃检测设置', permission=GROUP, priority=1, block=True) + +set_check_time = on_command('设置群员活跃检测时长', permission=GROUP, priority=1, block=True) + +set_white_list = on_command('添加群员活跃检测白名单', aliases={'移除群员活跃检测白名单'}, permission=GROUP, priority=1, block=True) + +show_white_list = on_command('查看群员活跃检测白名单', permission=GROUP, priority=1, block=True) + +_file = Path(f'{DATA_PATH}/member_activity_check.json') + +try: + data = json.load(open(_file, 'r', encoding='utf8')) +except (FileNotFoundError, ValueError, TypeError): + data = { + 'check_time': time.time() + } + + +@check_activity.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + group = str(event.group_id) + user_id = str(event.user_id) + now = time.time() + if not data.get(group): + await _init_group_member_info(bot, group) + data[group]['data'][user_id] = now + if now - data['check_time'] > 10 * 60: + data['check_time'] = now + with open(_file, 'w', encoding='utf8') as f: + json.dump(data, f, indent=4, ensure_ascii=False) + logger.info('群员发言时间检测存储数据成功....') + + +@set_check_time.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + msg = get_message_text(event.json()) + if not is_number(msg): + await set_check_time.finish('请检查输入是否是数字....', at_sender=True) + group = str(event.group_id) + if not data.get(group): + await _init_group_member_info(bot, group) + data[group]['check_time_day'] = int(msg) + await set_check_time.send(f'设置群员活跃检测时长成功:{msg} 天\n【设置为 0 即为关闭】') + with open(_file, 'w', encoding='utf8') as f: + json.dump(data, f, indent=4, ensure_ascii=False) + logger.info(f'USER {event.user_id} GROUP {event.group_id} 设置群员活跃检测时长:{msg}') + + +@set_white_list.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + group = str(event.group_id) + at = get_message_at(event.json()) + if not data.get(group): + await _init_group_member_info(bot, group) + if at: + rst = '' + if state["_prefix"]["raw_command"] == '添加群员活跃检测白名单': + for user in at: + try: + user_name = (await GroupInfoUser.select_member_info(int(user), event.group_id)).user_name + except AttributeError: + user_name = str(user) + if str(user) not in data[group]['white_list']: + rst += f'{user_name} ' + data[group]['white_list'].append(str(user)) + else: + await set_white_list.send(f'{user_name} 已在群员活跃检测白名单中...') + rst = f'已将\n{rst}\n等添加入群员活跃检测白名单' + else: + for user in at: + try: + user_name = (await GroupInfoUser.select_member_info(int(user), event.group_id)).user_name + except AttributeError: + user_name = str(user) + if str(user) in data[group]['white_list']: + rst += f'{user_name} ' + data[group]['white_list'].remove(str(user)) + else: + await set_white_list.send(f'{user_name} 未在群员活跃检测白名单中...') + rst = f'已将 \n{rst}\n等添移除群员活跃检测白名单' + await set_white_list.send(rst, sender=True) + logger.info(f'群员活跃检测白名单变动 USER {event.user_id}:{rst}') + with open(_file, 'w', encoding='utf8') as f: + json.dump(data, f, ensure_ascii=False, indent=4) + else: + await set_white_list.finish('添加群员活跃检测白名单时请艾特对象!', at_sender=True) + + +@show_white_list.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + group = str(event.group_id) + if not data.get(group): + await _init_group_member_info(bot, group) + if data[group]['white_list']: + user_name_list = [] + for user in data[group]['white_list']: + try: + user_name = (await GroupInfoUser.select_member_info(int(user), event.group_id)).user_name + except AttributeError: + user_name = str(user) + user_name_list.append(user_name) + rst = '' + for i in range(len(user_name_list)): + rst += f'{user_name_list[i]}({data[group]["white_list"][i]})\n' + await show_white_list.send(rst) + else: + await show_white_list.finish('群员活跃检测白名单中没有任何用户...') + + +@show_setting.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + group = str(event.group_id) + user_name_list = [] + if not data.get(group): + await _init_group_member_info(bot, group) + if data[group]['white_list']: + for user in data[group]['white_list']: + try: + user_name = (await GroupInfoUser.select_member_info(int(user), event.group_id)).user_name + except AttributeError: + user_name = str(user) + user_name_list.append(user_name) + await show_setting.send(f'群员活跃检测:\n' + f'检测天数:{data[group]["check_time_day"]}\n' + f'白名单:{user_name_list}\n' + f'【检测天数=0时为关闭】') + + +@scheduler.scheduled_job( + 'cron', + hour=7, + minute=1, +) +async def _(): + bot = get_bot() + now = time.time() + rst = '群员发言时间检测:\n' + for group in data.keys(): + if group != 'check_time': + member_list = await bot.get_group_member_list(group_id=int(group), self_id=int(bot.self_id)) + member_list = [x['user_id'] for x in member_list] + for user in member_list: + if user not in data[group]['data']: + data[group][str(user)] = now + logger.info('群员活跃检测:自动更新群员完成...') + if group != 'check_time' and data[group]['check_time_day'] > 0: + for user in list(data[group]['data'].keys()): + user = str(user) + if user not in data[group]['white_list'] and \ + now - data[group]['data'][user] > data[group]['check_time_day'] * 24 * 60 * 60: + try: + # await bot.set_group_kick(group_id=int(group), user_id=int(user)) + t = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(data[group]['data'][user])) + try: + user_name = (await GroupInfoUser.select_member_info(int(user), int(group))).user_name + except AttributeError: + user_name = user + rst += f'检测 {user_name}({user}) 上次发言时间过久:\n时间:{t}\n' + # await bot.send_group_msg(group_id=int(group), + # message=f'群员发言时间检测:检测 {user_name}({user}) 上次' + # f'发言时间过久:..\n时间:{t}..') + del data[group]['data'][user] + except Exception as e: + logger.warning(f'群员活跃检测:{user} 踢出失败,疑真寻不是管理或对方是管理或不在群内...e:{e}') + if rst: + await bot.send_group_msg(group_id=int(group), + message=rst[:-1]) + with open(_file, 'w', encoding='utf8') as f: + json.dump(data, f, ensure_ascii=False, indent=4) + + +async def _init_group_member_info(bot: Bot, group: str): + global data + now = time.time() + data[group] = {} + data[group]['data'] = {} + data[group]['white_list'] = [] + data[group]['check_time_day'] = 0 + member_list = await bot.get_group_member_list(group_id=int(group), self_id=int(bot.self_id)) + member_list = [x['user_id'] for x in member_list] + for user in member_list: + data[group]['data'][str(user)] = now + with open(_file, 'w', encoding='utf8') as f: + json.dump(data, f, ensure_ascii=False, indent=4) + + + + + + + + + + + diff --git a/plugins/move_img/__init__.py b/plugins/move_img/__init__.py index 2f3f3e79..ef2eca0c 100644 --- a/plugins/move_img/__init__.py +++ b/plugins/move_img/__init__.py @@ -5,7 +5,7 @@ from nonebot.rule import to_me from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, MessageEvent from configs.config import IMAGE_DIR_LIST -from util.utils import is_number, cn2py +from utils.utils import is_number, cn2py from configs.path_config import IMAGE_PATH diff --git a/plugins/mute.py b/plugins/mute.py index 4ed0497e..22d22852 100644 --- a/plugins/mute.py +++ b/plugins/mute.py @@ -1,12 +1,12 @@ from nonebot import on_message, on_command from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.adapters.cqhttp.permission import GROUP -from util.utils import get_message_text, is_number, get_message_imgs, get_local_proxy +from utils.utils import get_message_text, is_number, get_message_imgs, get_local_proxy from nonebot.typing import T_State import time from nonebot.adapters.cqhttp.exception import ActionFailed from configs.path_config import DATA_PATH, IMAGE_PATH -from util.img_utils import get_img_hash +from utils.img_utils import get_img_hash from services.log import logger import aiohttp import aiofiles diff --git a/plugins/nickname.py b/plugins/nickname.py index f1280a39..d41251bd 100644 --- a/plugins/nickname.py +++ b/plugins/nickname.py @@ -2,7 +2,7 @@ from nonebot import on_command from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, PrivateMessageEvent from nonebot.rule import to_me -from util.utils import get_message_text +from utils.utils import get_message_text from models.group_member_info import GroupInfoUser from models.friend_user import FriendUser import random diff --git a/plugins/nonebot_plugin_manager/__init__.py b/plugins/nonebot_plugin_manager/__init__.py index 30a2c3f5..28be6f30 100644 --- a/plugins/nonebot_plugin_manager/__init__.py +++ b/plugins/nonebot_plugin_manager/__init__.py @@ -3,8 +3,9 @@ from nonebot.matcher import Matcher from nonebot.typing import T_State from nonebot.exception import IgnoredException from nonebot.message import run_preprocessor -from nonebot.adapters.cqhttp import Event, Bot, GroupMessageEvent, PrivateMessageEvent -from configs.config import plugins2name_dict +from nonebot.adapters.cqhttp import Event, Bot, GroupMessageEvent, PrivateMessageEvent, MessageEvent +from configs.config import plugins2info_dict +from utils.utils import FreqLimiter from models.ban_user import BanUser from .data import ( block_plugin, @@ -24,17 +25,21 @@ export.get_group_plugin_list = get_group_plugin_list # 注册 shell_like 事件响应器 plugin_manager = on_shell_command("npm", parser=npm_parser, priority=1) +flmt = FreqLimiter(60) + # 在 Matcher 运行前检测其是否启用 @run_preprocessor async def _(matcher: Matcher, bot: Bot, event: Event, state: T_State): + if not isinstance(event, MessageEvent): + return plugin = matcher.module group_id = _get_group_id(event) loaded_plugin_list = _get_loaded_plugin_list() plugin_list = auto_update_plugin_list(loaded_plugin_list) # 无视本插件的 Matcher - if plugin not in plugins2name_dict or matcher.priority in [1, 9] or await BanUser.isban(event.user_id): + if plugin not in plugins2info_dict or matcher.priority in [1, 9] or await BanUser.isban(event.user_id): return try: if isinstance(event, PrivateMessageEvent) and plugin_list[plugin]["default"]: @@ -47,8 +52,12 @@ async def _(matcher: Matcher, bot: Bot, event: Event, state: T_State): # print(f'{matcher.module} -> this is hook') if not plugin_list[plugin]["default"]: if event.message_type == 'group': - await bot.send_group_msg(group_id=event.group_id, message='此功能正在维护...') + if flmt.check(event.group): + flmt.start_cd(event.group) + await bot.send_group_msg(group_id=event.group_id, message='此功能正在维护...') else: + if flmt.check(event.user_id): + flmt.start_cd(event.user_id) await bot.send_private_msg(user_id=event.user_id, message='此功能正在维护...') raise IgnoredException(f"Nonebot Plugin Manager has blocked {plugin} !") # print(plugin_list[plugin]) @@ -58,7 +67,9 @@ async def _(matcher: Matcher, bot: Bot, event: Event, state: T_State): if group_id in plugin_list[plugin]: if not plugin_list[plugin][group_id]: if plugin != 'ai' and matcher.type == 'message': - await bot.send_group_msg(group_id=event.group_id, message='该群未开启此功能..') + if flmt.check(event.group): + flmt.start_cd(event.group) + await bot.send_group_msg(group_id=event.group_id, message='该群未开启此功能..') raise IgnoredException(f"Nonebot Plugin Manager has blocked {plugin} !") diff --git a/plugins/nonebot_plugin_manager/data.py b/plugins/nonebot_plugin_manager/data.py index 56c0c486..ed5363c5 100644 --- a/plugins/nonebot_plugin_manager/data.py +++ b/plugins/nonebot_plugin_manager/data.py @@ -1,7 +1,7 @@ import json import httpx from pathlib import Path -from configs.config import plugins2name_dict +from configs.config import plugins2info_dict _DATA_PATH = Path() / "data" / "manager" / "plugin_list.json" @@ -80,9 +80,9 @@ def _update_plugin_list(group_id: str, block: bool, *plugins: str) -> str: message = "结果如下:" operate = "屏蔽" if block else "启用" for plugin in plugins: - for values in plugins2name_dict.values(): - if plugin in values: - plugin = list(plugins2name_dict.keys())[list(plugins2name_dict.values()).index(values)] + for values in plugins2info_dict.values(): + if plugin in values['cmd']: + plugin = list(plugins2info_dict.keys())[list(plugins2info_dict.values()).index(values)] # print(plugin) break message += "\n" diff --git a/plugins/nonebot_plugin_picsearcher/__init__.py b/plugins/nonebot_plugin_picsearcher/__init__.py index 9f97fd15..26d9df03 100644 --- a/plugins/nonebot_plugin_picsearcher/__init__.py +++ b/plugins/nonebot_plugin_picsearcher/__init__.py @@ -7,7 +7,7 @@ from nonebot.plugin import on_command, on_message from nonebot.adapters.cqhttp import Bot, MessageEvent, GroupMessageEvent from nonebot.typing import T_State from services.log import logger -from util.utils import get_message_text, get_message_imgs +from utils.utils import get_message_text, get_message_imgs from configs.config import MAX_FIND_IMG_COUNT from nonebot.rule import to_me diff --git a/plugins/nonebot_plugin_picsearcher/ascii2d.py b/plugins/nonebot_plugin_picsearcher/ascii2d.py index 941e9d0e..c45635f4 100644 --- a/plugins/nonebot_plugin_picsearcher/ascii2d.py +++ b/plugins/nonebot_plugin_picsearcher/ascii2d.py @@ -2,11 +2,11 @@ from typing import List, Tuple from urllib.parse import urljoin import aiofiles -from util.utils import get_local_proxy -from util.user_agent import get_user_agent +from utils.utils import get_local_proxy +from utils.user_agent import get_user_agent from configs.path_config import IMAGE_PATH from asyncio.exceptions import TimeoutError -from util.init_result import image +from utils.init_result import image from lxml.html import fromstring import aiohttp diff --git a/plugins/nonebot_plugin_picsearcher/saucenao.py b/plugins/nonebot_plugin_picsearcher/saucenao.py index 14987b83..c3533c39 100644 --- a/plugins/nonebot_plugin_picsearcher/saucenao.py +++ b/plugins/nonebot_plugin_picsearcher/saucenao.py @@ -2,11 +2,11 @@ import io from typing import List, Tuple, Union import aiofiles -from util.utils import get_local_proxy -from util.user_agent import get_user_agent +from utils.utils import get_local_proxy +from utils.user_agent import get_user_agent from configs.path_config import IMAGE_PATH from asyncio.exceptions import TimeoutError -from util.init_result import image +from utils.init_result import image import aiohttp from lxml.html import fromstring diff --git a/plugins/one_friend/__init__.py b/plugins/one_friend/__init__.py index 1d25b1ac..b30ade13 100644 --- a/plugins/one_friend/__init__.py +++ b/plugins/one_friend/__init__.py @@ -1,15 +1,15 @@ import aiohttp -from util.user_agent import get_user_agent +from utils.user_agent import get_user_agent from io import BytesIO from random import choice from nonebot import on_regex from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, GroupMessageEvent -from util.utils import get_message_text, get_local_proxy, get_message_at -from util.init_result import image +from utils.utils import get_message_text, get_local_proxy, get_message_at +from utils.init_result import image import re -from util.img_utils import CreateImg +from utils.img_utils import CreateImg __plugin_name__ = '我有一个朋友' @@ -53,3 +53,5 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): A.text((150, 85), msg, (125, 125, 125)) await one_friend.send(image(b64=A.pic2bs4())) + + diff --git a/plugins/open_cases/__init__.py b/plugins/open_cases/__init__.py index ac0fa8e8..92499c0c 100644 --- a/plugins/open_cases/__init__.py +++ b/plugins/open_cases/__init__.py @@ -1,5 +1,5 @@ from nonebot import on_command -from util.utils import FreqLimiter, scheduler, get_message_text, is_number +from utils.utils import FreqLimiter, scheduler, get_message_text, is_number from nonebot.adapters.cqhttp.permission import GROUP from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, MessageEvent diff --git a/plugins/open_cases/open_cases_c.py b/plugins/open_cases/open_cases_c.py index 068278e0..05cc5809 100644 --- a/plugins/open_cases/open_cases_c.py +++ b/plugins/open_cases/open_cases_c.py @@ -4,16 +4,16 @@ from services.log import logger from services.db_context import db from models.open_cases_user import OpenCasesUser from models.sigin_group_user import SignGroupUser -from util.init_result import image +from utils.init_result import image import pypinyin import random from .utils import get_price from models.buff_price import BuffPrice from PIL import Image -from util.img_utils import alphabg2white_PIL, CreateImg +from utils.img_utils import alphabg2white_PIL, CreateImg from configs.path_config import IMAGE_PATH import asyncio -from util.utils import cn2py +from utils.utils import cn2py from configs.config import INITIAL_OPEN_CASE_COUNT @@ -146,6 +146,11 @@ async def open_shilian_case(user_qq: int, group: int, case_name: str, num: int = if int(MAX_COUNT + int(impression) / 3) - user.today_open_total < num: return f"今天开箱次数不足{num}次噢,请单抽试试看(也许单抽运气更好?)" \ f"\n剩余开箱次数:{int(MAX_COUNT + int(impression) / 3) - user.today_open_total}" + await user.update( + total_count=user.total_count + num, + spend_money=user.spend_money + 17 * num, + today_open_total=user.today_open_total + num, + ).apply() if num < 5: h = 270 elif num % 5 == 0: @@ -158,7 +163,7 @@ async def open_shilian_case(user_qq: int, group: int, case_name: str, num: int = # lan zi fen hong jin price uplist = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0] img_list = [] - name_list = ['蓝', '蓝(暗金)', '紫', '紫(暗金)', '粉', '粉(暗金)', '红', '红(暗金)', '金', '金(暗金)'] + name_list = ['蓝', '蓝(暗金)', '紫', '紫(暗金)', '粉', '粉(暗金)', '红', '红(暗金)', '金', '金(暗金)'] async with db.transaction(): for _ in range(num): knifes_flag = False @@ -222,7 +227,7 @@ async def open_shilian_case(user_qq: int, group: int, case_name: str, num: int = wImg.text((5, 240), f'价格:{price_result}') img_list.append(wImg) logger.info(f"USER {user_qq} GROUP {group} 开启{case_name}武器箱 获得 {skin} 磨损:{mosun}, 价格:{uplist[10]}") - if await update_user_total(user, uplist, num): + if await update_user_total(user, uplist, 0): logger.info(f"USER {user_qq} GROUP {group} 开启{case_name}武器箱 {num} 次, 数据更新成功") else: logger.warning(f"USER {user_qq} GROUP {group} 开启{case_name}武器箱 {num} 次, 价格:{uplist[10]}, 数据更新失败") @@ -251,22 +256,22 @@ def _handle_is_MAX_COUNT() -> str: return f"今天已达开箱上限了喔,明天再来吧\n(提升好感度可以增加每日开箱数 #疯狂暗示)" -async def update_user_total(user: OpenCasesUser, uplist: list, num: int = 1) -> bool: +async def update_user_total(user: OpenCasesUser, up_list: list, num: int = 1) -> bool: try: await user.update( total_count=user.total_count + num, - blue_count=user.blue_count + uplist[0], - blue_st_count=user.blue_st_count + uplist[1], - purple_count=user.purple_count + uplist[2], - purple_st_count=user.purple_st_count + uplist[3], - pink_count=user.pink_count + uplist[4], - pink_st_count=user.pink_st_count + uplist[5], - red_count=user.red_count + uplist[6], - red_st_count=user.red_st_count + uplist[7], - knife_count=user.knife_count + uplist[8], - knife_st_count=user.knife_st_count + uplist[9], + blue_count=user.blue_count + up_list[0], + blue_st_count=user.blue_st_count + up_list[1], + purple_count=user.purple_count + up_list[2], + purple_st_count=user.purple_st_count + up_list[3], + pink_count=user.pink_count + up_list[4], + pink_st_count=user.pink_st_count + up_list[5], + red_count=user.red_count + up_list[6], + red_st_count=user.red_st_count + up_list[7], + knife_count=user.knife_count + up_list[8], + knife_st_count=user.knife_st_count + up_list[9], spend_money=user.spend_money + 17 * num, - make_money=user.make_money + uplist[10], + make_money=user.make_money + up_list[10], today_open_total=user.today_open_total + num, open_cases_time_last=datetime.now() ).apply() diff --git a/plugins/open_cases/utils.py b/plugins/open_cases/utils.py index e7bc6645..4e43af28 100644 --- a/plugins/open_cases/utils.py +++ b/plugins/open_cases/utils.py @@ -1,16 +1,16 @@ from models.buff_price import BuffPrice from services.db_context import db from datetime import datetime, timedelta -from util.user_agent import get_user_agent +from utils.user_agent import get_user_agent from configs.path_config import IMAGE_PATH import aiohttp import aiofiles from models.open_cases_user import OpenCasesUser import os from services.log import logger -from util.utils import get_bot +from utils.utils import get_bot from models.group_remind import GroupRemind -from util.utils import get_cookie_text +from utils.utils import get_cookie_text from asyncio.exceptions import TimeoutError import pypinyin from nonebot.adapters.cqhttp.exception import ActionFailed diff --git a/plugins/parse_bilibili_json.py b/plugins/parse_bilibili_json.py index 7538f377..75d31cca 100644 --- a/plugins/parse_bilibili_json.py +++ b/plugins/parse_bilibili_json.py @@ -2,12 +2,12 @@ from nonebot import on_message from services.log import logger from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.typing import T_State -from util.utils import get_message_json, get_local_proxy +from utils.utils import get_message_json, get_local_proxy import json -from util.user_agent import get_user_agent +from utils.user_agent import get_user_agent from nonebot.adapters.cqhttp.permission import GROUP from bilibili_api import video -from util.init_result import image +from utils.init_result import image from models.group_remind import GroupRemind from nonebot.adapters.cqhttp.exception import ActionFailed import time diff --git a/plugins/pid_search.py b/plugins/pid_search.py new file mode 100644 index 00000000..0b94602c --- /dev/null +++ b/plugins/pid_search.py @@ -0,0 +1,100 @@ +from nonebot import on_command +from nonebot.adapters.cqhttp import Bot, MessageEvent, Message, GroupMessageEvent +from nonebot.typing import T_State +from utils.utils import get_message_text, is_number +from utils.init_result import image +import aiohttp +from services.log import logger +from asyncio.exceptions import TimeoutError +import asyncio +import aiofiles +from io import BytesIO +from configs.path_config import IMAGE_PATH + +try: + import ujson as json +except ModuleNotFoundError: + import json + +__plugin_name__ = 'p搜' +__plugin_usage__ = '用法: 通过pid在Pixiv上搜索图片\n格式:p搜 [pid]\n\t示例:p搜 79520120' + +pid_search = on_command("p搜", aliases={'pixiv搜', 'P搜'}, priority=5, block=True) + +url = 'https://api.fantasyzone.cc/tu/search.php' + + +@pid_search.args_parser +async def _(bot: Bot, event: MessageEvent, state: T_State): + pid = get_message_text(event.json()) + if pid: + if pid in ['取消', '算了']: + await pid_search.finish('已取消操作...') + if not is_number(pid): + await pid_search.reject('笨蛋,重新输入数!字!', at_sender=True) + state['pid'] = pid + + +@pid_search.handle() +async def _(bot: Bot, event: MessageEvent, state: T_State): + pid = get_message_text(event.json()) + if pid: + state['pid'] = pid + + +@pid_search.got('pid', prompt='需要查询的图片PID是?') +async def _(bot: Bot, event: MessageEvent, state: T_State): + pid = state['pid'] + params = { + 'id': pid, + 'p': 1, + } + async with aiohttp.ClientSession() as session: + for _ in range(10): + try: + async with session.get(url, timeout=2, params=params) as response: + data = json.loads(await response.text()) + except TimeoutError: + pass + else: + if not data['width'] and not data['height']: + await pid_search.finish(f'没有搜索到 PID:{pid} 的图片', at_sender=True) + pid = data['id'] + title = data['title'] + author = data['userName'] + author_id = data['userId'] + img_url = data['url'] + for _ in range(5): + try: + await download_pic(img_url, event.user_id) + except TimeoutError: + pass + else: + break + else: + await pid_search.finish('图片下载失败了....', at_sender=True) + tmp = '' + if isinstance(event, GroupMessageEvent): + tmp = '\n【注】将在30后撤回......' + msg_id = await pid_search.send(Message(f'title:{title}\n' + f'pid:{pid}\n' + f'author:{author}\n' + f'author_id:{author_id}\n' + f'{image(f"pid_search_{event.user_id}.png", "temp")}' + f'{tmp}')) + logger.info( + f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})" + f" 查询图片 PID:{pid}") + if isinstance(event, GroupMessageEvent): + await asyncio.sleep(30) + await bot.delete_msg(message_id=msg_id['message_id'], self_id=int(bot.self_id)) + break + else: + await pid_search.finish('图片下载失败了....', at_sender=True) + + +async def download_pic(img_url: str, user_id: int): + async with aiohttp.ClientSession() as session: + async with session.get(img_url, timeout=2) as res: + async with aiofiles.open(f'{IMAGE_PATH}/temp/pid_search_{user_id}.png', 'wb') as f: + await f.write(await res.read()) diff --git a/plugins/pixiv/__init__.py b/plugins/pixiv/__init__.py index e6b0f513..1f928ab6 100644 --- a/plugins/pixiv/__init__.py +++ b/plugins/pixiv/__init__.py @@ -1,7 +1,7 @@ from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, MessageEvent from nonebot import on_command -from util.utils import get_message_text, UserExistLimiter, is_number +from utils.utils import get_message_text, UserExistLimiter, is_number from .data_source import get_pixiv_urls, download_pixiv_imgs, search_pixiv_urls import time from services.log import logger diff --git a/plugins/pixiv/data_source.py b/plugins/pixiv/data_source.py index 7ed8f086..3cbe9b44 100644 --- a/plugins/pixiv/data_source.py +++ b/plugins/pixiv/data_source.py @@ -1,11 +1,11 @@ import aiohttp import aiofiles from configs.path_config import IMAGE_PATH -from util.utils import get_local_proxy -from util.user_agent import get_user_agent +from utils.utils import get_local_proxy +from utils.user_agent import get_user_agent from bs4 import BeautifulSoup import feedparser -from util.init_result import image +from utils.init_result import image from asyncio.exceptions import TimeoutError from configs.config import RSSHUBAPP from aiohttp.client_exceptions import ClientConnectorError diff --git a/plugins/poke/__init__.py b/plugins/poke/__init__.py index c6a2720e..19a13b98 100644 --- a/plugins/poke/__init__.py +++ b/plugins/poke/__init__.py @@ -3,10 +3,10 @@ from nonebot.adapters.cqhttp import Bot, PokeNotifyEvent from nonebot.typing import T_State from configs.path_config import VOICE_PATH, IMAGE_PATH import os -from util.init_result import record, image, poke +from utils.init_result import record, image, poke from services.log import logger import random -from util.utils import CountLimiter +from utils.utils import CountLimiter from models.ban_user import BanUser __plugin_name__ = '戳一戳 [Hidden]' diff --git a/plugins/quotations.py b/plugins/quotations.py index 86cd3c18..d85bbec5 100644 --- a/plugins/quotations.py +++ b/plugins/quotations.py @@ -3,7 +3,7 @@ from services.log import logger from nonebot.adapters.cqhttp import Bot, MessageEvent from nonebot.typing import T_State import aiohttp -from util.utils import get_local_proxy +from utils.utils import get_local_proxy __plugin_name__ = '语录' diff --git a/plugins/reimu/__init__.py b/plugins/reimu/__init__.py index eee367d9..082059c0 100644 --- a/plugins/reimu/__init__.py +++ b/plugins/reimu/__init__.py @@ -4,7 +4,7 @@ from .data_source import from_reimu_get_info from services.log import logger from nonebot.adapters.cqhttp import Bot, Event from nonebot.typing import T_State -from util.utils import is_number, get_message_text, UserExistLimiter, scheduler +from utils.utils import is_number, get_message_text, UserExistLimiter, scheduler from models.count_user import UserCount from configs.config import COUNT_PER_DAY_REIMU diff --git a/plugins/reimu/data_source.py b/plugins/reimu/data_source.py index 98efde62..3feaecf0 100644 --- a/plugins/reimu/data_source.py +++ b/plugins/reimu/data_source.py @@ -3,8 +3,8 @@ import time import aiohttp from services.log import logger from configs.config import MAXINFO_REIMU -from util.user_agent import get_user_agent -from util.utils import get_local_proxy +from utils.user_agent import get_user_agent +from utils.utils import get_local_proxy from asyncio.exceptions import TimeoutError diff --git a/plugins/remind/__init__.py b/plugins/remind/__init__.py index a8bce100..e1af0fcb 100644 --- a/plugins/remind/__init__.py +++ b/plugins/remind/__init__.py @@ -1,5 +1,5 @@ -from util.init_result import image -from util.utils import scheduler, get_bot +from utils.init_result import image +from utils.utils import scheduler, get_bot from services.log import logger from models.group_remind import GroupRemind from models.group_info import GroupInfo diff --git a/plugins/russian/__init__.py b/plugins/russian/__init__.py index 16b34562..37b7e350 100644 --- a/plugins/russian/__init__.py +++ b/plugins/russian/__init__.py @@ -3,9 +3,9 @@ import random import asyncio from nonebot.adapters.cqhttp import GROUP, Bot, GroupMessageEvent, Message from nonebot.typing import T_State -from util.utils import get_message_text, is_number, get_message_at +from utils.utils import get_message_text, is_number, get_message_at from models.group_member_info import GroupInfoUser -from util.init_result import at +from utils.init_result import at from models.russian_user import RussianUser from models.bag_user import BagUser from services.log import logger @@ -72,7 +72,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): else: await accept.finish('你的金币不足以接受这场对决!', at_sender=True) - player2_name = (await GroupInfoUser.select_member_info(event.user_id, event.group_id)).user_name + player2_name = event.sender.card if event.sender.card else event.sender.nickname rs_player[event.group_id][2] = event.user_id rs_player[event.group_id]['player2'] = player2_name @@ -151,7 +151,6 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): time.time() - rs_player[event.group_id]['time'] > 30: await shot.send('决斗已过时,强行结算...') await end_game(bot, event) - return if not rs_player[event.group_id][2] and time.time() - rs_player[event.group_id]['time'] > 30: rs_player[event.group_id][1] = 0 rs_player[event.group_id][2] = 0 @@ -178,7 +177,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): async def _(bot: Bot, event: GroupMessageEvent, state: T_State): global rs_player bullet_num = state['bullet_num'] - at_ = state['at'] + at_ = state['at'] if state.get('at') else [] money = state['money'] if state.get('money') else 200 user_money = await BagUser.get_gold(event.user_id, event.group_id) if bullet_num < 0 or bullet_num > 6: @@ -188,11 +187,11 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): if money > user_money: await rssian.finish('你没有足够的钱支撑起这场挑战', at_sender=True) - player1_name = (await GroupInfoUser.select_member_info(event.user_id, event.group_id)).user_name + player1_name = event.sender.card if event.sender.card else event.sender.nickname if at_: at_ = at_[0] - at_player_name = (await GroupInfoUser.select_member_info(at_, event.group_id)).user_name + at_player_name = event.sender.card if event.sender.card else event.sender.nickname msg = f'{player1_name} 向 {at(at_)} 发起了决斗!请 {at_player_name} 在30秒内回复‘接受对决’ or ‘拒绝对决’,超时此次决斗作废!' else: at_ = 0 diff --git a/plugins/russian/data_source.py b/plugins/russian/data_source.py index b79a0fae..8a2abef9 100644 --- a/plugins/russian/data_source.py +++ b/plugins/russian/data_source.py @@ -1,5 +1,5 @@ from models.russian_user import RussianUser -from util.data_utils import init_rank +from utils.data_utils import init_rank async def rank(group_id: int, itype) -> str: diff --git a/plugins/search_anime/__init__.py b/plugins/search_anime/__init__.py index c383dbeb..3d92ea68 100644 --- a/plugins/search_anime/__init__.py +++ b/plugins/search_anime/__init__.py @@ -4,7 +4,7 @@ from services.log import logger from nonebot.adapters.cqhttp import Bot, Event from nonebot.typing import T_State from configs.config import MAXINFO_GROUP_ANIME, MAXINFO_PRIVATE_ANIME -from util.utils import get_message_text, get_message_type, UserExistLimiter +from utils.utils import get_message_text, get_message_type, UserExistLimiter __plugin_name__ = '搜番' diff --git a/plugins/search_anime/data_source.py b/plugins/search_anime/data_source.py index 7acb8e86..450c93e9 100644 --- a/plugins/search_anime/data_source.py +++ b/plugins/search_anime/data_source.py @@ -4,7 +4,7 @@ from urllib import parse from services.log import logger import aiohttp import time -from util.utils import get_local_proxy +from utils.utils import get_local_proxy async def from_anime_get_info(key_word: str, max: int) -> str: diff --git a/plugins/search_buff_skin_price/__init__.py b/plugins/search_buff_skin_price/__init__.py index 60c5bca7..3cd8c953 100644 --- a/plugins/search_buff_skin_price/__init__.py +++ b/plugins/search_buff_skin_price/__init__.py @@ -5,7 +5,7 @@ from nonebot.typing import T_State from nonebot.adapters import Bot, Event from nonebot.rule import to_me from nonebot.permission import SUPERUSER -from util.utils import UserExistLimiter, get_message_text +from utils.utils import UserExistLimiter, get_message_text __plugin_name__ = '查询皮肤' diff --git a/plugins/search_buff_skin_price/data_source.py b/plugins/search_buff_skin_price/data_source.py index e51793fb..8eade884 100644 --- a/plugins/search_buff_skin_price/data_source.py +++ b/plugins/search_buff_skin_price/data_source.py @@ -1,6 +1,6 @@ -from util.user_agent import get_user_agent +from utils.user_agent import get_user_agent import aiohttp -from util.utils import get_cookie_text +from utils.utils import get_cookie_text from configs.path_config import TXT_PATH from asyncio.exceptions import TimeoutError from configs.config import buff_proxy diff --git a/plugins/send_dinggong_voice/__init__.py b/plugins/send_dinggong_voice/__init__.py index 1248019f..80968385 100644 --- a/plugins/send_dinggong_voice/__init__.py +++ b/plugins/send_dinggong_voice/__init__.py @@ -1,9 +1,9 @@ from nonebot import on_keyword -from util.init_result import record +from utils.init_result import record from configs.path_config import VOICE_PATH import random from services.log import logger -from util.utils import FreqLimiter +from utils.utils import FreqLimiter from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, MessageEvent from nonebot.rule import to_me diff --git a/plugins/send_img/__init__.py b/plugins/send_img/__init__.py index 1cbd28c0..3c09f55a 100644 --- a/plugins/send_img/__init__.py +++ b/plugins/send_img/__init__.py @@ -1,19 +1,29 @@ -from nonebot import on_command, on_keyword +from nonebot import on_command, on_keyword, on_regex from configs.path_config import IMAGE_PATH -from util.init_result import image +from utils.init_result import image +from utils.utils import get_message_text, is_number import os import random -from util.utils import is_number from services.log import logger from nonebot.typing import T_State -from nonebot.adapters import Bot, Event -from util.utils import FreqLimiter, cn2py +from nonebot.adapters.cqhttp import Bot, MessageEvent, Message +from utils.utils import FreqLimiter, cn2py from models.group_remind import GroupRemind +from asyncio.exceptions import TimeoutError from configs.config import IMAGE_DIR_LIST +import aiofiles +import aiohttp +import re +try: + import ujson as json +except ModuleNotFoundError: + import json -__plugin_name__ = '壁纸/萝莉/美图' -__plugin_usage__ = '用法: 发送"壁纸/萝莉/美图", 回复图片,后添加id获得指定图片' +__plugin_name__ = '壁纸/萝莉/美图/在线搜图' +__plugin_usage__ = '用法: \n' \ + '\t1.发送"壁纸/萝莉/美图", 回复图片,后添加id获得指定图片 示例:萝莉 123\n' \ + '\t2.在线搜图 示例:1张米浴的图' _flmt = FreqLimiter(1) @@ -23,11 +33,15 @@ cmd = set(IMAGE_DIR_LIST) # print(cmd) send_img = on_command("img", aliases=cmd, priority=5, block=True) +pa = on_keyword({"爬", "爪巴"}, priority=1, block=True) +search_img = on_regex('.*[份|发|张|个|次|点]图.*?', priority=6, block=True) + +search_url = 'https://api.fantasyzone.cc/tu/search.php' @send_img.handle() -async def _(bot: Bot, event: Event, state: T_State): - img_id = str(event.get_message()) +async def _(bot: Bot, event: MessageEvent, state: T_State): + img_id = get_message_text(event.json()) path = cn2py(state["_prefix"]["raw_command"]) + '/' if path in IMAGE_DIR_LIST: if not os.path.exists(f'{IMAGE_PATH}/{path}/'): @@ -53,11 +67,8 @@ async def _(bot: Bot, event: Event, state: T_State): await send_img.finish(f"不想给你看Ov|") -pa = on_keyword({"爬", "爪巴"}, priority=1, block=True) - - @pa.handle() -async def _(bot: Bot, event: Event, state: T_State): +async def _(bot: Bot, event: MessageEvent, state: T_State): if await GroupRemind.get_status(event.group_id, 'pa'): try: if str(event.get_message()[:2]) in ['开启', '关闭']: @@ -68,3 +79,81 @@ async def _(bot: Bot, event: Event, state: T_State): return _flmt.start_cd(event.user_id) await pa.finish(image(random.choice(os.listdir(IMAGE_PATH + "pa")), 'pa')) + + +num_key = { + '一': 1, + '二': 2, + '两': 2, + '双': 2, + '三': 3, + '四': 4, + '五': 5, + '六': 6, + '七': 7, + '八': 8, + '九': 9 +} + + +@search_img.handle() +async def _(bot: Bot, event: MessageEvent, state: T_State): + msg = get_message_text(event.json()) + r = re.search('[来要]?(.*)[份发张个次点]图(.*)', msg) + num = r.group(1) + if num in num_key.keys(): + num = num_key[num] + elif is_number(num): + num = int(num) + else: + return + keyword = r.group(2) + params = { + 'search': keyword, + 'r18': 0 + } + async with aiohttp.ClientSession() as session: + exists_id = [] + for _ in range(num): + for _ in range(10): + try: + async with session.get(search_url, timeout=5, params=params) as response: + data = json.loads(await response.text()) + except TimeoutError: + pass + else: + if data['id'] == 'null': + await send_img.finish(f'没有搜索到 {keyword} 的图片...', at_sender=True) + if data['id'] in exists_id: + continue + title = data['title'] + author = data['userName'] + pid = data['id'] + img_url = data['url'] + exists_id.append(pid) + for _ in range(5): + try: + await download_pic(img_url, event.user_id, session) + except TimeoutError: + pass + else: + break + else: + await search_img.finish('图片下载失败...', at_sender=True) + await search_img.send(Message(f'title:{title}\n' + f'pid:{pid}\n' + f'author:{author}\n' + f'{image(f"send_img_{event.user_id}.png", "temp")}')) + break + else: + await search_img.send('图片下载惜败了....', at_sender=True) + logger.info( + f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})" + f" 发送搜索了 {num} 张 {keyword} 的图片") + + +async def download_pic(img_url: str, user_id: int, session): + async with session.get(img_url, timeout=2) as res: + async with aiofiles.open(f'{IMAGE_PATH}/temp/send_img_{user_id}.png', 'wb') as f: + await f.write(await res.read()) + diff --git a/plugins/send_setu/__init__.py b/plugins/send_setu/__init__.py index 4646eee4..6829c91f 100644 --- a/plugins/send_setu/__init__.py +++ b/plugins/send_setu/__init__.py @@ -3,7 +3,7 @@ from nonebot import on_command, on_regex from nonebot.permission import SUPERUSER from services.log import logger from models.sigin_group_user import SignGroupUser -from util.utils import FreqLimiter, UserExistLimiter, is_number, get_message_text, get_message_imgs +from utils.utils import FreqLimiter, UserExistLimiter, is_number, get_message_text, get_message_imgs from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, MessageEvent, GroupMessageEvent, PrivateMessageEvent from .data_source import get_setu, get_luoxiang, search_online_setu, get_setu_urls, \ @@ -154,6 +154,7 @@ async def _(bot: Bot, event: PrivateMessageEvent, state: T_State): urls, text_list, code = await get_setu_urls(keyword, num, r18=r18) except ClientConnectorError: await UserCount.add_count(event.user_id, 'setu_r18', count=-1) + _ulmt.set_False(event.user_id) await setu.finish('网络失败了..别担心!这次搜索不算数喔', at_sender=True) else: count = 0 diff --git a/plugins/send_setu/data_source.py b/plugins/send_setu/data_source.py index 8a507674..ab00f00a 100644 --- a/plugins/send_setu/data_source.py +++ b/plugins/send_setu/data_source.py @@ -1,13 +1,13 @@ from configs.path_config import IMAGE_PATH, TXT_PATH import os import random -from util.init_result import image +from utils.init_result import image from configs.config import LOLICON_KEY import aiohttp import aiofiles from services.log import logger -from util.img_utils import get_img_hash -from util.utils import get_local_proxy, is_number +from utils.img_utils import get_img_hash +from utils.utils import get_local_proxy, is_number from asyncio.exceptions import TimeoutError from models.count_user import UserCount from configs.config import DOWNLOAD_SETU @@ -54,7 +54,8 @@ async def get_setu_urls(keyword: str, num: int = 1, r18: int = 0): if response.status == 200: data = await response.json() if data['code'] == 0: - for i in range(len(data['data'])): + lens = len(data['data']) + for i in range(lens): img_url = data['data'][i]['url'] title = data['data'][i]['title'] author = data['data'][i]['author'] @@ -77,6 +78,7 @@ async def get_setu_urls(keyword: str, num: int = 1, r18: int = 0): if DOWNLOAD_SETU: with open(TXT_PATH + file_name, 'w', encoding='utf8') as f: json.dump(txt_data, f, ensure_ascii=False, indent=4) + num = lens if num > lens else num random_idx = random.sample(range(len(data['data'])), num) x_urls = [] x_text_lst = [] @@ -123,7 +125,6 @@ def get_setu(index: str, setu_data: dict, tag: str = None): index = random.randint(0, length - 1) if tag: all_tag_setu = [x for x in setu_data.keys() if tag in setu_data[x]['tags']] - print(all_tag_setu) if all_tag_setu: index = random.choice(all_tag_setu) if is_number(index): diff --git a/plugins/shop/buy.py b/plugins/shop/buy.py index 4a9b961e..fd5ef8ac 100644 --- a/plugins/shop/buy.py +++ b/plugins/shop/buy.py @@ -2,7 +2,7 @@ from nonebot import on_command from services.log import logger from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.typing import T_State -from util.utils import get_message_text, is_number +from utils.utils import get_message_text, is_number from models.bag_user import BagUser from services.db_context import db from nonebot.adapters.cqhttp.permission import GROUP diff --git a/plugins/shop/gold.py b/plugins/shop/gold.py index ece5df74..5a2ced97 100644 --- a/plugins/shop/gold.py +++ b/plugins/shop/gold.py @@ -2,7 +2,7 @@ from nonebot import on_command from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.typing import T_State from nonebot.adapters.cqhttp.permission import GROUP -from util.data_utils import init_rank +from utils.data_utils import init_rank from models.bag_user import BagUser diff --git a/plugins/shop/gold_redbag/__init__.py b/plugins/shop/gold_redbag/__init__.py index 379c1114..9d07e6e4 100644 --- a/plugins/shop/gold_redbag/__init__.py +++ b/plugins/shop/gold_redbag/__init__.py @@ -5,8 +5,8 @@ from .data_source import check_gold, generate_send_redbag_pic, open_redbag, gene from nonebot.adapters.cqhttp.permission import GROUP from nonebot.message import run_preprocessor, IgnoredException from nonebot.matcher import Matcher -from util.utils import get_message_text, is_number, scheduler -from util.init_result import image +from utils.utils import get_message_text, is_number, scheduler +from utils.init_result import image from services.log import logger from nonebot.permission import SUPERUSER from nonebot.rule import to_me diff --git a/plugins/shop/gold_redbag/data_source.py b/plugins/shop/gold_redbag/data_source.py index 6bb5105f..45d26afe 100644 --- a/plugins/shop/gold_redbag/data_source.py +++ b/plugins/shop/gold_redbag/data_source.py @@ -1,7 +1,7 @@ from models.bag_user import BagUser -from util.utils import is_number, get_local_proxy -from util.img_utils import CreateImg -from util.user_agent import get_user_agent +from utils.utils import is_number, get_local_proxy +from utils.img_utils import CreateImg +from utils.user_agent import get_user_agent from configs.path_config import IMAGE_PATH from models.redbag_user import RedbagUser import random diff --git a/plugins/shop/reset_today_gold.py b/plugins/shop/reset_today_gold.py index 487c4515..589d6672 100644 --- a/plugins/shop/reset_today_gold.py +++ b/plugins/shop/reset_today_gold.py @@ -1,4 +1,4 @@ -from util.utils import scheduler +from utils.utils import scheduler from models.bag_user import BagUser from services.log import logger diff --git a/plugins/shop/shop_handle/__init__.py b/plugins/shop/shop_handle/__init__.py index 8412a0d2..781e3722 100644 --- a/plugins/shop/shop_handle/__init__.py +++ b/plugins/shop/shop_handle/__init__.py @@ -2,10 +2,10 @@ from nonebot import on_command from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, MessageEvent from nonebot.typing import T_State from configs.path_config import IMAGE_PATH -from util.init_result import image +from utils.init_result import image from .data_source import create_shop_help, add_goods, del_goods, update_goods from nonebot.permission import SUPERUSER -from util.utils import get_message_text, is_number +from utils.utils import get_message_text, is_number from services.log import logger import os import time diff --git a/plugins/shop/shop_handle/data_source.py b/plugins/shop/shop_handle/data_source.py index 203ed4c3..2a0ff195 100644 --- a/plugins/shop/shop_handle/data_source.py +++ b/plugins/shop/shop_handle/data_source.py @@ -1,6 +1,6 @@ from models.goods_info import GoodsInfo -from util.img_utils import CreateImg -from util.utils import is_number +from utils.img_utils import CreateImg +from utils.utils import is_number from configs.path_config import IMAGE_PATH import time diff --git a/plugins/shop/use/__init__.py b/plugins/shop/use/__init__.py index 76b683db..69b08398 100644 --- a/plugins/shop/use/__init__.py +++ b/plugins/shop/use/__init__.py @@ -2,7 +2,7 @@ from nonebot import on_command from services.log import logger from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.typing import T_State -from util.utils import is_number, get_message_text +from utils.utils import is_number, get_message_text from models.bag_user import BagUser from nonebot.adapters.cqhttp.permission import GROUP from services.db_context import db diff --git a/plugins/sign_in/__init__.py b/plugins/sign_in/__init__.py index 70dcb346..07d31557 100644 --- a/plugins/sign_in/__init__.py +++ b/plugins/sign_in/__init__.py @@ -1,10 +1,16 @@ -from .group_user_checkin import group_user_check_in, group_user_check, group_impression_rank +from .group_user_checkin import group_user_check_in, group_user_check, group_impression_rank, impression_rank from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.adapters.cqhttp.permission import GROUP -from util.utils import get_message_text -from nonebot.plugin import MatcherGroup - +from utils.init_result import image +from nonebot import on_command +from utils.utils import get_message_text +from pathlib import Path +from configs.path_config import DATA_PATH +try: + import ujson as json +except ModuleNotFoundError: + import json __plugin_name__ = '签到' __plugin_usage__ = ( @@ -13,13 +19,23 @@ __plugin_usage__ = ( '“我的签到” 来获取历史签到信息\n' '“好感度排行” 来查看当前好感度前十的伙伴\n' '/ 签到时有 3% 概率 * 2 /' - ) +_file = Path(f'{DATA_PATH}/not_show_sign_rank_user.json') +try: + data = json.load(open(_file, 'r', encoding='utf8')) +except (FileNotFoundError, ValueError, TypeError): + data = { + '0': [] + } -sign_match_group = MatcherGroup(priority=5, permission=GROUP, block=True) -sign = sign_match_group.on_command("签到") +sign = on_command("签到", priority=5, permission=GROUP, block=True) +my_sign = on_command(cmd="我的签到", aliases={'好感度'}, priority=5, permission=GROUP, block=True) +sign_rank = on_command(cmd="积分排行", aliases={'好感度排行', '签到排行', '积分排行', '好感排行', + '好感度排名,签到排名,积分排名'}, + priority=5, permission=GROUP, block=True) +total_sign_rank = on_command('签到总排行', aliases={'好感度总排行', '好感度总榜', '签到总榜'}, priority=5, block=True) @sign.handle() @@ -30,9 +46,6 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): ) -my_sign = sign_match_group.on_command(cmd="我的签到", aliases={'好感度'}) - - @my_sign.handle() async def _(bot: Bot, event: GroupMessageEvent, state: T_State): await my_sign.send( @@ -40,12 +53,34 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): at_sender=True, ) -sign_ranking = sign_match_group.on_command(cmd="积分排行", aliases={'好感度排行', '签到排行', '积分排行', '好感排行', - '好感度排名,签到排名,积分排名'}) - -@sign_ranking.handle() +@sign_rank.handle() async def _(bot: Bot, event: GroupMessageEvent, state: T_State): - await sign_ranking.send( + await sign_rank.send( await group_impression_rank(event.group_id) - ) \ No newline at end of file + ) + + +@total_sign_rank.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + msg = get_message_text(event.json()) + if not msg: + await total_sign_rank.send('请稍等..正在整理数据...') + await total_sign_rank.send(image(b64=await impression_rank(0, data))) + elif msg in ['屏蔽我']: + if event.user_id in data['0']: + await total_sign_rank.finish('您已经在屏蔽名单中了,请勿重复添加!', at_sender=True) + data['0'].append(event.user_id) + await total_sign_rank.send('设置成功,您不会出现在签到总榜中!', at_sender=True) + elif msg in ['显示我']: + if event.user_id not in data['0']: + await total_sign_rank.finish('您不在屏蔽名单中!', at_sender=True) + data['0'].remove(event.user_id) + await total_sign_rank.send('设置成功,签到总榜将会显示您的头像名称以及好感度!', at_sender=True) + with open(_file, 'w', encoding='utf8') as f: + json.dump(data, f, ensure_ascii=False, indent=4) + + + + + diff --git a/plugins/sign_in/group_user_checkin.py b/plugins/sign_in/group_user_checkin.py index 4d6290f6..2ebed46f 100644 --- a/plugins/sign_in/group_user_checkin.py +++ b/plugins/sign_in/group_user_checkin.py @@ -1,12 +1,17 @@ import random from datetime import datetime, timedelta - +from io import BytesIO from services.log import logger from services.db_context import db from models.sigin_group_user import SignGroupUser from models.group_member_info import GroupInfoUser from models.bag_user import BagUser from configs.config import MAX_SIGN_GOLD +from utils.img_utils import CreateImg +import aiohttp +from asyncio.exceptions import TimeoutError +import math +import asyncio async def group_user_check_in(user_qq: int, group: int) -> str: @@ -82,7 +87,7 @@ async def group_user_check(user_qq: int, group: int) -> str: async def group_impression_rank(group: int) -> str: result = "\t好感度排行榜\t\n" - user_qq_list, impression_list = await SignGroupUser.query_impression_all(group) + user_qq_list, impression_list, _ = await SignGroupUser.query_impression_all(group) _count = 11 if user_qq_list and impression_list: for i in range(1, len(user_qq_list)): @@ -115,4 +120,84 @@ async def random_gold(user_id, group_id, impression): return 0 +async def impression_rank(group_id: int, data: dict): + user_qq_list, impression_list, group_list = await SignGroupUser.query_impression_all(group_id) + users, impressions, groups = [], [], [] + num = 0 + for i in range(105 if len(user_qq_list) > 105 else len(user_qq_list)): + impression = max(impression_list) + index = impression_list.index(impression) + user = user_qq_list[index] + group = group_list[index] + user_qq_list.pop(index) + impression_list.pop(index) + group_list.pop(index) + if user not in users and impression < 100000: + if user not in data['0']: + users.append(user) + impressions.append(impression) + groups.append(group) + else: + num += 1 + for i in range(num): + impression = max(impression_list) + index = impression_list.index(impression) + user = user_qq_list[index] + group = group_list[index] + user_qq_list.pop(index) + impression_list.pop(index) + group_list.pop(index) + if user not in users and impression < 100000: + users.append(user) + impressions.append(impression) + groups.append(group) + return (await asyncio.gather(*[_pst(users, impressions, groups)]))[0] + +async def _pst(users: list, impressions: list, groups: list): + lens = len(users) + count = math.ceil(lens / 33) + width = 10 + idx = 0 + A = CreateImg(1740, 3300, color='#FFE4C4') + async with aiohttp.ClientSession() as session: + for _ in range(count): + col_img = CreateImg(550, 3300, 550, 100, color='#FFE4C4') + for _ in range(33 if int(lens / 33) >= 1 else lens % 33 - 1): + idx += 1 + if idx > 100: + break + impression = max(impressions) + index = impressions.index(impression) + user = users[index] + group = groups[index] + impressions.pop(index) + users.pop(index) + groups.pop(index) + try: + user_name = (await GroupInfoUser.select_member_info(user, group)).user_name + except AttributeError: + user_name = f'我名字呢?' + user_name = user_name if len(user_name) < 11 else user_name[:10] + '...' + impression = str(impression)[:4] if len(str(impression)) > 4 else impression + try: + async with session.get(f'http://q1.qlogo.cn/g?b=qq&nk={user}&s=160', timeout=5) as response: + ava = CreateImg(50, 50, background=BytesIO(await response.read())) + except TimeoutError: + ava = CreateImg(50, 50, color='white') + ava.circle() + bk = CreateImg(550, 100, color='#FFE4C4', font_size=30) + font_w, font_h = bk.getsize(f'{idx}') + bk.text((5, int((100-font_h)/2)), f'{idx}.') + bk.paste(ava, (55, int((100-50)/2)), True) + bk.text((120, int((100-font_h)/2)), f'{user_name}') + bk.text((460, int((100-font_h)/2)), f'[{impression}]') + col_img.paste(bk) + A.paste(col_img, (width, 0)) + lens -= 33 + width += 580 + W = CreateImg(1740, 3700, color='#FFE4C4', font_size=130) + W.paste(A, (0, 260)) + font_w, font_h = W.getsize('真寻的好感度总榜') + W.text((int((1740-font_w)/2), int((260-font_h)/2)), '真寻的好感度总榜') + return W.pic2bs4() diff --git a/plugins/songpicker2/music_163.py b/plugins/songpicker2/music_163.py index f20cd8b9..ce904e04 100644 --- a/plugins/songpicker2/music_163.py +++ b/plugins/songpicker2/music_163.py @@ -1,6 +1,6 @@ import aiohttp import json -from util.utils import get_local_proxy +from utils.utils import get_local_proxy from configs.config import ALAPI_TOKEN from asyncio.exceptions import TimeoutError diff --git a/plugins/statistics_handle.py b/plugins/statistics_handle.py new file mode 100644 index 00000000..75859c7a --- /dev/null +++ b/plugins/statistics_handle.py @@ -0,0 +1,134 @@ +from nonebot import on_command +from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, GROUP +from models.group_info import GroupInfo +from nonebot.typing import T_State +from pathlib import Path +from configs.path_config import DATA_PATH, TTF_PATH +import matplotlib.pyplot as plt +from utils.utils import get_message_text +from utils.img_utils import fig2b64 +from utils.init_result import image +from configs.config import plugins2info_dict +from matplotlib.font_manager import FontProperties + +plt.rcParams['font.family'] = ['SimHei', 'FangSong', 'KaiTi'] +plt.rcParams['font.sans-serif'] = ['SimHei', 'FangSong', 'KaiTi'] +plt.rcParams['axes.unicode_minus'] = False + +font = FontProperties(fname=f'{TTF_PATH}/yz.ttf', size=10) + +try: + import ujson as json +except ModuleNotFoundError: + import json + +__plugin_name__ = '功能调用统计' +__plugin_usage__ = '用法: 无' + +statistics = on_command("功能调用统计", aliases={'日功能调用统计', '周功能调用统计', '月功能调用统计'}, permission=GROUP, priority=5, block=True) + +statistics_file = Path(f'{DATA_PATH}/_prefix_count.json') + + +@statistics.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + msg = get_message_text(event.json()) + plugin = '' + if not statistics_file.exists(): + await statistics.finish('统计文件不存在...', at_sender=True) + if state["_prefix"]["raw_command"][0] == '日': + arg = 'day_statistics' + elif state["_prefix"]["raw_command"][0] == '周': + arg = 'week_statistics' + elif state["_prefix"]["raw_command"][0] == '月': + arg = 'month_statistics' + else: + arg = 'total_statistics' + if msg: + for key in plugins2info_dict.keys(): + if msg in plugins2info_dict[key]['cmd']: + plugin = plugins2info_dict[key]['cmd'][0] + break + else: + if arg not in ['day_statistics', 'total_statistics']: + await statistics.finish('未找到此功能的调用...', at_sender=True) + data: dict = json.load(open(statistics_file, 'r', encoding='utf8')) + if not data[arg].get(str(event.group_id)): + await statistics.finish('该群统计数据不存在...', at_sender=True) + day_index = data['day_index'] + data = data[arg][str(event.group_id)] + group_name = await GroupInfo.get_group_info(event.group_id) + group_name = group_name.group_name if group_name else str(event.group_id) + img = generate_statistics_img(data, arg, group_name, plugin, day_index) + await statistics.send(image(b64=img)) + plt.cla() + + +def generate_statistics_img(data: dict, arg: str, group_name: str, plugin: str, day_index: int): + if arg == 'day_statistics': + init_bar_graph(data, f'{group_name} 日功能调用统计') + elif arg == 'week_statistics': + if plugin: + current_week = day_index % 7 + week_lst = [] + if current_week == 0: + week_lst = [1, 2, 3, 4, 5, 6, 7] + else: + for i in range(current_week + 1, 7): + week_lst.append(str(i)) + for i in range(current_week + 1): + week_lst.append(str(i)) + count = [] + for i in range(7): + if int(week_lst[i]) == 7: + count.append(data[str(0)][plugin]) + else: + count.append(data[str(week_lst[i])][plugin]) + week_lst = ['7' if i == '0' else i for i in week_lst] + plt.plot(week_lst, count) + plt.title(f'{group_name} 周 {plugin} 功能调用统计【为7天统计】', FontProperties=font) + else: + init_bar_graph(update_data(data), f'{group_name} 周功能调用统计【为7天统计】') + elif arg == 'month_statistics': + if plugin: + day_index = day_index % 30 + day_lst = [] + for i in range(day_index + 1, 30): + day_lst.append(i) + for i in range(day_index + 1): + day_lst.append(i) + count = [data[str(day_lst[i])][plugin] for i in range(30)] + day_lst = [str(x + 1) for x in day_lst] + plt.title(f'{group_name} 月 {plugin} 功能调用统计【为30天统计】', FontProperties=font) + plt.plot(day_lst, count) + else: + init_bar_graph(update_data(data), f'{group_name} 月功能调用统计【为30天统计】') + elif arg == 'total_statistics': + init_bar_graph(data, f'{group_name} 功能调用统计') + + return fig2b64(plt) + + +def init_bar_graph(data: dict, title: str, ha: str = 'left', va: str = 'center'): + plt.tick_params(axis='y', labelsize=7) + tmp_x = list(data.keys()) + tmp_y = list(data.values()) + x = [tmp_x[i] for i in range(len(tmp_y)) if tmp_y[i]] + y = [tmp_y[i] for i in range(len(tmp_y)) if tmp_y[i]] + plt.barh(x, y) + plt.title(f'{title}', FontProperties=font) + for y, x in zip(y, x): + plt.text(y, x, s=str(y), ha=ha, va=va, fontsize=8) + + +def update_data(data: dict): + tmp_dict = {} + for day in data.keys(): + for plugin_name in data[day].keys(): + # print(f'{day}:{plugin_name} = {data[day][plugin_name]}') + if data[day][plugin_name] is not None: + if tmp_dict.get(plugin_name) is None: + tmp_dict[plugin_name] = 1 + else: + tmp_dict[plugin_name] += data[day][plugin_name] + return tmp_dict diff --git a/plugins/super_cmd/__init__.py b/plugins/super_cmd/__init__.py index 6effccd9..f6a4098a 100644 --- a/plugins/super_cmd/__init__.py +++ b/plugins/super_cmd/__init__.py @@ -4,12 +4,12 @@ from models.level_user import LevelUser from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, Event, MessageEvent, Message from nonebot.rule import to_me -from util.utils import get_message_at, get_message_text, is_number, get_bot +from utils.utils import get_message_at, get_message_text, is_number, get_bot from services.log import logger from .data_source import open_remind, close_remind from models.group_info import GroupInfo from models.friend_user import FriendUser -from util.init_result import at +from utils.init_result import at __plugin_name__ = '超级用户指令 [Hidden]' @@ -65,8 +65,9 @@ async def _(bot: Bot, event: MessageEvent, state: T_State): if flag == 2: await super_cmd.send(result) elif flag == 1: - await bot.send_group_msg(group_id=group_id, message=Message(f'{at(qq)}管理员已为你修改' + await bot.send_group_msg(group_id=group_id, message=Message(f'{at(qq)}管理员修改了你的权限' f'权限\n--------\n你当前的权限等级:{level}')) + await super_cmd.send('修改成功') except Exception as e: await super_cmd.send("执行指令失败!") logger.error(f'执行指令失败 e{e}') diff --git a/plugins/super_help/__init__.py b/plugins/super_help/__init__.py index bfcd5318..f2a8c613 100644 --- a/plugins/super_help/__init__.py +++ b/plugins/super_help/__init__.py @@ -11,22 +11,23 @@ super_help = on_command("超级用户帮助", rule=to_me(), priority=1, permissi @super_help.handle() async def _(bot: Bot, event: Event, state: T_State): result = '''超级用户帮助: - 1.添加/删除管理 + 1.添加/删除管理 [at] [level] 2.查看群组/查看好友 - 3.广播 --> 指令:广播- + 3.广播 --> 指令:广播- [msg] 4.更新色图 - 5.回复 --> 指令:/t 用户 群号 + 5.回复 --> 指令:/t命令帮助 6.更新cookie --> 指令:更新cookie [cookie] 7.开启广播通知 --> 指令:开启广播通知 [群号] - 8.退群 --> 指令:退群 群号 + 8.退群 --> 指令:退群 [群号] 9.自检 10.更新好友信息 11.更新群群信息 - 12.重载原神/方舟卡池 + 12.重载原神/方舟/赛马娘/坎公骑冠剑卡池 13.添加商品 [名称] [价格] [描述] [折扣] [限时时间] 14.删除商品 [名称(序号)] 15.修改商品 -name [名称(序号)] -price [价格] -des [描述] -discount [折扣] -time [限时] - 16.节日红包 [金额] [数量] [祝福语](可省) [指定群](可省) [指定群]...''' + 16.节日红包 [金额] [数量] [祝福语](可省) [指定群](可省) [指定群]... + 17.更新原神今日素材''' await super_help.finish(result, at_sender=True) diff --git a/plugins/test.py b/plugins/test.py index b4553452..fdaa3abc 100644 --- a/plugins/test.py +++ b/plugins/test.py @@ -1,5 +1,6 @@ from nonebot.rule import to_me from nonebot.typing import T_State +import base64 from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, MessageEvent from nonebot import on_command, on_keyword, on_metaevent from nonebot.plugin import MatcherGroup @@ -8,8 +9,8 @@ import nonebot from models.open_cases_user import OpenCasesUser from tzlocal import get_localzone from datetime import datetime, timezone, timedelta -from util.utils import get_bot, get_message_imgs, get_local_proxy -from util.init_result import * +from utils.utils import get_bot, get_message_imgs, get_local_proxy +from utils.init_result import * from nonebot.adapters.cqhttp.message import MessageSegment import requests import aiohttp @@ -17,28 +18,37 @@ from models.bag_user import BagUser from nonebot.adapters.cqhttp.message import Message import asyncio from models.group_member_info import GroupInfoUser - +from matplotlib import font_manager +from matplotlib import pyplot as plt +import matplotlib as mpl +from utils.utils import scheduler +from utils.browser import get_browser +from playwright.async_api import async_playwright, Browser +from typing import Optional +import playwright # erm = on_command('异世相遇,尽享美味', aliases={'异世相遇 尽享美味', '异世相遇,尽享美味'}, priority=5, block=True) -# matcher = on_keyword({"test"}) -# -# -# @matcher.handle() -# async def _(bot: Bot, event: MessageEvent, state: T_State): -# songContent = [ -# { -# "type": "music", -# "data": { -# "type": "custom", -# "subtype": "kugou", -# "url": "https://webfs.yun.kugou.com/", -# "audio": "https://webfs.yun.kugou.com/202106231924/77ad13a9c9c091f74aa10098281433ab/G128/M02/02/00/wA0DAFplVJ6AIcIiADK1ZUYugV4043.mp3", -# "title": "音乐标题" -# } -# } -# ] -# await matcher.send(songContent) +matcher = on_keyword({"test"}) + + +@matcher.handle() +async def _(bot: Bot, event: MessageEvent, state: T_State): + browser = await get_browser() + url = 'https://genshin.pub/daily' + # try: + page = await browser.new_page() + await page.goto(url) + await page.set_viewport_size({"width": 2560, "height": 1080}) + await page.click("button") + card = await page.query_selector(".GSContainer_inner_border_box__21_vs") + clip = await card.bounding_box() + await page.screenshot(path=f'xxxx.png', clip=clip) + await page.close() + # except Exception: + if page: + await page.close() + # raise # @erm.handle() # async def first_receive(bot: Bot, event: Event, state: T_State): @@ -47,4 +57,3 @@ from models.group_member_info import GroupInfoUser - diff --git a/plugins/translate/__init__.py b/plugins/translate/__init__.py index b51748b8..ed7afb5d 100644 --- a/plugins/translate/__init__.py +++ b/plugins/translate/__init__.py @@ -1,5 +1,5 @@ from nonebot import on_command -from util.utils import get_message_text +from utils.utils import get_message_text from services.log import logger from nonebot.adapters.cqhttp import Bot, MessageEvent from nonebot.typing import T_State diff --git a/plugins/translate/data_source.py b/plugins/translate/data_source.py index 1af00053..6bdd3d11 100644 --- a/plugins/translate/data_source.py +++ b/plugins/translate/data_source.py @@ -1,6 +1,6 @@ import aiohttp -from util.utils import get_local_proxy -from util.user_agent import get_user_agent +from utils.utils import get_local_proxy +from utils.user_agent import get_user_agent url = f'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null' diff --git a/plugins/update_gocqhttp/__init__.py b/plugins/update_gocqhttp/__init__.py index bfc6826b..6c5a01ae 100644 --- a/plugins/update_gocqhttp/__init__.py +++ b/plugins/update_gocqhttp/__init__.py @@ -5,7 +5,7 @@ from .data_source import download_gocq_lasted, upload_gocq_lasted import os from nonebot.adapters.cqhttp.permission import GROUP from services.log import logger -from util.utils import scheduler, get_bot, UserExistLimiter +from utils.utils import scheduler, get_bot, UserExistLimiter from configs.config import UPDATE_GOCQ_GROUP from pathlib import Path diff --git a/plugins/update_gocqhttp/data_source.py b/plugins/update_gocqhttp/data_source.py index f49f82bb..b17fe46f 100644 --- a/plugins/update_gocqhttp/data_source.py +++ b/plugins/update_gocqhttp/data_source.py @@ -1,6 +1,6 @@ import aiohttp -from util.utils import get_local_proxy, get_bot -from util.user_agent import get_user_agent +from utils.utils import get_local_proxy, get_bot +from utils.user_agent import get_user_agent import asyncio import platform import aiofiles diff --git a/plugins/update_info.py b/plugins/update_info.py index 13f2f006..5d2e744b 100644 --- a/plugins/update_info.py +++ b/plugins/update_info.py @@ -1,7 +1,7 @@ from nonebot import on_command from nonebot.adapters.cqhttp import Bot, Event from nonebot.typing import T_State -from util.init_result import image +from utils.init_result import image __plugin_name__ = '更新信息' diff --git a/plugins/update_pic.py b/plugins/update_pic.py index 04fa5580..83764149 100644 --- a/plugins/update_pic.py +++ b/plugins/update_pic.py @@ -1,16 +1,16 @@ from nonebot import on_command from PIL import Image, ImageFilter -from util.init_result import image +from utils.init_result import image from configs.path_config import IMAGE_PATH from services.log import logger from nonebot.rule import to_me from nonebot.adapters.cqhttp import Bot, MessageEvent from nonebot.typing import T_State -from util.utils import get_message_imgs +from utils.utils import get_message_imgs import aiofiles import aiohttp -from util.utils import is_number, get_message_text -from util.img_utils import CreateImg, pic2b64 +from utils.utils import is_number, get_message_text +from utils.img_utils import CreateImg, pic2b64 import cv2 import numpy as np diff --git a/plugins/update_setu/__init__.py b/plugins/update_setu/__init__.py index 662085dc..99a26bf1 100644 --- a/plugins/update_setu/__init__.py +++ b/plugins/update_setu/__init__.py @@ -1,4 +1,4 @@ -from util.utils import scheduler +from utils.utils import scheduler from nonebot import on_command from nonebot.permission import SUPERUSER from nonebot.typing import T_State diff --git a/plugins/update_setu/data_source.py b/plugins/update_setu/data_source.py index 621d4e39..53b77ca1 100644 --- a/plugins/update_setu/data_source.py +++ b/plugins/update_setu/data_source.py @@ -1,10 +1,10 @@ from configs.path_config import IMAGE_PATH, TXT_PATH import os -from util.user_agent import get_user_agent +from utils.user_agent import get_user_agent from services.log import logger from datetime import datetime -from util.img_utils import rar_imgs, get_img_hash -from util.utils import get_bot, get_local_proxy +from utils.img_utils import rar_imgs, get_img_hash +from utils.utils import get_bot, get_local_proxy from asyncio.exceptions import TimeoutError import aiofiles import aiohttp diff --git a/plugins/upload_img/__init__.py b/plugins/upload_img/__init__.py index 647805ca..f5b36c13 100644 --- a/plugins/upload_img/__init__.py +++ b/plugins/upload_img/__init__.py @@ -5,10 +5,10 @@ import os from nonebot.rule import to_me from nonebot.typing import T_State from nonebot.adapters import Bot, Event -from util.utils import get_message_imgs, get_message_text +from utils.utils import get_message_imgs, get_message_text import aiohttp import aiofiles -from util.utils import cn2py +from utils.utils import cn2py from configs.config import IMAGE_DIR_LIST __plugin_name__ = '上传图片' diff --git a/plugins/weather/__init__.py b/plugins/weather/__init__.py index ee3f22ae..0b1ed3ce 100644 --- a/plugins/weather/__init__.py +++ b/plugins/weather/__init__.py @@ -6,7 +6,7 @@ from services.log import logger from nonebot.typing import T_State from .config import city_list import re -from util.utils import get_message_text +from utils.utils import get_message_text __plugin_name__ = '天气查询' __plugin_usage__ = "普普通通的查天气吧\n示例:北京天气" diff --git a/plugins/weather/data_source.py b/plugins/weather/data_source.py index e806839d..57f19871 100644 --- a/plugins/weather/data_source.py +++ b/plugins/weather/data_source.py @@ -1,5 +1,5 @@ import requests -from util.init_result import image +from utils.init_result import image async def get_weather_of_city(city) -> str: diff --git a/plugins/what_anime/__init__.py b/plugins/what_anime/__init__.py index 2fe601eb..95fda9d7 100644 --- a/plugins/what_anime/__init__.py +++ b/plugins/what_anime/__init__.py @@ -3,9 +3,9 @@ from .data_source import get_anime from nonebot import on_command from nonebot.typing import T_State from nonebot.adapters import Bot, Event -from util.utils import get_message_imgs +from utils.utils import get_message_imgs from services.log import logger -from util.utils import UserExistLimiter +from utils.utils import UserExistLimiter __plugin_name__ = '识番' diff --git a/plugins/what_anime/data_source.py b/plugins/what_anime/data_source.py index b08f2c0c..6d968781 100644 --- a/plugins/what_anime/data_source.py +++ b/plugins/what_anime/data_source.py @@ -1,9 +1,9 @@ import time from services.log import logger -from util.langconv import * +from utils.langconv import * import aiohttp -from util.user_agent import get_user_agent +from utils.user_agent import get_user_agent async def get_anime(anime: str) -> str: diff --git a/plugins/white2black_img.py b/plugins/white2black_img.py index 9e51ecf0..b33e5972 100644 --- a/plugins/white2black_img.py +++ b/plugins/white2black_img.py @@ -1,13 +1,13 @@ from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, MessageEvent from nonebot import on_command -from util.utils import get_message_imgs, get_local_proxy, get_message_text, is_Chinese -from util.init_result import image +from utils.utils import get_message_imgs, get_local_proxy, get_message_text, is_Chinese +from utils.init_result import image import aiohttp import aiofiles from configs.path_config import IMAGE_PATH -from util.img_utils import CreateImg -from util.user_agent import get_user_agent +from utils.img_utils import CreateImg +from utils.user_agent import get_user_agent from services.log import logger # ZH_CN2EN 中文 » 英语 diff --git a/plugins/yiqing/__init__.py b/plugins/yiqing/__init__.py index 556ce221..5b8a3db4 100644 --- a/plugins/yiqing/__init__.py +++ b/plugins/yiqing/__init__.py @@ -4,7 +4,7 @@ from services.log import logger from nonebot.adapters.cqhttp import Bot, Event from nonebot.typing import T_State from .config import city_list -from util.utils import scheduler +from utils.utils import scheduler __plugin_name__ = '疫情查询' __plugin_usage__ = '查询疫情帮助:\n\t对我说 查询疫情 省份/城市,我会回复疫情的实时数据\n\t示例: 查询疫情 温州' diff --git a/plugins/yiqing/data_source.py b/plugins/yiqing/data_source.py index 90df0733..7c68e28a 100644 --- a/plugins/yiqing/data_source.py +++ b/plugins/yiqing/data_source.py @@ -1,10 +1,10 @@ from datetime import datetime import aiohttp -from util.user_agent import get_user_agent +from utils.user_agent import get_user_agent import json import os from configs.path_config import TXT_PATH -from util.utils import get_local_proxy +from utils.utils import get_local_proxy url = "https://api.yimian.xyz/coro/" diff --git a/utils/browser.py b/utils/browser.py new file mode 100644 index 00000000..f2d6de8b --- /dev/null +++ b/utils/browser.py @@ -0,0 +1,59 @@ +from typing import Optional +import shutil +from nonebot.log import logger +from playwright.async_api import Browser, async_playwright +import nonebot +from nonebot import Driver +from appdirs import AppDirs +from pathlib import Path +from services.log import logger + + +driver: Driver = nonebot.get_driver() + + +_browser: Optional[Browser] = None + + +async def init(**kwargs) -> Optional[Browser]: + try: + global _browser + browser = await async_playwright().start() + _browser = await browser.chromium.launch(**kwargs) + return _browser + except NotImplemented: + logger.warning('win环境下 初始化playwright失败....请替换环境至linux') + return None + + +async def get_browser(**kwargs) -> Browser: + return _browser or await init(**kwargs) + + +@driver.on_startup +def install(): + """自动安装、更新 Chromium""" + logger.info("正在检查 Chromium 更新") + import sys + from playwright.__main__ import main + sys.argv = ['', 'install', 'chromium'] + main() + + +@driver.on_startup +def delete_pyppeteer(): + """删除 Pyppeteer 遗留的 Chromium""" + + dir = Path(AppDirs('pyppeteer').user_data_dir) + if not dir.exists(): + return + + # if not config.haruka_delete_pyppeteer: + # logger.info("检测到 Pyppeteer 依赖(约 300 M)," + # "新版 HarukaBot 已经不需要这些文件了。" + # "如果没有其他程序依赖 Pyppeteer,请在 '.env.*' 中设置" + # " 'HARUKA_DELETE_PYPPETEER=True' 并重启 Bot 后,将自动清除残留") + # else: + shutil.rmtree(dir) + logger.info("已清理 Pyppeteer 依赖残留") + diff --git a/utils/data_utils.py b/utils/data_utils.py new file mode 100644 index 00000000..903c2d6e --- /dev/null +++ b/utils/data_utils.py @@ -0,0 +1,24 @@ +from models.group_member_info import GroupInfoUser + + +# 生成通用排行榜 +async def init_rank(users: list, all_user_data: list, group_id: int): + all_user_id = [user.user_qq for user in users] + rst = '' + for i in range(len(all_user_id) if len(all_user_id) < 10 else 10): + _max = max(all_user_data) + max_user_id = all_user_id[all_user_data.index(_max)] + all_user_id.remove(max_user_id) + all_user_data.remove(_max) + try: + user_name = (await GroupInfoUser.select_member_info(max_user_id, group_id)).user_name + except AttributeError: + user_name = f'{max_user_id}' + rst += f'{user_name}: {_max}\n' + return rst[:-1] + + + + + + diff --git a/utils/img_utils.py b/utils/img_utils.py new file mode 100644 index 00000000..d1491408 --- /dev/null +++ b/utils/img_utils.py @@ -0,0 +1,326 @@ +import os +from configs.path_config import IMAGE_PATH, TXT_PATH, TTF_PATH +from PIL import Image, ImageFile, ImageDraw, ImageFont +import cv2 +import imagehash +import base64 +from io import BytesIO +from matplotlib import pyplot as plt + + +# 扫描图库id是否连贯 +def scan_img(path): + path = IMAGE_PATH + path + nolist = [] + length = len(os.listdir(path)) + print(length) + for i in range(length): + if i in nolist: + continue + img_path = path + "{}.jpg".format(i) + if not os.path.exists(img_path): + print("不存在=== " + str(length) + ".jpg -------> " + str(i) + ".jpg") + os.rename(path + "{}.jpg".format(length - 1), img_path) + nolist.append(length) + length -= 1 + + +# 比较hash值 +def compare_image_with_hash(image_file1, image_file2, max_dif=1.5): + """ + max_dif: 允许最大hash差值, 越小越精确,最小为0 + 推荐使用 + """ + ImageFile.LOAD_TRUNCATED_IMAGES = True + hash_1 = None + hash_2 = None + hash_1 = get_img_hash(image_file1) + hash_2 = get_img_hash(image_file2) + dif = hash_1 - hash_2 + if dif < 0: + dif = -dif + if dif <= max_dif: + return True + else: + return False + + +# 比较图片与hash值 +def compare_one_img_hash(image_file, hash_2, max_dif=1.5): + hash_1 = get_img_hash(image_file) + dif = hash_1 - hash_2 + if dif < 0: + dif = -dif + if dif <= max_dif: + return True + else: + return False + + +def get_img_hash(image_file): + with open(image_file, 'rb') as fp: + hash_value = imagehash.average_hash(Image.open(fp)) + return hash_value + + +# 压缩图片 +def rar_imgs(inpath, outpath, ratio=0.9, start=0, end=0, lens=0, maxsize=0.0, in_file_name='', out_file_name='', + itype='jpg'): + in_path = IMAGE_PATH + inpath + '/' + out_path = IMAGE_PATH + outpath + '/' + # scan_img(inpath) + l = [] + if in_file_name != '' and out_file_name != '': + filein = in_path + in_file_name + "." + itype + fileout = out_path + out_file_name + "." + itype + h, w, d = cv2.imread(filein).shape + width = int(w * ratio) + height = int(h * ratio) + ResizeImage(filein, fileout, width, height) + else: + if lens == 0: + lens = len(os.listdir(in_path)) + if end == 0: + end = lens + for i in range(start, end): + if i in l: + continue + if maxsize != 0: + if os.path.getsize(in_path + str(i) + ".jpg") > maxsize: + print("压缩----->", i, ".jpg") + filein = in_path + str(i) + ".jpg" + fileout = out_path + str(i) + ".jpg" + h, w, d = cv2.imread(filein).shape + width = int(w * ratio) + height = int(h * ratio) + ResizeImage(filein, fileout, width, height) + else: + continue + else: + print("压缩----->", i, ".jpg") + filein = in_path + str(i) + ".jpg" + fileout = out_path + str(i) + ".jpg" + h, w, d = cv2.imread(filein).shape + width = int(w * ratio) + height = int(h * ratio) + ResizeImage(filein, fileout, width, height) + + +# 压缩 +def ResizeImage(filein, fileout, width, height): + img = cv2.resize(cv2.imread(filein), (int(width), int(height))) + cv2.imwrite(fileout, img) + + +# 保存图片压缩后的hash值 +def save_img_hash(path, name): + for file in os.listdir(IMAGE_PATH + path): + if os.path.getsize(IMAGE_PATH + path + file) > 1024 * 1024 * 1.5: + compare_img_hash_in_txt(IMAGE_PATH + 'rar/' + file, name) + else: + compare_img_hash_in_txt(IMAGE_PATH + path + file, name) + + +# 比较色图hash值 +def compare_img_hash_in_txt(file, name, mode=1): + with open(TXT_PATH + name + ".txt", 'a+') as txtfile: + txtfile.seek(0) + hash_list = txtfile.read()[:-1].strip(",") + txtfile.seek(2) + with open(file, 'rb') as fp: + img_hash = str(imagehash.average_hash(Image.open(fp))) + if img_hash not in hash_list: + if mode == 1: + txtfile.write(img_hash + ",") + return False + return True + + +# 透明背景 -> 白色 +def alphabg2white_PIL(img): + img = img.convert('RGBA') + sp = img.size + width = sp[0] + height = sp[1] + for yh in range(height): + for xw in range(width): + dot = (xw, yh) + color_d = img.getpixel(dot) + if color_d[3] == 0: + color_d = (255, 255, 255, 255) + img.putpixel(dot, color_d) + return img + + +def pic2b64(pic: Image) -> str: + buf = BytesIO() + pic.save(buf, format='PNG') + base64_str = base64.b64encode(buf.getvalue()).decode() + return 'base64://' + base64_str + + +def fig2b64(plt: plt) -> str: + buf = BytesIO() + plt.savefig(buf, format='PNG', dpi=100) + base64_str = base64.b64encode(buf.getvalue()).decode() + return 'base64://' + base64_str + + +class CreateImg: + def __init__(self, + w, + h, + img_w=0, + img_h=0, + color='white', + image_type='RGBA', + font_size=10, + background='', + ttf='yz.ttf', + divisor=1): + self.w = int(w) + self.h = int(h) + self.img_w = int(img_w) + self.img_h = int(img_h) + self.current_w = 0 + self.current_h = 0 + self.ttfont = ImageFont.truetype(TTF_PATH + ttf, int(font_size)) + if not background: + self.markImg = Image.new(image_type, (self.w, self.h), color) + else: + if w == 0 and h == 0: + self.markImg = Image.open(background) + w, h = self.markImg.size + if divisor: + self.w = int(divisor * w) + self.h = int(divisor * h) + self.markImg = self.markImg.resize((self.w, self.h), Image.ANTIALIAS) + else: + self.w = w + self.h = h + else: + self.markImg = Image.open(background).resize((self.w, self.h), Image.ANTIALIAS) + self.draw = ImageDraw.Draw(self.markImg) + self.size = self.w, self.h + + # 贴图 + def paste(self, img, pos=None, alpha=False): + if isinstance(img, CreateImg): + img = img.markImg + if self.current_w == self.w: + self.current_w = 0 + self.current_h += self.img_h + if not pos: + pos = (self.current_w, self.current_h) + if alpha: + try: + self.markImg.paste(img, pos, img) + except ValueError: + img = img.convert("RGBA") + self.markImg.paste(img, pos, img) + else: + self.markImg.paste(img, pos) + self.current_w += self.img_w + return self.markImg + + # 获取文字大小 + def getsize(self, msg): + return self.ttfont.getsize(msg) + + # 写字 + def text(self, pos, text, fill=(0, 0, 0)): + self.draw.text(pos, text, fill=fill, font=self.ttfont) + return self.markImg + + # 饼图 + def pieslice(self): + self.draw.pieslice((350, 50, 500, 200), -150, -30, 'pink', 'crimson') + return self.markImg + + # 保存 + def save(self, path): + self.markImg.save(path) + + # 显示 + def show(self): + self.markImg.show(self.markImg) + + # 压缩 + def resize(self, ratio=0, w=0, h=0): + if not w and not h and not ratio: + raise Exception('缺少参数...') + if not w and not h and ratio: + w = int(self.w * ratio) + h = int(self.h * ratio) + self.markImg = self.markImg.resize((w, h), Image.ANTIALIAS) + self.w, self.h = self.markImg.size + self.size = self.w, self.h + self.draw = ImageDraw.Draw(self.markImg) + + # 检查字体大小 + def check_font_size(self, word): + return self.ttfont.getsize(word)[0] > self.w + + # 透明化 + def transparent(self, n=0): + self.markImg = self.markImg.convert('RGBA') # 修改颜色通道为RGBA + x, y = self.markImg.size # 获得长和宽 + # 设置每个像素点颜色的透明度 + for i in range(n, x - n): + for k in range(n, y - n): + color = self.markImg.getpixel((i, k)) + color = color[:-1] + (100, ) + self.markImg.putpixel((i, k), color) + return self.markImg + + # 转bs4: + def pic2bs4(self): + buf = BytesIO() + self.markImg.save(buf, format='PNG') + base64_str = base64.b64encode(buf.getvalue()).decode() + return base64_str + + # + def convert(self, itype): + self.markImg = self.markImg.convert(itype) + + # 变圆 + def circle(self): + self.convert('RGBA') + r2 = min(self.w, self.h) + if self.w != self.h: + self.resize(w=r2, h=r2) + r3 = int(r2 / 2) + imb = Image.new('RGBA', (r3 * 2, r3 * 2), (255, 255, 255, 0)) + pima = self.markImg.load() # 像素的访问对象 + pimb = imb.load() + r = float(r2 / 2) + for i in range(r2): + for j in range(r2): + lx = abs(i - r) # 到圆心距离的横坐标 + ly = abs(j - r) # 到圆心距离的纵坐标 + l = (pow(lx, 2) + pow(ly, 2)) ** 0.5 # 三角函数 半径 + if l < r3: + pimb[i - (r - r3), j - (r - r3)] = pima[i, j] + self.markImg = imb + + # + def getchannel(self, itype): + self.markImg = self.markImg.getchannel(itype) + + + +if __name__ == '__main__': + pass + + + + + + + + + + + + diff --git a/utils/init_result.py b/utils/init_result.py new file mode 100644 index 00000000..92d4b0d0 --- /dev/null +++ b/utils/init_result.py @@ -0,0 +1,88 @@ +from configs.path_config import IMAGE_PATH, VOICE_PATH +from nonebot.adapters.cqhttp.message import MessageSegment +import os +from services.log import logger +import ujson + + +def image(img_name: str = None, path: str = '', abspath: str = None, b64: str = None): + if abspath: + if os.path.exists(abspath): + return MessageSegment.image("file:///" + abspath) + else: + return '' + elif b64: + if b64.find('base64://') != -1: + return MessageSegment.image(b64) + else: + return MessageSegment.image('base64://' + b64) + else: + img_name = str(img_name) + if img_name.find('http') == -1: + if len(img_name.split('.')) == 1: + img_name += '.jpg' + if os.path.exists(IMAGE_PATH + path + '/' + img_name): + return MessageSegment.image("file:///" + IMAGE_PATH + path + '/' + img_name) + else: + logger.warning(f"图片 {path}/{img_name}缺失.") + return '' + else: + return MessageSegment.image(img_name) + + +def at(qq): + return MessageSegment.at(qq) + + +def record(voice_name='', path=''): + if len(voice_name.split('.')) == 1: + voice_name += '.mp3' + if path == "": + name = VOICE_PATH + "{}.".format(voice_name) + else: + name = VOICE_PATH + "{}/{}".format(path, voice_name) + if voice_name.find('http') == -1: + if os.path.exists(name): + result = MessageSegment.record("file:///" + name) + return result + else: + logger.warning(f"语音{path}/{voice_name}缺失...") + return "" + else: + return MessageSegment.record(voice_name) + + +def text(msg): + return MessageSegment.text(msg) + + +def contact_user(qq): + return MessageSegment.contact_user(qq) + + +def share(url, title, content='', image_url=''): + return MessageSegment.share(url, title, content, image_url) + + +def xml(data): + return MessageSegment.xml(data) + + +def json(data): + data = ujson.dumps(data) + return MessageSegment.json(data) + + +def face(id_): + return MessageSegment.face(id_) + + +def poke(qq): + return MessageSegment('poke', {"qq": qq}) + + +def forward(): + return MessageSegment.forward() + +# if __name__ == '__main__': +# print(get_record_result("dadada", "", type="amr")) diff --git a/utils/langconv.py b/utils/langconv.py new file mode 100644 index 00000000..4977161b --- /dev/null +++ b/utils/langconv.py @@ -0,0 +1,274 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from copy import deepcopy +import re + +try: + import psyco + psyco.full() +except: + pass + +from .zh_wiki import zh2Hant, zh2Hans + +import sys +py3k = sys.version_info >= (3, 0, 0) + +if py3k: + UEMPTY = '' +else: + _zh2Hant, _zh2Hans = {}, {} + for old, new in ((zh2Hant, _zh2Hant), (zh2Hans, _zh2Hans)): + for k, v in old.items(): + new[k.decode('utf8')] = v.decode('utf8') + zh2Hant = _zh2Hant + zh2Hans = _zh2Hans + UEMPTY = ''.decode('utf8') + +# states +(START, END, FAIL, WAIT_TAIL) = list(range(4)) +# conditions +(TAIL, ERROR, MATCHED_SWITCH, UNMATCHED_SWITCH, CONNECTOR) = list(range(5)) + +MAPS = {} + +class Node(object): + def __init__(self, from_word, to_word=None, is_tail=True, + have_child=False): + self.from_word = from_word + if to_word is None: + self.to_word = from_word + self.data = (is_tail, have_child, from_word) + self.is_original = True + else: + self.to_word = to_word or from_word + self.data = (is_tail, have_child, to_word) + self.is_original = False + self.is_tail = is_tail + self.have_child = have_child + + def is_original_long_word(self): + return self.is_original and len(self.from_word)>1 + + def is_follow(self, chars): + return chars != self.from_word[:-1] + + def __str__(self): + return '' % (repr(self.from_word), + repr(self.to_word), self.is_tail, self.have_child) + + __repr__ = __str__ + +class ConvertMap(object): + def __init__(self, name, mapping=None): + self.name = name + self._map = {} + if mapping: + self.set_convert_map(mapping) + + def set_convert_map(self, mapping): + convert_map = {} + have_child = {} + max_key_length = 0 + for key in sorted(mapping.keys()): + if len(key)>1: + for i in range(1, len(key)): + parent_key = key[:i] + have_child[parent_key] = True + have_child[key] = False + max_key_length = max(max_key_length, len(key)) + for key in sorted(have_child.keys()): + convert_map[key] = (key in mapping, have_child[key], + mapping.get(key, UEMPTY)) + self._map = convert_map + self.max_key_length = max_key_length + + def __getitem__(self, k): + try: + is_tail, have_child, to_word = self._map[k] + return Node(k, to_word, is_tail, have_child) + except: + return Node(k) + + def __contains__(self, k): + return k in self._map + + def __len__(self): + return len(self._map) + +class StatesMachineException(Exception): pass + +class StatesMachine(object): + def __init__(self): + self.state = START + self.final = UEMPTY + self.len = 0 + self.pool = UEMPTY + + def clone(self, pool): + new = deepcopy(self) + new.state = WAIT_TAIL + new.pool = pool + return new + + def feed(self, char, map): + node = map[self.pool+char] + + if node.have_child: + if node.is_tail: + if node.is_original: + cond = UNMATCHED_SWITCH + else: + cond = MATCHED_SWITCH + else: + cond = CONNECTOR + else: + if node.is_tail: + cond = TAIL + else: + cond = ERROR + + new = None + if cond == ERROR: + self.state = FAIL + elif cond == TAIL: + if self.state == WAIT_TAIL and node.is_original_long_word(): + self.state = FAIL + else: + self.final += node.to_word + self.len += 1 + self.pool = UEMPTY + self.state = END + elif self.state == START or self.state == WAIT_TAIL: + if cond == MATCHED_SWITCH: + new = self.clone(node.from_word) + self.final += node.to_word + self.len += 1 + self.state = END + self.pool = UEMPTY + elif cond == UNMATCHED_SWITCH or cond == CONNECTOR: + if self.state == START: + new = self.clone(node.from_word) + self.final += node.to_word + self.len += 1 + self.state = END + else: + if node.is_follow(self.pool): + self.state = FAIL + else: + self.pool = node.from_word + elif self.state == END: + # END is a new START + self.state = START + new = self.feed(char, map) + elif self.state == FAIL: + raise StatesMachineException('Translate States Machine ' + 'have error with input data %s' % node) + return new + + def __len__(self): + return self.len + 1 + + def __str__(self): + return '' % ( + id(self), self.pool, self.state, self.final) + __repr__ = __str__ + +class Converter(object): + def __init__(self, to_encoding): + self.to_encoding = to_encoding + self.map = MAPS[to_encoding] + self.start() + + def feed(self, char): + branches = [] + for fsm in self.machines: + new = fsm.feed(char, self.map) + if new: + branches.append(new) + if branches: + self.machines.extend(branches) + self.machines = [fsm for fsm in self.machines if fsm.state != FAIL] + all_ok = True + for fsm in self.machines: + if fsm.state != END: + all_ok = False + if all_ok: + self._clean() + return self.get_result() + + def _clean(self): + if len(self.machines): + self.machines.sort(key=lambda x: len(x)) + # self.machines.sort(cmp=lambda x,y: cmp(len(x), len(y))) + self.final += self.machines[0].final + self.machines = [StatesMachine()] + + def start(self): + self.machines = [StatesMachine()] + self.final = UEMPTY + + def end(self): + self.machines = [fsm for fsm in self.machines + if fsm.state == FAIL or fsm.state == END] + self._clean() + + def convert(self, string): + self.start() + for char in string: + self.feed(char) + self.end() + return self.get_result() + + def get_result(self): + return self.final + + +def registery(name, mapping): + global MAPS + MAPS[name] = ConvertMap(name, mapping) + +registery('zh-hant', zh2Hant) +registery('zh-hans', zh2Hans) +del zh2Hant, zh2Hans + + +def run(): + import sys + from optparse import OptionParser + parser = OptionParser() + parser.add_option('-e', type='string', dest='encoding', + help='encoding') + parser.add_option('-f', type='string', dest='file_in', + help='input file (- for stdin)') + parser.add_option('-t', type='string', dest='file_out', + help='output file') + (options, args) = parser.parse_args() + if not options.encoding: + parser.error('encoding must be set') + if options.file_in: + if options.file_in == '-': + file_in = sys.stdin + else: + file_in = open(options.file_in) + else: + file_in = sys.stdin + if options.file_out: + if options.file_out == '-': + file_out = sys.stdout + else: + file_out = open(options.file_out, 'wb') + else: + file_out = sys.stdout + + c = Converter(options.encoding) + for line in file_in: + # print >> file_out, c.convert(line.rstrip('\n').decode( + file_out.write(c.convert(line.rstrip('\n').decode( + 'utf8')).encode('utf8')) + + +if __name__ == '__main__': + run() + diff --git a/utils/user_agent.py b/utils/user_agent.py new file mode 100644 index 00000000..8cf7d94f --- /dev/null +++ b/utils/user_agent.py @@ -0,0 +1,47 @@ +import random + + +user_agent = [ + "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50", + "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50", + "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0", + "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko", + "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", + "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)", + "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", + "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1", + "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1", + "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11", + "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", + "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)", + "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)", + "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)", + "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)", + "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)", + "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)", + "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)", + "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)", + "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5", + "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5", + "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5", + "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", + "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", + "Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10", + "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13", + "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+", + "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0", + "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124", + "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)", + "UCWEB7.0.2.37/28/999", + "NOKIA5700/ UCWEB7.0.2.37/28/999", + "Openwave/ UCWEB7.0.2.37/28/999", + "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999", + # iPhone 6: + "Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25" +] + + +def get_user_agent(): + return {'User-Agent': random.choice(user_agent)} diff --git a/utils/utils.py b/utils/utils.py new file mode 100644 index 00000000..b0b7b0bd --- /dev/null +++ b/utils/utils.py @@ -0,0 +1,252 @@ +import time +from datetime import datetime, timedelta +from collections import defaultdict +from nonebot import require +import nonebot +import json +import pytz +from configs.path_config import TXT_PATH +from configs.config import system_proxy +import pypinyin +import aiohttp + + +scheduler = require('nonebot_plugin_apscheduler').scheduler + + +# 次数检测 +class CountLimiter: + def __init__(self, max): + self.count = defaultdict(int) + self.max = max + + def add(self, key): + self.count[key] += 1 + + def check(self, key) -> bool: + if self.count[key] >= self.max: + self.count[key] = 0 + return True + return False + + +# 用户正在执行此命令 +class UserExistLimiter: + def __init__(self): + self.mbool = defaultdict(bool) + self.time = time.time() + + def set_True(self, key): + self.time = time.time() + self.mbool[key] = True + + def set_False(self, key): + self.mbool[key] = False + + def check(self, key): + if time.time() - self.time > 30: + self.set_False(key) + return False + return self.mbool[key] + + +# 命令cd +class FreqLimiter: + def __init__(self, default_cd_seconds): + self.next_time = defaultdict(float) + self.default_cd = default_cd_seconds + + def check(self, key) -> bool: + return time.time() >= self.next_time[key] + + def start_cd(self, key, cd_time=0): + self.next_time[key] = time.time() + (cd_time if cd_time > 0 else self.default_cd) + + def left_time(self, key) -> float: + return self.next_time[key] - time.time() + + +static_flmt = FreqLimiter(15) + + +# 恶意触发命令检测 +class BanCheckLimiter: + def __init__(self, default_check_time: float = 5, default_count: int = 4): + self.mint = defaultdict(int) + self.mtime = defaultdict(float) + self.default_check_time = default_check_time + self.default_count = default_count + + def add(self, key): + if self.mint[key] == 1: + self.mtime[key] = time.time() + self.mint[key] += 1 + + def check(self, key) -> bool: + # print(self.mint[key]) + # print(time.time() - self.mtime[key]) + if time.time() - self.mtime[key] > self.default_check_time: + self.mtime[key] = time.time() + self.mint[key] = 0 + return False + if self.mint[key] >= self.default_count and time.time() - self.mtime[key] < self.default_check_time: + self.mtime[key] = time.time() + self.mint[key] = 0 + return True + return False + + +# 每日次数 +class DailyNumberLimiter: + tz = pytz.timezone('Asia/Shanghai') + + def __init__(self, max_num): + self.today = -1 + self.count = defaultdict(int) + self.max = max_num + + def check(self, key) -> bool: + now = datetime.now(self.tz) + day = (now - timedelta(hours=5)).day + if day != self.today: + self.today = day + self.count.clear() + return bool(self.count[key] < self.max) + + def get_num(self, key): + return self.count[key] + + def increase(self, key, num=1): + self.count[key] += num + + def reset(self, key): + self.count[key] = 0 + + +def is_number(s) -> bool: + try: + float(s) + return True + except ValueError: + pass + try: + import unicodedata + unicodedata.numeric(s) + return True + except (TypeError, ValueError): + pass + return False + + +# 获取bot +def get_bot(): + return list(nonebot.get_bots().values())[0] + + +def get_message_at(data: str) -> list: + qq_list = [] + data = json.loads(data) + try: + for msg in data['message']: + if msg['type'] == 'at': + qq_list.append(int(msg['data']['qq'])) + return qq_list + except Exception: + return [] + + +def get_message_imgs(data: str) -> list: + img_list = [] + data = json.loads(data) + try: + for msg in data['message']: + if msg['type'] == 'image': + img_list.append(msg['data']['url']) + return img_list + except Exception: + return [] + + +def get_message_text(data: str) -> str: + data = json.loads(data) + result = '' + try: + for msg in data['message']: + if msg['type'] == 'text': + result += msg['data']['text'].strip() + ' ' + return result.strip() + except Exception: + return '' + + +def get_message_type(data: str) -> str: + return json.loads(data)['message_type'] + + +def get_message_record(data: str) -> str: + data = json.loads(data) + try: + for msg in data['message']: + if msg['type'] == 'record': + return msg['data']['url'] + return '' + except Exception: + return '' + + +def get_message_json(data: str) -> dict: + data = json.loads(data) + try: + for msg in data['message']: + if msg['type'] == 'json': + return msg['data'] + return {} + except Exception: + return {} + + +def add_to_16(value): + while len(value) % 16 != 0: + value += '\0' + return str.encode(value) + + +# 获取文本加密后的cookie +def get_cookie_text(cookie_name: str) -> str: + with open(TXT_PATH + "cookie/" + cookie_name + ".txt", 'r') as f: + return f.read() + + +# 获取本地http代理 +def get_local_proxy(): + return system_proxy if system_proxy else None + + +# 判断是否为中文 +def is_Chinese(word): + for ch in word: + if '\u4e00' <= ch <= '\u9fff': + return True + return False + + +async def user_avatar(qq): + url = f'http://q1.qlogo.cn/g?b=qq&nk={qq}&s=160' + async with aiohttp.ClientSession() as session: + async with session.get(url, proxy=get_local_proxy(), timeout=5) as response: + return await response.read() + + +async def group_avatar(group_id): + url = f'http://p.qlogo.cn/gh/{group_id}/{group_id}/640/' + async with aiohttp.ClientSession() as session: + async with session.get(url, proxy=get_local_proxy(), timeout=5) as response: + return await response.read() + + +def cn2py(word) -> str: + temp = "" + for i in pypinyin.pinyin(word, style=pypinyin.NORMAL): + temp += ''.join(i) + return temp + diff --git a/utils/zh_wiki.py b/utils/zh_wiki.py new file mode 100644 index 00000000..4f5720f7 --- /dev/null +++ b/utils/zh_wiki.py @@ -0,0 +1,8275 @@ +# -*- coding: utf-8 -*- +# copy fom wikipedia + +zh2Hant = { +'呆': '獃', +"打印机": "印表機", +'帮助文件': '說明檔案', +"画": "畫", +"龙": "竜", +"板": "板", +"表": "表", +"才": "才", +"丑": "醜", +"出": "出", +"淀": "澱", +"冬": "冬", +"范": "範", +"丰": "豐", +"刮": "刮", +"后": "後", +"胡": "胡", +"回": "回", +"伙": "夥", +"姜": "薑", +"借": "借", +"克": "克", +"困": "困", +"漓": "漓", +"里": "里", +"帘": "簾", +"霉": "霉", +"面": "面", +"蔑": "蔑", +"千": "千", +"秋": "秋", +"松": "松", +"咸": "咸", +"向": "向", +"余": "餘", +"郁": "鬱", +"御": "御", +"愿": "願", +"云": "雲", +"芸": "芸", +"沄": "沄", +"致": "致", +"制": "制", +"朱": "朱", +"筑": "築", +"准": "準", +"厂": "廠", +"广": "廣", +"辟": "闢", +"别": "別", +"卜": "卜", +"沈": "沈", +"冲": "沖", +"种": "種", +"虫": "蟲", +"担": "擔", +"党": "黨", +"斗": "鬥", +"儿": "兒", +"干": "乾", +"谷": "谷", +"柜": "櫃", +"合": "合", +"划": "劃", +"坏": "壞", +"几": "幾", +"系": "系", +"家": "家", +"价": "價", +"据": "據", +"卷": "捲", +"适": "適", +"蜡": "蠟", +"腊": "臘", +"了": "了", +"累": "累", +"么": "麽", +"蒙": "蒙", +"万": "萬", +"宁": "寧", +"朴": "樸", +"苹": "蘋", +"仆": "僕", +"曲": "曲", +"确": "確", +"舍": "舍", +"胜": "勝", +"术": "術", +"台": "台", +"体": "體", +"涂": "塗", +"叶": "葉", +"吁": "吁", +"旋": "旋", +"佣": "傭", +"与": "與", +"折": "折", +"征": "徵", +"症": "症", +"恶": "惡", +"发": "發", +"复": "復", +"汇": "匯", +"获": "獲", +"饥": "飢", +"尽": "盡", +"历": "歷", +"卤": "滷", +"弥": "彌", +"签": "簽", +"纤": "纖", +"苏": "蘇", +"坛": "壇", +"团": "團", +"须": "須", +"脏": "臟", +"只": "只", +"钟": "鐘", +"药": "藥", +"同": "同", +"志": "志", +"杯": "杯", +"岳": "岳", +"布": "布", +"当": "當", +"吊": "弔", +"仇": "仇", +"蕴": "蘊", +"线": "線", +"为": "為", +"产": "產", +"众": "眾", +"伪": "偽", +"凫": "鳧", +"厕": "廁", +"启": "啟", +"墙": "牆", +"壳": "殼", +"奖": "獎", +"妫": "媯", +"并": "並", +"录": "錄", +"悫": "愨", +"极": "極", +"沩": "溈", +"瘘": "瘺", +"硷": "鹼", +"竖": "豎", +"绝": "絕", +"绣": "繡", +"绦": "絛", +"绱": "緔", +"绷": "綳", +"绿": "綠", +"缰": "韁", +"苧": "苎", +"莼": "蒓", +"说": "說", +"谣": "謠", +"谫": "譾", +"赃": "贓", +"赍": "齎", +"赝": "贗", +"酝": "醞", +"采": "採", +"钩": "鉤", +"钵": "缽", +"锈": "銹", +"锐": "銳", +"锨": "杴", +"镌": "鐫", +"镢": "钁", +"阅": "閱", +"颓": "頹", +"颜": "顏", +"骂": "罵", +"鲇": "鯰", +"鲞": "鯗", +"鳄": "鱷", +"鸡": "雞", +"鹚": "鶿", +"荡": "盪", +"锤": "錘", +"㟆": "㠏", +"㛟": "𡞵", +"专": "專", +"业": "業", +"丛": "叢", +"东": "東", +"丝": "絲", +"丢": "丟", +"两": "兩", +"严": "嚴", +"丧": "喪", +"个": "個", +"临": "臨", +"丽": "麗", +"举": "舉", +"义": "義", +"乌": "烏", +"乐": "樂", +"乔": "喬", +"习": "習", +"乡": "鄉", +"书": "書", +"买": "買", +"乱": "亂", +"争": "爭", +"于": "於", +"亏": "虧", +"亚": "亞", +"亩": "畝", +"亲": "親", +"亵": "褻", +"亸": "嚲", +"亿": "億", +"仅": "僅", +"从": "從", +"仑": "侖", +"仓": "倉", +"仪": "儀", +"们": "們", +"优": "優", +"会": "會", +"伛": "傴", +"伞": "傘", +"伟": "偉", +"传": "傳", +"伣": "俔", +"伤": "傷", +"伥": "倀", +"伦": "倫", +"伧": "傖", +"伫": "佇", +"佥": "僉", +"侠": "俠", +"侣": "侶", +"侥": "僥", +"侦": "偵", +"侧": "側", +"侨": "僑", +"侩": "儈", +"侪": "儕", +"侬": "儂", +"俣": "俁", +"俦": "儔", +"俨": "儼", +"俩": "倆", +"俪": "儷", +"俫": "倈", +"俭": "儉", +"债": "債", +"倾": "傾", +"偬": "傯", +"偻": "僂", +"偾": "僨", +"偿": "償", +"傥": "儻", +"傧": "儐", +"储": "儲", +"傩": "儺", +"㑩": "儸", +"兑": "兌", +"兖": "兗", +"兰": "蘭", +"关": "關", +"兴": "興", +"兹": "茲", +"养": "養", +"兽": "獸", +"冁": "囅", +"内": "內", +"冈": "岡", +"册": "冊", +"写": "寫", +"军": "軍", +"农": "農", +"冯": "馮", +"决": "決", +"况": "況", +"冻": "凍", +"净": "凈", +"凉": "涼", +"减": "減", +"凑": "湊", +"凛": "凜", +"凤": "鳳", +"凭": "憑", +"凯": "凱", +"击": "擊", +"凿": "鑿", +"刍": "芻", +"刘": "劉", +"则": "則", +"刚": "剛", +"创": "創", +"删": "刪", +"刬": "剗", +"刭": "剄", +"刹": "剎", +"刽": "劊", +"刿": "劌", +"剀": "剴", +"剂": "劑", +"剐": "剮", +"剑": "劍", +"剥": "剝", +"剧": "劇", +"㓥": "劏", +"㔉": "劚", +"劝": "勸", +"办": "辦", +"务": "務", +"劢": "勱", +"动": "動", +"励": "勵", +"劲": "勁", +"劳": "勞", +"势": "勢", +"勋": "勛", +"勚": "勩", +"匀": "勻", +"匦": "匭", +"匮": "匱", +"区": "區", +"医": "醫", +"华": "華", +"协": "協", +"单": "單", +"卖": "賣", +"卢": "盧", +"卫": "衛", +"却": "卻", +"厅": "廳", +"厉": "厲", +"压": "壓", +"厌": "厭", +"厍": "厙", +"厐": "龎", +"厘": "釐", +"厢": "廂", +"厣": "厴", +"厦": "廈", +"厨": "廚", +"厩": "廄", +"厮": "廝", +"县": "縣", +"叁": "叄", +"参": "參", +"双": "雙", +"变": "變", +"叙": "敘", +"叠": "疊", +"号": "號", +"叹": "嘆", +"叽": "嘰", +"吓": "嚇", +"吕": "呂", +"吗": "嗎", +"吣": "唚", +"吨": "噸", +"听": "聽", +"吴": "吳", +"呐": "吶", +"呒": "嘸", +"呓": "囈", +"呕": "嘔", +"呖": "嚦", +"呗": "唄", +"员": "員", +"呙": "咼", +"呛": "嗆", +"呜": "嗚", +"咏": "詠", +"咙": "嚨", +"咛": "嚀", +"咝": "噝", +"响": "響", +"哑": "啞", +"哒": "噠", +"哓": "嘵", +"哔": "嗶", +"哕": "噦", +"哗": "嘩", +"哙": "噲", +"哜": "嚌", +"哝": "噥", +"哟": "喲", +"唛": "嘜", +"唝": "嗊", +"唠": "嘮", +"唡": "啢", +"唢": "嗩", +"唤": "喚", +"啧": "嘖", +"啬": "嗇", +"啭": "囀", +"啮": "嚙", +"啴": "嘽", +"啸": "嘯", +"㖞": "喎", +"喷": "噴", +"喽": "嘍", +"喾": "嚳", +"嗫": "囁", +"嗳": "噯", +"嘘": "噓", +"嘤": "嚶", +"嘱": "囑", +"㖊": "噚", +"噜": "嚕", +"嚣": "囂", +"园": "園", +"囱": "囪", +"围": "圍", +"囵": "圇", +"国": "國", +"图": "圖", +"圆": "圓", +"圣": "聖", +"圹": "壙", +"场": "場", +"坂": "阪", +"块": "塊", +"坚": "堅", +"坜": "壢", +"坝": "壩", +"坞": "塢", +"坟": "墳", +"坠": "墜", +"垄": "壟", +"垅": "壠", +"垆": "壚", +"垒": "壘", +"垦": "墾", +"垩": "堊", +"垫": "墊", +"垭": "埡", +"垱": "壋", +"垲": "塏", +"垴": "堖", +"埘": "塒", +"埙": "塤", +"埚": "堝", +"埯": "垵", +"堑": "塹", +"堕": "墮", +"𡒄": "壈", +"壮": "壯", +"声": "聲", +"壶": "壺", +"壸": "壼", +"处": "處", +"备": "備", +"够": "夠", +"头": "頭", +"夸": "誇", +"夹": "夾", +"夺": "奪", +"奁": "奩", +"奂": "奐", +"奋": "奮", +"奥": "奧", +"奸": "姦", +"妆": "妝", +"妇": "婦", +"妈": "媽", +"妩": "嫵", +"妪": "嫗", +"姗": "姍", +"姹": "奼", +"娄": "婁", +"娅": "婭", +"娆": "嬈", +"娇": "嬌", +"娈": "孌", +"娱": "娛", +"娲": "媧", +"娴": "嫻", +"婳": "嫿", +"婴": "嬰", +"婵": "嬋", +"婶": "嬸", +"媪": "媼", +"嫒": "嬡", +"嫔": "嬪", +"嫱": "嬙", +"嬷": "嬤", +"孙": "孫", +"学": "學", +"孪": "孿", +"宝": "寶", +"实": "實", +"宠": "寵", +"审": "審", +"宪": "憲", +"宫": "宮", +"宽": "寬", +"宾": "賓", +"寝": "寢", +"对": "對", +"寻": "尋", +"导": "導", +"寿": "壽", +"将": "將", +"尔": "爾", +"尘": "塵", +"尝": "嘗", +"尧": "堯", +"尴": "尷", +"尸": "屍", +"层": "層", +"屃": "屓", +"屉": "屜", +"届": "屆", +"属": "屬", +"屡": "屢", +"屦": "屨", +"屿": "嶼", +"岁": "歲", +"岂": "豈", +"岖": "嶇", +"岗": "崗", +"岘": "峴", +"岙": "嶴", +"岚": "嵐", +"岛": "島", +"岭": "嶺", +"岽": "崬", +"岿": "巋", +"峄": "嶧", +"峡": "峽", +"峣": "嶢", +"峤": "嶠", +"峥": "崢", +"峦": "巒", +"崂": "嶗", +"崃": "崍", +"崄": "嶮", +"崭": "嶄", +"嵘": "嶸", +"嵚": "嶔", +"嵝": "嶁", +"巅": "巔", +"巩": "鞏", +"巯": "巰", +"币": "幣", +"帅": "帥", +"师": "師", +"帏": "幃", +"帐": "帳", +"帜": "幟", +"带": "帶", +"帧": "幀", +"帮": "幫", +"帱": "幬", +"帻": "幘", +"帼": "幗", +"幂": "冪", +"庄": "莊", +"庆": "慶", +"庐": "廬", +"庑": "廡", +"库": "庫", +"应": "應", +"庙": "廟", +"庞": "龐", +"废": "廢", +"廪": "廩", +"开": "開", +"异": "異", +"弃": "棄", +"弑": "弒", +"张": "張", +"弪": "弳", +"弯": "彎", +"弹": "彈", +"强": "強", +"归": "歸", +"彝": "彞", +"彦": "彥", +"彻": "徹", +"径": "徑", +"徕": "徠", +"忆": "憶", +"忏": "懺", +"忧": "憂", +"忾": "愾", +"怀": "懷", +"态": "態", +"怂": "慫", +"怃": "憮", +"怄": "慪", +"怅": "悵", +"怆": "愴", +"怜": "憐", +"总": "總", +"怼": "懟", +"怿": "懌", +"恋": "戀", +"恒": "恆", +"恳": "懇", +"恸": "慟", +"恹": "懨", +"恺": "愷", +"恻": "惻", +"恼": "惱", +"恽": "惲", +"悦": "悅", +"悬": "懸", +"悭": "慳", +"悮": "悞", +"悯": "憫", +"惊": "驚", +"惧": "懼", +"惨": "慘", +"惩": "懲", +"惫": "憊", +"惬": "愜", +"惭": "慚", +"惮": "憚", +"惯": "慣", +"愠": "慍", +"愤": "憤", +"愦": "憒", +"慑": "懾", +"懑": "懣", +"懒": "懶", +"懔": "懍", +"戆": "戇", +"戋": "戔", +"戏": "戲", +"戗": "戧", +"战": "戰", +"戬": "戩", +"戯": "戱", +"户": "戶", +"扑": "撲", +"执": "執", +"扩": "擴", +"扪": "捫", +"扫": "掃", +"扬": "揚", +"扰": "擾", +"抚": "撫", +"抛": "拋", +"抟": "摶", +"抠": "摳", +"抡": "掄", +"抢": "搶", +"护": "護", +"报": "報", +"拟": "擬", +"拢": "攏", +"拣": "揀", +"拥": "擁", +"拦": "攔", +"拧": "擰", +"拨": "撥", +"择": "擇", +"挂": "掛", +"挚": "摯", +"挛": "攣", +"挜": "掗", +"挝": "撾", +"挞": "撻", +"挟": "挾", +"挠": "撓", +"挡": "擋", +"挢": "撟", +"挣": "掙", +"挤": "擠", +"挥": "揮", +"挦": "撏", +"挽": "輓", +"捝": "挩", +"捞": "撈", +"损": "損", +"捡": "撿", +"换": "換", +"捣": "搗", +"掳": "擄", +"掴": "摑", +"掷": "擲", +"掸": "撣", +"掺": "摻", +"掼": "摜", +"揽": "攬", +"揾": "搵", +"揿": "撳", +"搀": "攙", +"搁": "擱", +"搂": "摟", +"搅": "攪", +"携": "攜", +"摄": "攝", +"摅": "攄", +"摆": "擺", +"摇": "搖", +"摈": "擯", +"摊": "攤", +"撄": "攖", +"撑": "撐", +"㧑": "撝", +"撵": "攆", +"撷": "擷", +"撸": "擼", +"撺": "攛", +"㧟": "擓", +"擞": "擻", +"攒": "攢", +"敌": "敵", +"敛": "斂", +"数": "數", +"斋": "齋", +"斓": "斕", +"斩": "斬", +"断": "斷", +"无": "無", +"旧": "舊", +"时": "時", +"旷": "曠", +"旸": "暘", +"昙": "曇", +"昼": "晝", +"昽": "曨", +"显": "顯", +"晋": "晉", +"晒": "曬", +"晓": "曉", +"晔": "曄", +"晕": "暈", +"晖": "暉", +"暂": "暫", +"暧": "曖", +"机": "機", +"杀": "殺", +"杂": "雜", +"权": "權", +"杆": "桿", +"条": "條", +"来": "來", +"杨": "楊", +"杩": "榪", +"杰": "傑", +"构": "構", +"枞": "樅", +"枢": "樞", +"枣": "棗", +"枥": "櫪", +"枧": "梘", +"枨": "棖", +"枪": "槍", +"枫": "楓", +"枭": "梟", +"柠": "檸", +"柽": "檉", +"栀": "梔", +"栅": "柵", +"标": "標", +"栈": "棧", +"栉": "櫛", +"栊": "櫳", +"栋": "棟", +"栌": "櫨", +"栎": "櫟", +"栏": "欄", +"树": "樹", +"栖": "棲", +"栗": "慄", +"样": "樣", +"栾": "欒", +"桠": "椏", +"桡": "橈", +"桢": "楨", +"档": "檔", +"桤": "榿", +"桥": "橋", +"桦": "樺", +"桧": "檜", +"桨": "槳", +"桩": "樁", +"梦": "夢", +"梼": "檮", +"梾": "棶", +"梿": "槤", +"检": "檢", +"棁": "梲", +"棂": "欞", +"椁": "槨", +"椟": "櫝", +"椠": "槧", +"椤": "欏", +"椭": "橢", +"楼": "樓", +"榄": "欖", +"榅": "榲", +"榇": "櫬", +"榈": "櫚", +"榉": "櫸", +"槚": "檟", +"槛": "檻", +"槟": "檳", +"槠": "櫧", +"横": "橫", +"樯": "檣", +"樱": "櫻", +"橥": "櫫", +"橱": "櫥", +"橹": "櫓", +"橼": "櫞", +"檩": "檁", +"欢": "歡", +"欤": "歟", +"欧": "歐", +"歼": "殲", +"殁": "歿", +"殇": "殤", +"残": "殘", +"殒": "殞", +"殓": "殮", +"殚": "殫", +"殡": "殯", +"㱮": "殨", +"㱩": "殰", +"殴": "毆", +"毁": "毀", +"毂": "轂", +"毕": "畢", +"毙": "斃", +"毡": "氈", +"毵": "毿", +"氇": "氌", +"气": "氣", +"氢": "氫", +"氩": "氬", +"氲": "氳", +"汉": "漢", +"汤": "湯", +"汹": "洶", +"沟": "溝", +"没": "沒", +"沣": "灃", +"沤": "漚", +"沥": "瀝", +"沦": "淪", +"沧": "滄", +"沪": "滬", +"泞": "濘", +"注": "註", +"泪": "淚", +"泶": "澩", +"泷": "瀧", +"泸": "瀘", +"泺": "濼", +"泻": "瀉", +"泼": "潑", +"泽": "澤", +"泾": "涇", +"洁": "潔", +"洒": "灑", +"洼": "窪", +"浃": "浹", +"浅": "淺", +"浆": "漿", +"浇": "澆", +"浈": "湞", +"浊": "濁", +"测": "測", +"浍": "澮", +"济": "濟", +"浏": "瀏", +"浐": "滻", +"浑": "渾", +"浒": "滸", +"浓": "濃", +"浔": "潯", +"涛": "濤", +"涝": "澇", +"涞": "淶", +"涟": "漣", +"涠": "潿", +"涡": "渦", +"涣": "渙", +"涤": "滌", +"润": "潤", +"涧": "澗", +"涨": "漲", +"涩": "澀", +"渊": "淵", +"渌": "淥", +"渍": "漬", +"渎": "瀆", +"渐": "漸", +"渑": "澠", +"渔": "漁", +"渖": "瀋", +"渗": "滲", +"温": "溫", +"湾": "灣", +"湿": "濕", +"溃": "潰", +"溅": "濺", +"溆": "漵", +"滗": "潷", +"滚": "滾", +"滞": "滯", +"滟": "灧", +"滠": "灄", +"满": "滿", +"滢": "瀅", +"滤": "濾", +"滥": "濫", +"滦": "灤", +"滨": "濱", +"滩": "灘", +"滪": "澦", +"漤": "灠", +"潆": "瀠", +"潇": "瀟", +"潋": "瀲", +"潍": "濰", +"潜": "潛", +"潴": "瀦", +"澜": "瀾", +"濑": "瀨", +"濒": "瀕", +"㲿": "瀇", +"灏": "灝", +"灭": "滅", +"灯": "燈", +"灵": "靈", +"灶": "竈", +"灾": "災", +"灿": "燦", +"炀": "煬", +"炉": "爐", +"炖": "燉", +"炜": "煒", +"炝": "熗", +"点": "點", +"炼": "煉", +"炽": "熾", +"烁": "爍", +"烂": "爛", +"烃": "烴", +"烛": "燭", +"烟": "煙", +"烦": "煩", +"烧": "燒", +"烨": "燁", +"烩": "燴", +"烫": "燙", +"烬": "燼", +"热": "熱", +"焕": "煥", +"焖": "燜", +"焘": "燾", +"㶽": "煱", +"煴": "熅", +"㶶": "燶", +"爱": "愛", +"爷": "爺", +"牍": "牘", +"牦": "氂", +"牵": "牽", +"牺": "犧", +"犊": "犢", +"状": "狀", +"犷": "獷", +"犸": "獁", +"犹": "猶", +"狈": "狽", +"狝": "獮", +"狞": "獰", +"独": "獨", +"狭": "狹", +"狮": "獅", +"狯": "獪", +"狰": "猙", +"狱": "獄", +"狲": "猻", +"猃": "獫", +"猎": "獵", +"猕": "獼", +"猡": "玀", +"猪": "豬", +"猫": "貓", +"猬": "蝟", +"献": "獻", +"獭": "獺", +"㺍": "獱", +"玑": "璣", +"玚": "瑒", +"玛": "瑪", +"玮": "瑋", +"环": "環", +"现": "現", +"玱": "瑲", +"玺": "璽", +"珐": "琺", +"珑": "瓏", +"珰": "璫", +"珲": "琿", +"琏": "璉", +"琐": "瑣", +"琼": "瓊", +"瑶": "瑤", +"瑷": "璦", +"璎": "瓔", +"瓒": "瓚", +"瓯": "甌", +"电": "電", +"画": "畫", +"畅": "暢", +"畴": "疇", +"疖": "癤", +"疗": "療", +"疟": "瘧", +"疠": "癘", +"疡": "瘍", +"疬": "癧", +"疭": "瘲", +"疮": "瘡", +"疯": "瘋", +"疱": "皰", +"疴": "痾", +"痈": "癰", +"痉": "痙", +"痒": "癢", +"痖": "瘂", +"痨": "癆", +"痪": "瘓", +"痫": "癇", +"瘅": "癉", +"瘆": "瘮", +"瘗": "瘞", +"瘪": "癟", +"瘫": "癱", +"瘾": "癮", +"瘿": "癭", +"癞": "癩", +"癣": "癬", +"癫": "癲", +"皑": "皚", +"皱": "皺", +"皲": "皸", +"盏": "盞", +"盐": "鹽", +"监": "監", +"盖": "蓋", +"盗": "盜", +"盘": "盤", +"眍": "瞘", +"眦": "眥", +"眬": "矓", +"睁": "睜", +"睐": "睞", +"睑": "瞼", +"瞆": "瞶", +"瞒": "瞞", +"䁖": "瞜", +"瞩": "矚", +"矫": "矯", +"矶": "磯", +"矾": "礬", +"矿": "礦", +"砀": "碭", +"码": "碼", +"砖": "磚", +"砗": "硨", +"砚": "硯", +"砜": "碸", +"砺": "礪", +"砻": "礱", +"砾": "礫", +"础": "礎", +"硁": "硜", +"硕": "碩", +"硖": "硤", +"硗": "磽", +"硙": "磑", +"碍": "礙", +"碛": "磧", +"碜": "磣", +"碱": "鹼", +"礼": "禮", +"祃": "禡", +"祎": "禕", +"祢": "禰", +"祯": "禎", +"祷": "禱", +"祸": "禍", +"禀": "稟", +"禄": "祿", +"禅": "禪", +"离": "離", +"秃": "禿", +"秆": "稈", +"积": "積", +"称": "稱", +"秽": "穢", +"秾": "穠", +"稆": "穭", +"税": "稅", +"䅉": "稏", +"稣": "穌", +"稳": "穩", +"穑": "穡", +"穷": "窮", +"窃": "竊", +"窍": "竅", +"窎": "窵", +"窑": "窯", +"窜": "竄", +"窝": "窩", +"窥": "窺", +"窦": "竇", +"窭": "窶", +"竞": "競", +"笃": "篤", +"笋": "筍", +"笔": "筆", +"笕": "筧", +"笺": "箋", +"笼": "籠", +"笾": "籩", +"筚": "篳", +"筛": "篩", +"筜": "簹", +"筝": "箏", +"䇲": "筴", +"筹": "籌", +"筼": "篔", +"简": "簡", +"箓": "籙", +"箦": "簀", +"箧": "篋", +"箨": "籜", +"箩": "籮", +"箪": "簞", +"箫": "簫", +"篑": "簣", +"篓": "簍", +"篮": "籃", +"篱": "籬", +"簖": "籪", +"籁": "籟", +"籴": "糴", +"类": "類", +"籼": "秈", +"粜": "糶", +"粝": "糲", +"粤": "粵", +"粪": "糞", +"粮": "糧", +"糁": "糝", +"糇": "餱", +"紧": "緊", +"䌷": "紬", +"䌹": "絅", +"絷": "縶", +"䌼": "綐", +"䌽": "綵", +"䌸": "縳", +"䍁": "繸", +"䍀": "繿", +"纟": "糹", +"纠": "糾", +"纡": "紆", +"红": "紅", +"纣": "紂", +"纥": "紇", +"约": "約", +"级": "級", +"纨": "紈", +"纩": "纊", +"纪": "紀", +"纫": "紉", +"纬": "緯", +"纭": "紜", +"纮": "紘", +"纯": "純", +"纰": "紕", +"纱": "紗", +"纲": "綱", +"纳": "納", +"纴": "紝", +"纵": "縱", +"纶": "綸", +"纷": "紛", +"纸": "紙", +"纹": "紋", +"纺": "紡", +"纻": "紵", +"纼": "紖", +"纽": "紐", +"纾": "紓", +"绀": "紺", +"绁": "紲", +"绂": "紱", +"练": "練", +"组": "組", +"绅": "紳", +"细": "細", +"织": "織", +"终": "終", +"绉": "縐", +"绊": "絆", +"绋": "紼", +"绌": "絀", +"绍": "紹", +"绎": "繹", +"经": "經", +"绐": "紿", +"绑": "綁", +"绒": "絨", +"结": "結", +"绔": "絝", +"绕": "繞", +"绖": "絰", +"绗": "絎", +"绘": "繪", +"给": "給", +"绚": "絢", +"绛": "絳", +"络": "絡", +"绞": "絞", +"统": "統", +"绠": "綆", +"绡": "綃", +"绢": "絹", +"绤": "綌", +"绥": "綏", +"继": "繼", +"绨": "綈", +"绩": "績", +"绪": "緒", +"绫": "綾", +"绬": "緓", +"续": "續", +"绮": "綺", +"绯": "緋", +"绰": "綽", +"绲": "緄", +"绳": "繩", +"维": "維", +"绵": "綿", +"绶": "綬", +"绸": "綢", +"绹": "綯", +"绺": "綹", +"绻": "綣", +"综": "綜", +"绽": "綻", +"绾": "綰", +"缀": "綴", +"缁": "緇", +"缂": "緙", +"缃": "緗", +"缄": "緘", +"缅": "緬", +"缆": "纜", +"缇": "緹", +"缈": "緲", +"缉": "緝", +"缊": "縕", +"缋": "繢", +"缌": "緦", +"缍": "綞", +"缎": "緞", +"缏": "緶", +"缑": "緱", +"缒": "縋", +"缓": "緩", +"缔": "締", +"缕": "縷", +"编": "編", +"缗": "緡", +"缘": "緣", +"缙": "縉", +"缚": "縛", +"缛": "縟", +"缜": "縝", +"缝": "縫", +"缞": "縗", +"缟": "縞", +"缠": "纏", +"缡": "縭", +"缢": "縊", +"缣": "縑", +"缤": "繽", +"缥": "縹", +"缦": "縵", +"缧": "縲", +"缨": "纓", +"缩": "縮", +"缪": "繆", +"缫": "繅", +"缬": "纈", +"缭": "繚", +"缮": "繕", +"缯": "繒", +"缱": "繾", +"缲": "繰", +"缳": "繯", +"缴": "繳", +"缵": "纘", +"罂": "罌", +"网": "網", +"罗": "羅", +"罚": "罰", +"罢": "罷", +"罴": "羆", +"羁": "羈", +"羟": "羥", +"翘": "翹", +"耢": "耮", +"耧": "耬", +"耸": "聳", +"耻": "恥", +"聂": "聶", +"聋": "聾", +"职": "職", +"聍": "聹", +"联": "聯", +"聩": "聵", +"聪": "聰", +"肃": "肅", +"肠": "腸", +"肤": "膚", +"肮": "骯", +"肴": "餚", +"肾": "腎", +"肿": "腫", +"胀": "脹", +"胁": "脅", +"胆": "膽", +"胧": "朧", +"胨": "腖", +"胪": "臚", +"胫": "脛", +"胶": "膠", +"脉": "脈", +"脍": "膾", +"脐": "臍", +"脑": "腦", +"脓": "膿", +"脔": "臠", +"脚": "腳", +"脱": "脫", +"脶": "腡", +"脸": "臉", +"腭": "齶", +"腻": "膩", +"腼": "靦", +"腽": "膃", +"腾": "騰", +"膑": "臏", +"臜": "臢", +"舆": "輿", +"舣": "艤", +"舰": "艦", +"舱": "艙", +"舻": "艫", +"艰": "艱", +"艳": "艷", +"艺": "藝", +"节": "節", +"芈": "羋", +"芗": "薌", +"芜": "蕪", +"芦": "蘆", +"苁": "蓯", +"苇": "葦", +"苈": "藶", +"苋": "莧", +"苌": "萇", +"苍": "蒼", +"苎": "苧", +"茎": "莖", +"茏": "蘢", +"茑": "蔦", +"茔": "塋", +"茕": "煢", +"茧": "繭", +"荆": "荊", +"荐": "薦", +"荙": "薘", +"荚": "莢", +"荛": "蕘", +"荜": "蓽", +"荞": "蕎", +"荟": "薈", +"荠": "薺", +"荣": "榮", +"荤": "葷", +"荥": "滎", +"荦": "犖", +"荧": "熒", +"荨": "蕁", +"荩": "藎", +"荪": "蓀", +"荫": "蔭", +"荬": "蕒", +"荭": "葒", +"荮": "葤", +"莅": "蒞", +"莱": "萊", +"莲": "蓮", +"莳": "蒔", +"莴": "萵", +"莶": "薟", +"莸": "蕕", +"莹": "瑩", +"莺": "鶯", +"萝": "蘿", +"萤": "螢", +"营": "營", +"萦": "縈", +"萧": "蕭", +"萨": "薩", +"葱": "蔥", +"蒇": "蕆", +"蒉": "蕢", +"蒋": "蔣", +"蒌": "蔞", +"蓝": "藍", +"蓟": "薊", +"蓠": "蘺", +"蓣": "蕷", +"蓥": "鎣", +"蓦": "驀", +"蔂": "虆", +"蔷": "薔", +"蔹": "蘞", +"蔺": "藺", +"蔼": "藹", +"蕰": "薀", +"蕲": "蘄", +"薮": "藪", +"䓕": "薳", +"藓": "蘚", +"蘖": "櫱", +"虏": "虜", +"虑": "慮", +"虚": "虛", +"虬": "虯", +"虮": "蟣", +"虽": "雖", +"虾": "蝦", +"虿": "蠆", +"蚀": "蝕", +"蚁": "蟻", +"蚂": "螞", +"蚕": "蠶", +"蚬": "蜆", +"蛊": "蠱", +"蛎": "蠣", +"蛏": "蟶", +"蛮": "蠻", +"蛰": "蟄", +"蛱": "蛺", +"蛲": "蟯", +"蛳": "螄", +"蛴": "蠐", +"蜕": "蛻", +"蜗": "蝸", +"蝇": "蠅", +"蝈": "蟈", +"蝉": "蟬", +"蝼": "螻", +"蝾": "蠑", +"螀": "螿", +"螨": "蟎", +"䗖": "螮", +"蟏": "蠨", +"衅": "釁", +"衔": "銜", +"补": "補", +"衬": "襯", +"衮": "袞", +"袄": "襖", +"袅": "裊", +"袆": "褘", +"袜": "襪", +"袭": "襲", +"袯": "襏", +"装": "裝", +"裆": "襠", +"裈": "褌", +"裢": "褳", +"裣": "襝", +"裤": "褲", +"裥": "襇", +"褛": "褸", +"褴": "襤", +"䙓": "襬", +"见": "見", +"观": "觀", +"觃": "覎", +"规": "規", +"觅": "覓", +"视": "視", +"觇": "覘", +"览": "覽", +"觉": "覺", +"觊": "覬", +"觋": "覡", +"觌": "覿", +"觍": "覥", +"觎": "覦", +"觏": "覯", +"觐": "覲", +"觑": "覷", +"觞": "觴", +"触": "觸", +"觯": "觶", +"訚": "誾", +"䜣": "訢", +"誉": "譽", +"誊": "謄", +"䜧": "譅", +"讠": "訁", +"计": "計", +"订": "訂", +"讣": "訃", +"认": "認", +"讥": "譏", +"讦": "訐", +"讧": "訌", +"讨": "討", +"让": "讓", +"讪": "訕", +"讫": "訖", +"讬": "託", +"训": "訓", +"议": "議", +"讯": "訊", +"记": "記", +"讱": "訒", +"讲": "講", +"讳": "諱", +"讴": "謳", +"讵": "詎", +"讶": "訝", +"讷": "訥", +"许": "許", +"讹": "訛", +"论": "論", +"讻": "訩", +"讼": "訟", +"讽": "諷", +"设": "設", +"访": "訪", +"诀": "訣", +"证": "證", +"诂": "詁", +"诃": "訶", +"评": "評", +"诅": "詛", +"识": "識", +"诇": "詗", +"诈": "詐", +"诉": "訴", +"诊": "診", +"诋": "詆", +"诌": "謅", +"词": "詞", +"诎": "詘", +"诏": "詔", +"诐": "詖", +"译": "譯", +"诒": "詒", +"诓": "誆", +"诔": "誄", +"试": "試", +"诖": "詿", +"诗": "詩", +"诘": "詰", +"诙": "詼", +"诚": "誠", +"诛": "誅", +"诜": "詵", +"话": "話", +"诞": "誕", +"诟": "詬", +"诠": "詮", +"诡": "詭", +"询": "詢", +"诣": "詣", +"诤": "諍", +"该": "該", +"详": "詳", +"诧": "詫", +"诨": "諢", +"诩": "詡", +"诪": "譸", +"诫": "誡", +"诬": "誣", +"语": "語", +"诮": "誚", +"误": "誤", +"诰": "誥", +"诱": "誘", +"诲": "誨", +"诳": "誑", +"诵": "誦", +"诶": "誒", +"请": "請", +"诸": "諸", +"诹": "諏", +"诺": "諾", +"读": "讀", +"诼": "諑", +"诽": "誹", +"课": "課", +"诿": "諉", +"谀": "諛", +"谁": "誰", +"谂": "諗", +"调": "調", +"谄": "諂", +"谅": "諒", +"谆": "諄", +"谇": "誶", +"谈": "談", +"谊": "誼", +"谋": "謀", +"谌": "諶", +"谍": "諜", +"谎": "謊", +"谏": "諫", +"谐": "諧", +"谑": "謔", +"谒": "謁", +"谓": "謂", +"谔": "諤", +"谕": "諭", +"谖": "諼", +"谗": "讒", +"谘": "諮", +"谙": "諳", +"谚": "諺", +"谛": "諦", +"谜": "謎", +"谝": "諞", +"谞": "諝", +"谟": "謨", +"谠": "讜", +"谡": "謖", +"谢": "謝", +"谤": "謗", +"谥": "謚", +"谦": "謙", +"谧": "謐", +"谨": "謹", +"谩": "謾", +"谪": "謫", +"谬": "謬", +"谭": "譚", +"谮": "譖", +"谯": "譙", +"谰": "讕", +"谱": "譜", +"谲": "譎", +"谳": "讞", +"谴": "譴", +"谵": "譫", +"谶": "讖", +"豮": "豶", +"䝙": "貙", +"䞐": "賰", +"贝": "貝", +"贞": "貞", +"负": "負", +"贠": "貟", +"贡": "貢", +"财": "財", +"责": "責", +"贤": "賢", +"败": "敗", +"账": "賬", +"货": "貨", +"质": "質", +"贩": "販", +"贪": "貪", +"贫": "貧", +"贬": "貶", +"购": "購", +"贮": "貯", +"贯": "貫", +"贰": "貳", +"贱": "賤", +"贲": "賁", +"贳": "貰", +"贴": "貼", +"贵": "貴", +"贶": "貺", +"贷": "貸", +"贸": "貿", +"费": "費", +"贺": "賀", +"贻": "貽", +"贼": "賊", +"贽": "贄", +"贾": "賈", +"贿": "賄", +"赀": "貲", +"赁": "賃", +"赂": "賂", +"资": "資", +"赅": "賅", +"赆": "贐", +"赇": "賕", +"赈": "賑", +"赉": "賚", +"赊": "賒", +"赋": "賦", +"赌": "賭", +"赎": "贖", +"赏": "賞", +"赐": "賜", +"赑": "贔", +"赒": "賙", +"赓": "賡", +"赔": "賠", +"赕": "賧", +"赖": "賴", +"赗": "賵", +"赘": "贅", +"赙": "賻", +"赚": "賺", +"赛": "賽", +"赜": "賾", +"赞": "贊", +"赟": "贇", +"赠": "贈", +"赡": "贍", +"赢": "贏", +"赣": "贛", +"赪": "赬", +"赵": "趙", +"赶": "趕", +"趋": "趨", +"趱": "趲", +"趸": "躉", +"跃": "躍", +"跄": "蹌", +"跞": "躒", +"践": "踐", +"跶": "躂", +"跷": "蹺", +"跸": "蹕", +"跹": "躚", +"跻": "躋", +"踊": "踴", +"踌": "躊", +"踪": "蹤", +"踬": "躓", +"踯": "躑", +"蹑": "躡", +"蹒": "蹣", +"蹰": "躕", +"蹿": "躥", +"躏": "躪", +"躜": "躦", +"躯": "軀", +"车": "車", +"轧": "軋", +"轨": "軌", +"轩": "軒", +"轪": "軑", +"轫": "軔", +"转": "轉", +"轭": "軛", +"轮": "輪", +"软": "軟", +"轰": "轟", +"轱": "軲", +"轲": "軻", +"轳": "轤", +"轴": "軸", +"轵": "軹", +"轶": "軼", +"轷": "軤", +"轸": "軫", +"轹": "轢", +"轺": "軺", +"轻": "輕", +"轼": "軾", +"载": "載", +"轾": "輊", +"轿": "轎", +"辀": "輈", +"辁": "輇", +"辂": "輅", +"较": "較", +"辄": "輒", +"辅": "輔", +"辆": "輛", +"辇": "輦", +"辈": "輩", +"辉": "輝", +"辊": "輥", +"辋": "輞", +"辌": "輬", +"辍": "輟", +"辎": "輜", +"辏": "輳", +"辐": "輻", +"辑": "輯", +"辒": "轀", +"输": "輸", +"辔": "轡", +"辕": "轅", +"辖": "轄", +"辗": "輾", +"辘": "轆", +"辙": "轍", +"辚": "轔", +"辞": "辭", +"辩": "辯", +"辫": "辮", +"边": "邊", +"辽": "遼", +"达": "達", +"迁": "遷", +"过": "過", +"迈": "邁", +"运": "運", +"还": "還", +"这": "這", +"进": "進", +"远": "遠", +"违": "違", +"连": "連", +"迟": "遲", +"迩": "邇", +"迳": "逕", +"迹": "跡", +"选": "選", +"逊": "遜", +"递": "遞", +"逦": "邐", +"逻": "邏", +"遗": "遺", +"遥": "遙", +"邓": "鄧", +"邝": "鄺", +"邬": "鄔", +"邮": "郵", +"邹": "鄒", +"邺": "鄴", +"邻": "鄰", +"郏": "郟", +"郐": "鄶", +"郑": "鄭", +"郓": "鄆", +"郦": "酈", +"郧": "鄖", +"郸": "鄲", +"酂": "酇", +"酦": "醱", +"酱": "醬", +"酽": "釅", +"酾": "釃", +"酿": "釀", +"释": "釋", +"鉴": "鑒", +"銮": "鑾", +"錾": "鏨", +"𨱏": "鎝", +"钅": "釒", +"钆": "釓", +"钇": "釔", +"针": "針", +"钉": "釘", +"钊": "釗", +"钋": "釙", +"钌": "釕", +"钍": "釷", +"钎": "釺", +"钏": "釧", +"钐": "釤", +"钑": "鈒", +"钒": "釩", +"钓": "釣", +"钔": "鍆", +"钕": "釹", +"钖": "鍚", +"钗": "釵", +"钘": "鈃", +"钙": "鈣", +"钚": "鈈", +"钛": "鈦", +"钜": "鉅", +"钝": "鈍", +"钞": "鈔", +"钠": "鈉", +"钡": "鋇", +"钢": "鋼", +"钣": "鈑", +"钤": "鈐", +"钥": "鑰", +"钦": "欽", +"钧": "鈞", +"钨": "鎢", +"钪": "鈧", +"钫": "鈁", +"钬": "鈥", +"钭": "鈄", +"钮": "鈕", +"钯": "鈀", +"钰": "鈺", +"钱": "錢", +"钲": "鉦", +"钳": "鉗", +"钴": "鈷", +"钶": "鈳", +"钷": "鉕", +"钸": "鈽", +"钹": "鈸", +"钺": "鉞", +"钻": "鑽", +"钼": "鉬", +"钽": "鉭", +"钾": "鉀", +"钿": "鈿", +"铀": "鈾", +"铁": "鐵", +"铂": "鉑", +"铃": "鈴", +"铄": "鑠", +"铅": "鉛", +"铆": "鉚", +"铇": "鉋", +"铈": "鈰", +"铉": "鉉", +"铊": "鉈", +"铋": "鉍", +"铌": "鈮", +"铍": "鈹", +"铎": "鐸", +"铏": "鉶", +"铐": "銬", +"铑": "銠", +"铒": "鉺", +"铓": "鋩", +"铔": "錏", +"铕": "銪", +"铖": "鋮", +"铗": "鋏", +"铘": "鋣", +"铙": "鐃", +"铚": "銍", +"铛": "鐺", +"铜": "銅", +"铝": "鋁", +"铞": "銱", +"铟": "銦", +"铠": "鎧", +"铡": "鍘", +"铢": "銖", +"铣": "銑", +"铤": "鋌", +"铥": "銩", +"铦": "銛", +"铧": "鏵", +"铨": "銓", +"铩": "鎩", +"铪": "鉿", +"铫": "銚", +"铬": "鉻", +"铭": "銘", +"铮": "錚", +"铯": "銫", +"铰": "鉸", +"铱": "銥", +"铲": "鏟", +"铳": "銃", +"铴": "鐋", +"铵": "銨", +"银": "銀", +"铷": "銣", +"铸": "鑄", +"铹": "鐒", +"铺": "鋪", +"铻": "鋙", +"铼": "錸", +"铽": "鋱", +"链": "鏈", +"铿": "鏗", +"销": "銷", +"锁": "鎖", +"锂": "鋰", +"锃": "鋥", +"锄": "鋤", +"锅": "鍋", +"锆": "鋯", +"锇": "鋨", +"锉": "銼", +"锊": "鋝", +"锋": "鋒", +"锌": "鋅", +"锍": "鋶", +"锎": "鐦", +"锏": "鐧", +"锑": "銻", +"锒": "鋃", +"锓": "鋟", +"锔": "鋦", +"锕": "錒", +"锖": "錆", +"锗": "鍺", +"锘": "鍩", +"错": "錯", +"锚": "錨", +"锛": "錛", +"锜": "錡", +"锝": "鍀", +"锞": "錁", +"锟": "錕", +"锠": "錩", +"锡": "錫", +"锢": "錮", +"锣": "鑼", +"锥": "錐", +"锦": "錦", +"锧": "鑕", +"锩": "錈", +"锪": "鍃", +"锫": "錇", +"锬": "錟", +"锭": "錠", +"键": "鍵", +"锯": "鋸", +"锰": "錳", +"锱": "錙", +"锲": "鍥", +"锳": "鍈", +"锴": "鍇", +"锵": "鏘", +"锶": "鍶", +"锷": "鍔", +"锸": "鍤", +"锹": "鍬", +"锺": "鍾", +"锻": "鍛", +"锼": "鎪", +"锽": "鍠", +"锾": "鍰", +"锿": "鎄", +"镀": "鍍", +"镁": "鎂", +"镂": "鏤", +"镃": "鎡", +"镄": "鐨", +"镅": "鎇", +"镆": "鏌", +"镇": "鎮", +"镈": "鎛", +"镉": "鎘", +"镊": "鑷", +"镋": "鎲", +"镍": "鎳", +"镎": "鎿", +"镏": "鎦", +"镐": "鎬", +"镑": "鎊", +"镒": "鎰", +"镓": "鎵", +"镔": "鑌", +"镕": "鎔", +"镖": "鏢", +"镗": "鏜", +"镘": "鏝", +"镙": "鏍", +"镚": "鏰", +"镛": "鏞", +"镜": "鏡", +"镝": "鏑", +"镞": "鏃", +"镟": "鏇", +"镠": "鏐", +"镡": "鐔", +"镣": "鐐", +"镤": "鏷", +"镥": "鑥", +"镦": "鐓", +"镧": "鑭", +"镨": "鐠", +"镩": "鑹", +"镪": "鏹", +"镫": "鐙", +"镬": "鑊", +"镭": "鐳", +"镮": "鐶", +"镯": "鐲", +"镰": "鐮", +"镱": "鐿", +"镲": "鑔", +"镳": "鑣", +"镴": "鑞", +"镵": "鑱", +"镶": "鑲", +"长": "長", +"门": "門", +"闩": "閂", +"闪": "閃", +"闫": "閆", +"闬": "閈", +"闭": "閉", +"问": "問", +"闯": "闖", +"闰": "閏", +"闱": "闈", +"闲": "閑", +"闳": "閎", +"间": "間", +"闵": "閔", +"闶": "閌", +"闷": "悶", +"闸": "閘", +"闹": "鬧", +"闺": "閨", +"闻": "聞", +"闼": "闥", +"闽": "閩", +"闾": "閭", +"闿": "闓", +"阀": "閥", +"阁": "閣", +"阂": "閡", +"阃": "閫", +"阄": "鬮", +"阆": "閬", +"阇": "闍", +"阈": "閾", +"阉": "閹", +"阊": "閶", +"阋": "鬩", +"阌": "閿", +"阍": "閽", +"阎": "閻", +"阏": "閼", +"阐": "闡", +"阑": "闌", +"阒": "闃", +"阓": "闠", +"阔": "闊", +"阕": "闋", +"阖": "闔", +"阗": "闐", +"阘": "闒", +"阙": "闕", +"阚": "闞", +"阛": "闤", +"队": "隊", +"阳": "陽", +"阴": "陰", +"阵": "陣", +"阶": "階", +"际": "際", +"陆": "陸", +"陇": "隴", +"陈": "陳", +"陉": "陘", +"陕": "陝", +"陧": "隉", +"陨": "隕", +"险": "險", +"随": "隨", +"隐": "隱", +"隶": "隸", +"隽": "雋", +"难": "難", +"雏": "雛", +"雠": "讎", +"雳": "靂", +"雾": "霧", +"霁": "霽", +"霡": "霢", +"霭": "靄", +"靓": "靚", +"静": "靜", +"靥": "靨", +"䩄": "靦", +"鞑": "韃", +"鞒": "鞽", +"鞯": "韉", +"韦": "韋", +"韧": "韌", +"韨": "韍", +"韩": "韓", +"韪": "韙", +"韫": "韞", +"韬": "韜", +"韵": "韻", +"页": "頁", +"顶": "頂", +"顷": "頃", +"顸": "頇", +"项": "項", +"顺": "順", +"顼": "頊", +"顽": "頑", +"顾": "顧", +"顿": "頓", +"颀": "頎", +"颁": "頒", +"颂": "頌", +"颃": "頏", +"预": "預", +"颅": "顱", +"领": "領", +"颇": "頗", +"颈": "頸", +"颉": "頡", +"颊": "頰", +"颋": "頲", +"颌": "頜", +"颍": "潁", +"颎": "熲", +"颏": "頦", +"颐": "頤", +"频": "頻", +"颒": "頮", +"颔": "頷", +"颕": "頴", +"颖": "穎", +"颗": "顆", +"题": "題", +"颙": "顒", +"颚": "顎", +"颛": "顓", +"额": "額", +"颞": "顳", +"颟": "顢", +"颠": "顛", +"颡": "顙", +"颢": "顥", +"颤": "顫", +"颥": "顬", +"颦": "顰", +"颧": "顴", +"风": "風", +"飏": "颺", +"飐": "颭", +"飑": "颮", +"飒": "颯", +"飓": "颶", +"飔": "颸", +"飕": "颼", +"飖": "颻", +"飗": "飀", +"飘": "飄", +"飙": "飆", +"飚": "飈", +"飞": "飛", +"飨": "饗", +"餍": "饜", +"饣": "飠", +"饤": "飣", +"饦": "飥", +"饧": "餳", +"饨": "飩", +"饩": "餼", +"饪": "飪", +"饫": "飫", +"饬": "飭", +"饭": "飯", +"饮": "飲", +"饯": "餞", +"饰": "飾", +"饱": "飽", +"饲": "飼", +"饳": "飿", +"饴": "飴", +"饵": "餌", +"饶": "饒", +"饷": "餉", +"饸": "餄", +"饹": "餎", +"饺": "餃", +"饻": "餏", +"饼": "餅", +"饽": "餑", +"饾": "餖", +"饿": "餓", +"馀": "餘", +"馁": "餒", +"馂": "餕", +"馃": "餜", +"馄": "餛", +"馅": "餡", +"馆": "館", +"馇": "餷", +"馈": "饋", +"馉": "餶", +"馊": "餿", +"馋": "饞", +"馌": "饁", +"馍": "饃", +"馎": "餺", +"馏": "餾", +"馐": "饈", +"馑": "饉", +"馒": "饅", +"馓": "饊", +"馔": "饌", +"馕": "饢", +"䯄": "騧", +"马": "馬", +"驭": "馭", +"驮": "馱", +"驯": "馴", +"驰": "馳", +"驱": "驅", +"驲": "馹", +"驳": "駁", +"驴": "驢", +"驵": "駔", +"驶": "駛", +"驷": "駟", +"驸": "駙", +"驹": "駒", +"驺": "騶", +"驻": "駐", +"驼": "駝", +"驽": "駑", +"驾": "駕", +"驿": "驛", +"骀": "駘", +"骁": "驍", +"骃": "駰", +"骄": "驕", +"骅": "驊", +"骆": "駱", +"骇": "駭", +"骈": "駢", +"骉": "驫", +"骊": "驪", +"骋": "騁", +"验": "驗", +"骍": "騂", +"骎": "駸", +"骏": "駿", +"骐": "騏", +"骑": "騎", +"骒": "騍", +"骓": "騅", +"骔": "騌", +"骕": "驌", +"骖": "驂", +"骗": "騙", +"骘": "騭", +"骙": "騤", +"骚": "騷", +"骛": "騖", +"骜": "驁", +"骝": "騮", +"骞": "騫", +"骟": "騸", +"骠": "驃", +"骡": "騾", +"骢": "驄", +"骣": "驏", +"骤": "驟", +"骥": "驥", +"骦": "驦", +"骧": "驤", +"髅": "髏", +"髋": "髖", +"髌": "髕", +"鬓": "鬢", +"魇": "魘", +"魉": "魎", +"鱼": "魚", +"鱽": "魛", +"鱾": "魢", +"鱿": "魷", +"鲀": "魨", +"鲁": "魯", +"鲂": "魴", +"鲃": "䰾", +"鲄": "魺", +"鲅": "鮁", +"鲆": "鮃", +"鲈": "鱸", +"鲉": "鮋", +"鲊": "鮓", +"鲋": "鮒", +"鲌": "鮊", +"鲍": "鮑", +"鲎": "鱟", +"鲏": "鮍", +"鲐": "鮐", +"鲑": "鮭", +"鲒": "鮚", +"鲓": "鮳", +"鲔": "鮪", +"鲕": "鮞", +"鲖": "鮦", +"鲗": "鰂", +"鲘": "鮜", +"鲙": "鱠", +"鲚": "鱭", +"鲛": "鮫", +"鲜": "鮮", +"鲝": "鮺", +"鲟": "鱘", +"鲠": "鯁", +"鲡": "鱺", +"鲢": "鰱", +"鲣": "鰹", +"鲤": "鯉", +"鲥": "鰣", +"鲦": "鰷", +"鲧": "鯀", +"鲨": "鯊", +"鲩": "鯇", +"鲪": "鮶", +"鲫": "鯽", +"鲬": "鯒", +"鲭": "鯖", +"鲮": "鯪", +"鲯": "鯕", +"鲰": "鯫", +"鲱": "鯡", +"鲲": "鯤", +"鲳": "鯧", +"鲴": "鯝", +"鲵": "鯢", +"鲶": "鯰", +"鲷": "鯛", +"鲸": "鯨", +"鲹": "鰺", +"鲺": "鯴", +"鲻": "鯔", +"鲼": "鱝", +"鲽": "鰈", +"鲾": "鰏", +"鲿": "鱨", +"鳀": "鯷", +"鳁": "鰮", +"鳂": "鰃", +"鳃": "鰓", +"鳅": "鰍", +"鳆": "鰒", +"鳇": "鰉", +"鳈": "鰁", +"鳉": "鱂", +"鳊": "鯿", +"鳋": "鰠", +"鳌": "鰲", +"鳍": "鰭", +"鳎": "鰨", +"鳏": "鰥", +"鳐": "鰩", +"鳑": "鰟", +"鳒": "鰜", +"鳓": "鰳", +"鳔": "鰾", +"鳕": "鱈", +"鳖": "鱉", +"鳗": "鰻", +"鳘": "鰵", +"鳙": "鱅", +"鳚": "䲁", +"鳛": "鰼", +"鳜": "鱖", +"鳝": "鱔", +"鳞": "鱗", +"鳟": "鱒", +"鳠": "鱯", +"鳡": "鱤", +"鳢": "鱧", +"鳣": "鱣", +"䴓": "鳾", +"䴕": "鴷", +"䴔": "鵁", +"䴖": "鶄", +"䴗": "鶪", +"䴘": "鷈", +"䴙": "鷿", +"㶉": "鸂", +"鸟": "鳥", +"鸠": "鳩", +"鸢": "鳶", +"鸣": "鳴", +"鸤": "鳲", +"鸥": "鷗", +"鸦": "鴉", +"鸧": "鶬", +"鸨": "鴇", +"鸩": "鴆", +"鸪": "鴣", +"鸫": "鶇", +"鸬": "鸕", +"鸭": "鴨", +"鸮": "鴞", +"鸯": "鴦", +"鸰": "鴒", +"鸱": "鴟", +"鸲": "鴝", +"鸳": "鴛", +"鸴": "鷽", +"鸵": "鴕", +"鸶": "鷥", +"鸷": "鷙", +"鸸": "鴯", +"鸹": "鴰", +"鸺": "鵂", +"鸻": "鴴", +"鸼": "鵃", +"鸽": "鴿", +"鸾": "鸞", +"鸿": "鴻", +"鹀": "鵐", +"鹁": "鵓", +"鹂": "鸝", +"鹃": "鵑", +"鹄": "鵠", +"鹅": "鵝", +"鹆": "鵒", +"鹇": "鷳", +"鹈": "鵜", +"鹉": "鵡", +"鹊": "鵲", +"鹋": "鶓", +"鹌": "鵪", +"鹍": "鵾", +"鹎": "鵯", +"鹏": "鵬", +"鹐": "鵮", +"鹑": "鶉", +"鹒": "鶊", +"鹓": "鵷", +"鹔": "鷫", +"鹕": "鶘", +"鹖": "鶡", +"鹗": "鶚", +"鹘": "鶻", +"鹙": "鶖", +"鹛": "鶥", +"鹜": "鶩", +"鹝": "鷊", +"鹞": "鷂", +"鹟": "鶲", +"鹠": "鶹", +"鹡": "鶺", +"鹢": "鷁", +"鹣": "鶼", +"鹤": "鶴", +"鹥": "鷖", +"鹦": "鸚", +"鹧": "鷓", +"鹨": "鷚", +"鹩": "鷯", +"鹪": "鷦", +"鹫": "鷲", +"鹬": "鷸", +"鹭": "鷺", +"鹯": "鸇", +"鹰": "鷹", +"鹱": "鸌", +"鹲": "鸏", +"鹳": "鸛", +"鹴": "鸘", +"鹾": "鹺", +"麦": "麥", +"麸": "麩", +"黄": "黃", +"黉": "黌", +"黡": "黶", +"黩": "黷", +"黪": "黲", +"黾": "黽", +"鼋": "黿", +"鼍": "鼉", +"鼗": "鞀", +"鼹": "鼴", +"齐": "齊", +"齑": "齏", +"齿": "齒", +"龀": "齔", +"龁": "齕", +"龂": "齗", +"龃": "齟", +"龄": "齡", +"龅": "齙", +"龆": "齠", +"龇": "齜", +"龈": "齦", +"龉": "齬", +"龊": "齪", +"龋": "齲", +"龌": "齷", +"龙": "龍", +"龚": "龔", +"龛": "龕", +"龟": "龜", +"一伙": "一伙", +"一并": "一併", +"一准": "一准", +"一划": "一划", +"一地里": "一地裡", +"一干": "一干", +"一树百获": "一樹百穫", +"一台": "一臺", +"一冲": "一衝", +"一只": "一隻", +"一发千钧": "一髮千鈞", +"一出": "一齣", +"七只": "七隻", +"三元里": "三元裡", +"三国志": "三國誌", +"三复": "三複", +"三只": "三隻", +"上吊": "上吊", +"上台": "上臺", +"下不了台": "下不了臺", +"下台": "下臺", +"下面": "下麵", +"不准": "不准", +"不吊": "不吊", +"不知就里": "不知就裡", +"不知所云": "不知所云", +"不锈钢": "不鏽鋼", +"丑剧": "丑劇", +"丑旦": "丑旦", +"丑角": "丑角", +"并存着": "並存著", +"中岳": "中嶽", +"中台医专": "中臺醫專", +"丰南": "丰南", +"丰台": "丰台", +"丰姿": "丰姿", +"丰采": "丰采", +"丰韵": "丰韻", +"主干": "主幹", +"么么唱唱": "么么唱唱", +"么儿": "么兒", +"么喝": "么喝", +"么妹": "么妹", +"么弟": "么弟", +"么爷": "么爺", +"九世之雠": "九世之讎", +"九只": "九隻", +"干丝": "乾絲", +"干着急": "乾著急", +"乱发": "亂髮", +"云云": "云云", +"云尔": "云爾", +"五岳": "五嶽", +"五斗柜": "五斗櫃", +"五斗橱": "五斗櫥", +"五谷": "五穀", +"五行生克": "五行生剋", +"五只": "五隻", +"五出": "五齣", +"交卷": "交卷", +"人云亦云": "人云亦云", +"人物志": "人物誌", +"什锦面": "什錦麵", +"什么": "什麼", +"仆倒": "仆倒", +"介系词": "介係詞", +"介系词": "介繫詞", +"仿制": "仿製", +"伙伕": "伙伕", +"伙伴": "伙伴", +"伙同": "伙同", +"伙夫": "伙夫", +"伙房": "伙房", +"伙计": "伙計", +"伙食": "伙食", +"布下": "佈下", +"布告": "佈告", +"布哨": "佈哨", +"布局": "佈局", +"布岗": "佈崗", +"布施": "佈施", +"布景": "佈景", +"布满": "佈滿", +"布线": "佈線", +"布置": "佈置", +"布署": "佈署", +"布道": "佈道", +"布达": "佈達", +"布防": "佈防", +"布阵": "佈陣", +"布雷": "佈雷", +"体育锻鍊": "体育鍛鍊", +"何干": "何干", +"作准": "作准", +"佣人": "佣人", +"佣工": "佣工", +"佣金": "佣金", +"并入": "併入", +"并列": "併列", +"并到": "併到", +"并合": "併合", +"并吞": "併吞", +"并在": "併在", +"并成": "併成", +"并排": "併排", +"并拢": "併攏", +"并案": "併案", +"并为": "併為", +"并发": "併發", +"并科": "併科", +"并购": "併購", +"并进": "併進", +"来复": "來複", +"供制": "供製", +"依依不舍": "依依不捨", +"侵并": "侵併", +"便辟": "便辟", +"系数": "係數", +"系为": "係為", +"保险柜": "保險柜", +"信号台": "信號臺", +"修复": "修複", +"修胡刀": "修鬍刀", +"俯冲": "俯衝", +"个里": "個裡", +"借着": "借著", +"假发": "假髮", +"停制": "停製", +"偷鸡不着": "偷雞不著", +"家伙": "傢伙", +"家俱": "傢俱", +"家具": "傢具", +"传布": "傳佈", +"债台高筑": "債臺高築", +"傻里傻气": "傻裡傻氣", +"倾家荡产": "傾家蕩產", +"倾覆": "傾複", +"倾覆": "傾覆", +"僱佣": "僱佣", +"仪表": "儀錶", +"亿只": "億隻", +"尽尽": "儘儘", +"尽先": "儘先", +"尽其所有": "儘其所有", +"尽力": "儘力", +"尽快": "儘快", +"尽早": "儘早", +"尽是": "儘是", +"尽管": "儘管", +"尽速": "儘速", +"尽量": "儘量", +"允准": "允准", +"兄台": "兄臺", +"充饥": "充饑", +"光采": "光采", +"克里": "克裡", +"克复": "克複", +"入伙": "入伙", +"内制": "內製", +"两只": "兩隻", +"八字胡": "八字鬍", +"八只": "八隻", +"公布": "公佈", +"公干": "公幹", +"公斗": "公斗", +"公历": "公曆", +"六只": "六隻", +"六出": "六齣", +"兼并": "兼併", +"冤雠": "冤讎", +"准予": "准予", +"准假": "准假", +"准将": "准將", +"准考证": "准考證", +"准许": "准許", +"几几": "几几", +"几案": "几案", +"几丝": "几絲", +"凹洞里": "凹洞裡", +"出征": "出征", +"出锤": "出鎚", +"刀削面": "刀削麵", +"刁斗": "刁斗", +"分布": "分佈", +"切面": "切麵", +"刊布": "刊佈", +"划上": "划上", +"划下": "划下", +"划不来": "划不來", +"划了": "划了", +"划具": "划具", +"划出": "划出", +"划到": "划到", +"划动": "划動", +"划去": "划去", +"划子": "划子", +"划得来": "划得來", +"划拳": "划拳", +"划桨": "划槳", +"划水": "划水", +"划算": "划算", +"划船": "划船", +"划艇": "划艇", +"划着": "划著", +"划着走": "划著走", +"划行": "划行", +"划走": "划走", +"划起": "划起", +"划进": "划進", +"划过": "划過", +"初征": "初征", +"别致": "別緻", +"别着": "別著", +"别只": "別隻", +"利比里亚": "利比裡亞", +"刮着": "刮著", +"刮胡刀": "刮鬍刀", +"剃发": "剃髮", +"剃须": "剃鬚", +"削发": "削髮", +"克制": "剋制", +"克星": "剋星", +"克服": "剋服", +"克死": "剋死", +"克薄": "剋薄", +"前仆后继": "前仆後繼", +"前台": "前臺", +"前车之复": "前車之覆", +"刚才": "剛纔", +"剪发": "剪髮", +"割舍": "割捨", +"创制": "創製", +"加里宁": "加裡寧", +"动荡": "動蕩", +"劳力士表": "勞力士錶", +"包准": "包准", +"包谷": "包穀", +"北斗": "北斗", +"北回": "北迴", +"匡复": "匡複", +"匪干": "匪幹", +"十卷": "十卷", +"十台": "十臺", +"十只": "十隻", +"十出": "十齣", +"千丝万缕": "千絲萬縷", +"千回百折": "千迴百折", +"千回百转": "千迴百轉", +"千钧一发": "千鈞一髮", +"千只": "千隻", +"升斗小民": "升斗小民", +"半只": "半隻", +"南岳": "南嶽", +"南征": "南征", +"南台": "南臺", +"南回": "南迴", +"卡里": "卡裡", +"印制": "印製", +"卷入": "卷入", +"卷取": "卷取", +"卷土重来": "卷土重來", +"卷子": "卷子", +"卷宗": "卷宗", +"卷尺": "卷尺", +"卷层云": "卷層雲", +"卷帙": "卷帙", +"卷扬机": "卷揚機", +"卷曲": "卷曲", +"卷染": "卷染", +"卷烟": "卷煙", +"卷筒": "卷筒", +"卷纬": "卷緯", +"卷绕": "卷繞", +"卷装": "卷裝", +"卷轴": "卷軸", +"卷云": "卷雲", +"卷领": "卷領", +"卷发": "卷髮", +"卷须": "卷鬚", +"参与": "參与", +"参与者": "參与者", +"参合": "參合", +"参考价值": "參考價值", +"参与": "參與", +"参与人员": "參與人員", +"参与制": "參與制", +"参与感": "參與感", +"参与者": "參與者", +"参观团": "參觀團", +"参观团体": "參觀團體", +"参阅": "參閱", +"反冲": "反衝", +"反复": "反複", +"反复": "反覆", +"取舍": "取捨", +"口里": "口裡", +"只准": "只准", +"只冲": "只衝", +"叮当": "叮噹", +"可怜虫": "可憐虫", +"可紧可松": "可緊可鬆", +"台制": "台製", +"司令台": "司令臺", +"吃着不尽": "吃著不盡", +"吃里扒外": "吃裡扒外", +"吃里爬外": "吃裡爬外", +"各吊": "各吊", +"合伙": "合伙", +"合并": "合併", +"吊上": "吊上", +"吊下": "吊下", +"吊了": "吊了", +"吊个": "吊個", +"吊儿郎当": "吊兒郎當", +"吊到": "吊到", +"吊去": "吊去", +"吊取": "吊取", +"吊吊": "吊吊", +"吊嗓": "吊嗓", +"吊好": "吊好", +"吊子": "吊子", +"吊带": "吊帶", +"吊带裤": "吊帶褲", +"吊床": "吊床", +"吊得": "吊得", +"吊挂": "吊掛", +"吊挂着": "吊掛著", +"吊杆": "吊杆", +"吊架": "吊架", +"吊桶": "吊桶", +"吊杆": "吊桿", +"吊桥": "吊橋", +"吊死": "吊死", +"吊灯": "吊燈", +"吊环": "吊環", +"吊盘": "吊盤", +"吊索": "吊索", +"吊着": "吊著", +"吊装": "吊裝", +"吊裤": "吊褲", +"吊裤带": "吊褲帶", +"吊袜": "吊襪", +"吊走": "吊走", +"吊起": "吊起", +"吊车": "吊車", +"吊钩": "吊鉤", +"吊销": "吊銷", +"吊钟": "吊鐘", +"同伙": "同伙", +"名表": "名錶", +"后冠": "后冠", +"后土": "后土", +"后妃": "后妃", +"后座": "后座", +"后稷": "后稷", +"后羿": "后羿", +"后里": "后里", +"向着": "向著", +"吞并": "吞併", +"吹发": "吹髮", +"吕后": "呂后", +"獃里獃气": "呆裡呆氣", +"周而复始": "周而複始", +"呼吁": "呼籲", +"和面": "和麵", +"哪里": "哪裡", +"哭脏": "哭髒", +"问卷": "問卷", +"喝采": "喝采", +"单干": "單干", +"单只": "單隻", +"嘴里": "嘴裡", +"恶心": "噁心", +"当啷": "噹啷", +"当当": "噹噹", +"噜苏": "嚕囌", +"向导": "嚮導", +"向往": "嚮往", +"向应": "嚮應", +"向日": "嚮日", +"向迩": "嚮邇", +"严丝合缝": "嚴絲合縫", +"严复": "嚴複", +"四舍五入": "四捨五入", +"四只": "四隻", +"四出": "四齣", +"回丝": "回絲", +"回着": "回著", +"回荡": "回蕩", +"回复": "回覆", +"回采": "回采", +"圈子里": "圈子裡", +"圈里": "圈裡", +"国历": "國曆", +"国雠": "國讎", +"园里": "園裡", +"图里": "圖裡", +"土里": "土裡", +"土制": "土製", +"地志": "地誌", +"坍台": "坍臺", +"坑里": "坑裡", +"坦荡": "坦蕩", +"垂发": "垂髮", +"垮台": "垮臺", +"埋布": "埋佈", +"城里": "城裡", +"基干": "基幹", +"报复": "報複", +"塌台": "塌臺", +"塔台": "塔臺", +"涂着": "塗著", +"墓志": "墓誌", +"墨斗": "墨斗", +"墨索里尼": "墨索裡尼", +"垦复": "墾複", +"垄断价格": "壟斷價格", +"垄断资产": "壟斷資產", +"垄断集团": "壟斷集團", +"壶里": "壺裡", +"寿面": "壽麵", +"夏天里": "夏天裡", +"夏历": "夏曆", +"外制": "外製", +"多冲": "多衝", +"多采多姿": "多采多姿", +"多么": "多麼", +"夜光表": "夜光錶", +"夜里": "夜裡", +"梦里": "夢裡", +"大伙": "大伙", +"大卷": "大卷", +"大干": "大干", +"大干": "大幹", +"大锤": "大鎚", +"大只": "大隻", +"天后": "天后", +"天干": "天干", +"天文台": "天文臺", +"太后": "太后", +"奏折": "奏摺", +"女丑": "女丑", +"女佣": "女佣", +"好家夥": "好傢夥", +"好戏连台": "好戲連臺", +"如法泡制": "如法泡製", +"妆台": "妝臺", +"姜太公": "姜太公", +"姜子牙": "姜子牙", +"姜丝": "姜絲", +"字汇": "字彙", +"字里行间": "字裡行間", +"存折": "存摺", +"孟姜女": "孟姜女", +"宇宙志": "宇宙誌", +"定准": "定准", +"定制": "定製", +"宣布": "宣佈", +"宫里": "宮裡", +"家伙": "家伙", +"家里": "家裡", +"密布": "密佈", +"寇雠": "寇讎", +"实干": "實幹", +"写字台": "寫字檯", +"写字台": "寫字臺", +"宽松": "寬鬆", +"封面里": "封面裡", +"射干": "射干", +"对表": "對錶", +"小丑": "小丑", +"小伙": "小伙", +"小只": "小隻", +"少吊": "少吊", +"尺布斗粟": "尺布斗粟", +"尼克松": "尼克鬆", +"尼采": "尼采", +"尿斗": "尿斗", +"局里": "局裡", +"居里": "居裡", +"屋子里": "屋子裡", +"屋里": "屋裡", +"展布": "展佈", +"屡仆屡起": "屢仆屢起", +"屯里": "屯裡", +"山岳": "山嶽", +"山里": "山裡", +"峰回": "峰迴", +"巡回": "巡迴", +"巧干": "巧幹", +"巴尔干": "巴爾幹", +"巴里": "巴裡", +"巷里": "巷裡", +"市里": "市裡", +"布谷": "布穀", +"希腊": "希腊", +"帘子": "帘子", +"帘布": "帘布", +"席卷": "席卷", +"带团参加": "帶團參加", +"带发修行": "帶髮修行", +"干休": "干休", +"干系": "干係", +"干卿何事": "干卿何事", +"干将": "干將", +"干戈": "干戈", +"干挠": "干撓", +"干扰": "干擾", +"干支": "干支", +"干政": "干政", +"干时": "干時", +"干涉": "干涉", +"干犯": "干犯", +"干与": "干與", +"干着急": "干著急", +"干贝": "干貝", +"干预": "干預", +"平台": "平臺", +"年历": "年曆", +"年里": "年裡", +"干上": "幹上", +"干下去": "幹下去", +"干了": "幹了", +"干事": "幹事", +"干些": "幹些", +"干个": "幹個", +"干劲": "幹勁", +"干员": "幹員", +"干吗": "幹嗎", +"干嘛": "幹嘛", +"干坏事": "幹壞事", +"干完": "幹完", +"干得": "幹得", +"干性油": "幹性油", +"干才": "幹才", +"干掉": "幹掉", +"干校": "幹校", +"干活": "幹活", +"干流": "幹流", +"干球温度": "幹球溫度", +"干线": "幹線", +"干练": "幹練", +"干警": "幹警", +"干起来": "幹起來", +"干路": "幹路", +"干道": "幹道", +"干部": "幹部", +"干么": "幹麼", +"几丝": "幾絲", +"几只": "幾隻", +"几出": "幾齣", +"底里": "底裡", +"康采恩": "康采恩", +"庙里": "廟裡", +"建台": "建臺", +"弄脏": "弄髒", +"弔卷": "弔卷", +"弘历": "弘曆", +"别扭": "彆扭", +"别拗": "彆拗", +"别气": "彆氣", +"别脚": "彆腳", +"别着": "彆著", +"弹子台": "彈子檯", +"弹药": "彈葯", +"汇报": "彙報", +"汇整": "彙整", +"汇编": "彙編", +"汇总": "彙總", +"汇纂": "彙纂", +"汇辑": "彙輯", +"汇集": "彙集", +"形单影只": "形單影隻", +"影后": "影后", +"往里": "往裡", +"往复": "往複", +"征伐": "征伐", +"征兵": "征兵", +"征尘": "征塵", +"征夫": "征夫", +"征战": "征戰", +"征收": "征收", +"征服": "征服", +"征求": "征求", +"征发": "征發", +"征衣": "征衣", +"征讨": "征討", +"征途": "征途", +"后台": "後臺", +"从里到外": "從裡到外", +"从里向外": "從裡向外", +"复雠": "復讎", +"复辟": "復辟", +"德干高原": "德干高原", +"心愿": "心愿", +"心荡神驰": "心蕩神馳", +"心里": "心裡", +"忙里": "忙裡", +"快干": "快幹", +"快冲": "快衝", +"怎么": "怎麼", +"怎么着": "怎麼著", +"怒发冲冠": "怒髮衝冠", +"急冲而下": "急衝而下", +"怪里怪气": "怪裡怪氣", +"恩准": "恩准", +"情有所钟": "情有所鍾", +"意面": "意麵", +"慌里慌张": "慌裡慌張", +"慰借": "慰藉", +"忧郁": "憂郁", +"凭吊": "憑吊", +"凭借": "憑藉", +"凭借着": "憑藉著", +"蒙懂": "懞懂", +"怀里": "懷裡", +"怀表": "懷錶", +"悬吊": "懸吊", +"恋恋不舍": "戀戀不捨", +"戏台": "戲臺", +"戴表": "戴錶", +"戽斗": "戽斗", +"房里": "房裡", +"手不释卷": "手不釋卷", +"手卷": "手卷", +"手折": "手摺", +"手里": "手裡", +"手表": "手錶", +"手松": "手鬆", +"才干": "才幹", +"才高八斗": "才高八斗", +"打谷": "打穀", +"扞御": "扞禦", +"批准": "批准", +"批复": "批複", +"批复": "批覆", +"承制": "承製", +"抗御": "抗禦", +"折冲": "折衝", +"披复": "披覆", +"披发": "披髮", +"抱朴": "抱朴", +"抵御": "抵禦", +"拆伙": "拆伙", +"拆台": "拆臺", +"拈须": "拈鬚", +"拉纤": "拉縴", +"拉面": "拉麵", +"拖吊": "拖吊", +"拗别": "拗彆", +"拮据": "拮据", +"振荡": "振蕩", +"捍御": "捍禦", +"舍不得": "捨不得", +"舍出": "捨出", +"舍去": "捨去", +"舍命": "捨命", +"舍己从人": "捨己從人", +"舍己救人": "捨己救人", +"舍己为人": "捨己為人", +"舍己为公": "捨己為公", +"舍己为国": "捨己為國", +"舍得": "捨得", +"舍我其谁": "捨我其誰", +"舍本逐末": "捨本逐末", +"舍弃": "捨棄", +"舍死忘生": "捨死忘生", +"舍生": "捨生", +"舍短取长": "捨短取長", +"舍身": "捨身", +"舍车保帅": "捨車保帥", +"舍近求远": "捨近求遠", +"捲发": "捲髮", +"捵面": "捵麵", +"扫荡": "掃蕩", +"掌柜": "掌柜", +"排骨面": "排骨麵", +"挂帘": "掛帘", +"挂面": "掛麵", +"接着说": "接著說", +"提心吊胆": "提心吊膽", +"插图卷": "插圖卷", +"换吊": "換吊", +"换只": "換隻", +"换发": "換髮", +"摇荡": "搖蕩", +"搭伙": "搭伙", +"折合": "摺合", +"折奏": "摺奏", +"折子": "摺子", +"折尺": "摺尺", +"折扇": "摺扇", +"折梯": "摺梯", +"折椅": "摺椅", +"折叠": "摺疊", +"折痕": "摺痕", +"折篷": "摺篷", +"折纸": "摺紙", +"折裙": "摺裙", +"撒布": "撒佈", +"撚须": "撚鬚", +"撞球台": "撞球檯", +"擂台": "擂臺", +"担仔面": "擔仔麵", +"担担面": "擔擔麵", +"担着": "擔著", +"担负着": "擔負著", +"据云": "據云", +"擢发难数": "擢髮難數", +"摆布": "擺佈", +"摄制": "攝製", +"支干": "支幹", +"收获": "收穫", +"改制": "改製", +"攻克": "攻剋", +"放荡": "放蕩", +"放松": "放鬆", +"叙说着": "敘說著", +"散伙": "散伙", +"散布": "散佈", +"散荡": "散蕩", +"散发": "散髮", +"整只": "整隻", +"整出": "整齣", +"文采": "文采", +"斗六": "斗六", +"斗南": "斗南", +"斗大": "斗大", +"斗子": "斗子", +"斗室": "斗室", +"斗方": "斗方", +"斗栱": "斗栱", +"斗笠": "斗笠", +"斗箕": "斗箕", +"斗篷": "斗篷", +"斗胆": "斗膽", +"斗转参横": "斗轉參橫", +"斗量": "斗量", +"斗门": "斗門", +"料斗": "料斗", +"斯里兰卡": "斯裡蘭卡", +"新历": "新曆", +"断头台": "斷頭臺", +"方才": "方纔", +"施舍": "施捨", +"旋绕着": "旋繞著", +"旋回": "旋迴", +"族里": "族裡", +"日历": "日曆", +"日志": "日誌", +"日进斗金": "日進斗金", +"明了": "明瞭", +"明窗净几": "明窗淨几", +"明里": "明裡", +"星斗": "星斗", +"星历": "星曆", +"星移斗换": "星移斗換", +"星移斗转": "星移斗轉", +"星罗棋布": "星羅棋佈", +"星辰表": "星辰錶", +"春假里": "春假裡", +"春天里": "春天裡", +"晃荡": "晃蕩", +"景致": "景緻", +"暗地里": "暗地裡", +"暗沟里": "暗溝裡", +"暗里": "暗裡", +"历数": "曆數", +"历书": "曆書", +"历法": "曆法", +"书卷": "書卷", +"会干": "會幹", +"会里": "會裡", +"月历": "月曆", +"月台": "月臺", +"有只": "有隻", +"木制": "木製", +"本台": "本臺", +"朴子": "朴子", +"朴实": "朴實", +"朴硝": "朴硝", +"朴素": "朴素", +"朴资茅斯": "朴資茅斯", +"村里": "村裡", +"束发": "束髮", +"东岳": "東嶽", +"东征": "東征", +"松赞干布": "松贊干布", +"板着脸": "板著臉", +"板荡": "板蕩", +"枕借": "枕藉", +"林宏岳": "林宏嶽", +"枝干": "枝幹", +"枯干": "枯幹", +"某只": "某隻", +"染发": "染髮", +"柜上": "柜上", +"柜台": "柜台", +"柜子": "柜子", +"查卷": "查卷", +"查号台": "查號臺", +"校雠学": "校讎學", +"核准": "核准", +"核复": "核覆", +"格里": "格裡", +"案卷": "案卷", +"条干": "條幹", +"棉卷": "棉卷", +"棉制": "棉製", +"植发": "植髮", +"楼台": "樓臺", +"标志着": "標志著", +"标致": "標緻", +"标志": "標誌", +"模制": "模製", +"树干": "樹幹", +"横征暴敛": "橫征暴斂", +"横冲": "橫衝", +"档卷": "檔卷", +"检复": "檢覆", +"台子": "檯子", +"台布": "檯布", +"台灯": "檯燈", +"台球": "檯球", +"台面": "檯面", +"柜台": "櫃檯", +"柜台": "櫃臺", +"栏干": "欄干", +"欺蒙": "欺矇", +"歌后": "歌后", +"欧几里得": "歐幾裡得", +"正当着": "正當著", +"武后": "武后", +"武松": "武鬆", +"归并": "歸併", +"死里求生": "死裡求生", +"死里逃生": "死裡逃生", +"残卷": "殘卷", +"杀虫药": "殺虫藥", +"壳里": "殼裡", +"母后": "母后", +"每只": "每隻", +"比干": "比干", +"毛卷": "毛卷", +"毛发": "毛髮", +"毫发": "毫髮", +"气冲牛斗": "氣沖牛斗", +"气象台": "氣象臺", +"氯霉素": "氯黴素", +"水斗": "水斗", +"水里": "水裡", +"水表": "水錶", +"永历": "永曆", +"污蔑": "汙衊", +"池里": "池裡", +"污蔑": "污衊", +"沈着": "沈著", +"没事干": "沒事幹", +"没精打采": "沒精打采", +"冲着": "沖著", +"沙里淘金": "沙裡淘金", +"河里": "河裡", +"油面": "油麵", +"泡面": "泡麵", +"泰斗": "泰斗", +"洗手不干": "洗手不幹", +"洗发精": "洗髮精", +"派团参加": "派團參加", +"流荡": "流蕩", +"浩荡": "浩蕩", +"浪琴表": "浪琴錶", +"浪荡": "浪蕩", +"浮荡": "浮蕩", +"海里": "海裡", +"涂着": "涂著", +"液晶表": "液晶錶", +"凉面": "涼麵", +"淡朱": "淡硃", +"淫荡": "淫蕩", +"测验卷": "測驗卷", +"港制": "港製", +"游荡": "游蕩", +"凑合着": "湊合著", +"湖里": "湖裡", +"汤团": "湯糰", +"汤面": "湯麵", +"卤制": "滷製", +"卤面": "滷麵", +"满布": "滿佈", +"漂荡": "漂蕩", +"漏斗": "漏斗", +"演奏台": "演奏臺", +"潭里": "潭裡", +"激荡": "激蕩", +"浓郁": "濃郁", +"浓发": "濃髮", +"湿地松": "濕地鬆", +"蒙蒙": "濛濛", +"蒙雾": "濛霧", +"瀛台": "瀛臺", +"弥漫": "瀰漫", +"弥漫着": "瀰漫著", +"火并": "火併", +"灰蒙": "灰濛", +"炒面": "炒麵", +"炮制": "炮製", +"炸药": "炸葯", +"炸酱面": "炸醬麵", +"为着": "為著", +"乌干达": "烏干達", +"乌苏里江": "烏蘇裡江", +"乌发": "烏髮", +"乌龙面": "烏龍麵", +"烘制": "烘製", +"烽火台": "烽火臺", +"无干": "無干", +"无精打采": "無精打采", +"炼制": "煉製", +"烟卷儿": "煙卷兒", +"烟斗": "煙斗", +"烟斗丝": "煙斗絲", +"烟台": "煙臺", +"照准": "照准", +"熨斗": "熨斗", +"灯台": "燈臺", +"燎发": "燎髮", +"烫发": "燙髮", +"烫面": "燙麵", +"烛台": "燭臺", +"炉台": "爐臺", +"爽荡": "爽蕩", +"片言只语": "片言隻語", +"牛肉面": "牛肉麵", +"牛只": "牛隻", +"特准": "特准", +"特征": "特征", +"特里": "特裡", +"特制": "特製", +"牵系": "牽繫", +"狼借": "狼藉", +"猛冲": "猛衝", +"奖杯": "獎盃", +"获准": "獲准", +"率团参加": "率團參加", +"王侯后": "王侯后", +"王后": "王后", +"班里": "班裡", +"理发": "理髮", +"瑶台": "瑤臺", +"甚么": "甚麼", +"甜面酱": "甜麵醬", +"生力面": "生力麵", +"生锈": "生鏽", +"生发": "生髮", +"田里": "田裡", +"由馀": "由余", +"男佣": "男佣", +"男用表": "男用錶", +"留发": "留髮", +"畚斗": "畚斗", +"当着": "當著", +"疏松": "疏鬆", +"疲困": "疲睏", +"病症": "病癥", +"症候": "癥候", +"症状": "癥狀", +"症结": "癥結", +"登台": "登臺", +"发布": "發佈", +"发着": "發著", +"发面": "發麵", +"发霉": "發黴", +"白卷": "白卷", +"白干儿": "白干兒", +"白发": "白髮", +"白面": "白麵", +"百里": "百裡", +"百只": "百隻", +"皇后": "皇后", +"皇历": "皇曆", +"皓发": "皓髮", +"皮里阳秋": "皮裏陽秋", +"皮里春秋": "皮裡春秋", +"皮制": "皮製", +"皱折": "皺摺", +"盒里": "盒裡", +"监制": "監製", +"盘里": "盤裡", +"盘回": "盤迴", +"直接参与": "直接參与", +"直冲": "直衝", +"相克": "相剋", +"相干": "相干", +"相冲": "相衝", +"看台": "看臺", +"眼帘": "眼帘", +"眼眶里": "眼眶裡", +"眼里": "眼裡", +"困乏": "睏乏", +"睡着了": "睡著了", +"了如": "瞭如", +"了望": "瞭望", +"了然": "瞭然", +"了若指掌": "瞭若指掌", +"了解": "瞭解", +"蒙住": "矇住", +"蒙昧无知": "矇昧無知", +"蒙混": "矇混", +"蒙蒙": "矇矇", +"蒙眬": "矇矓", +"蒙蔽": "矇蔽", +"蒙骗": "矇騙", +"短发": "短髮", +"石英表": "石英錶", +"研制": "研製", +"砰当": "砰噹", +"砲台": "砲臺", +"朱唇皓齿": "硃唇皓齒", +"朱批": "硃批", +"朱砂": "硃砂", +"朱笔": "硃筆", +"朱红色": "硃紅色", +"朱色": "硃色", +"硬干": "硬幹", +"砚台": "硯臺", +"碑志": "碑誌", +"磁制": "磁製", +"磨制": "磨製", +"示复": "示覆", +"社里": "社裡", +"神采": "神采", +"御侮": "禦侮", +"御寇": "禦寇", +"御寒": "禦寒", +"御敌": "禦敵", +"秃发": "禿髮", +"秀发": "秀髮", +"私下里": "私下裡", +"秋天里": "秋天裡", +"秋裤": "秋褲", +"秒表": "秒錶", +"稀松": "稀鬆", +"禀复": "稟覆", +"稻谷": "稻穀", +"稽征": "稽征", +"谷仓": "穀倉", +"谷场": "穀場", +"谷子": "穀子", +"谷壳": "穀殼", +"谷物": "穀物", +"谷皮": "穀皮", +"谷神": "穀神", +"谷粒": "穀粒", +"谷舱": "穀艙", +"谷苗": "穀苗", +"谷草": "穀草", +"谷贱伤农": "穀賤傷農", +"谷道": "穀道", +"谷雨": "穀雨", +"谷类": "穀類", +"积极参与": "積极參与", +"积极参加": "積极參加", +"空荡": "空蕩", +"窗帘": "窗帘", +"窗明几净": "窗明几淨", +"窗台": "窗檯", +"窗台": "窗臺", +"窝里": "窩裡", +"窝阔台": "窩闊臺", +"穷追不舍": "窮追不捨", +"笆斗": "笆斗", +"笑里藏刀": "笑裡藏刀", +"第一卷": "第一卷", +"筋斗": "筋斗", +"答卷": "答卷", +"答复": "答複", +"答复": "答覆", +"筵几": "筵几", +"箕斗": "箕斗", +"签着": "簽著", +"吁求": "籲求", +"吁请": "籲請", +"粗制": "粗製", +"粗卤": "粗鹵", +"精干": "精幹", +"精明强干": "精明強幹", +"精致": "精緻", +"精制": "精製", +"精辟": "精辟", +"精采": "精采", +"糊里糊涂": "糊裡糊塗", +"团子": "糰子", +"系着": "系著", +"纪历": "紀曆", +"红发": "紅髮", +"红霉素": "紅黴素", +"纡回": "紆迴", +"纳采": "納采", +"素食面": "素食麵", +"素面": "素麵", +"紫微斗数": "紫微斗數", +"细致": "細緻", +"组里": "組裡", +"结发": "結髮", +"绝对参照": "絕對參照", +"丝来线去": "絲來線去", +"丝布": "絲布", +"丝板": "絲板", +"丝瓜布": "絲瓜布", +"丝绒布": "絲絨布", +"丝线": "絲線", +"丝织厂": "絲織廠", +"丝虫": "絲蟲", +"綑吊": "綑吊", +"经卷": "經卷", +"绿霉素": "綠黴素", +"维系": "維繫", +"绾发": "綰髮", +"网里": "網裡", +"紧绷": "緊繃", +"紧绷着": "緊繃著", +"紧追不舍": "緊追不捨", +"编制": "編製", +"编发": "編髮", +"缓冲": "緩衝", +"致密": "緻密", +"萦回": "縈迴", +"县里": "縣裡", +"县志": "縣誌", +"缝里": "縫裡", +"缝制": "縫製", +"纤夫": "縴夫", +"繁复": "繁複", +"绷住": "繃住", +"绷子": "繃子", +"绷带": "繃帶", +"绷紧": "繃緊", +"绷脸": "繃臉", +"绷着": "繃著", +"绷着脸": "繃著臉", +"绷着脸儿": "繃著臉兒", +"绷开": "繃開", +"绘制": "繪製", +"系上": "繫上", +"系到": "繫到", +"系囚": "繫囚", +"系心": "繫心", +"系念": "繫念", +"系怀": "繫懷", +"系数": "繫數", +"系于": "繫於", +"系系": "繫系", +"系紧": "繫緊", +"系绳": "繫繩", +"系着": "繫著", +"系辞": "繫辭", +"缴卷": "繳卷", +"累囚": "纍囚", +"累累": "纍纍", +"坛子": "罈子", +"坛坛罐罐": "罈罈罐罐", +"骂着": "罵著", +"美制": "美製", +"美发": "美髮", +"翻来覆去": "翻來覆去", +"翻云覆雨": "翻雲覆雨", +"老么": "老么", +"老板": "老闆", +"考卷": "考卷", +"耕获": "耕穫", +"聊斋志异": "聊齋誌異", +"联系": "聯係", +"联系": "聯繫", +"肉丝面": "肉絲麵", +"肉羹面": "肉羹麵", +"肉松": "肉鬆", +"肢体": "肢体", +"背向着": "背向著", +"背地里": "背地裡", +"胡里胡涂": "胡裡胡塗", +"能干": "能幹", +"脉冲": "脈衝", +"脱发": "脫髮", +"腊味": "腊味", +"腊笔": "腊筆", +"腊肉": "腊肉", +"脑子里": "腦子裡", +"腰里": "腰裡", +"胶卷": "膠卷", +"自制": "自製", +"自觉自愿": "自覺自愿", +"台上": "臺上", +"台下": "臺下", +"台中": "臺中", +"台北": "臺北", +"台南": "臺南", +"台地": "臺地", +"台塑": "臺塑", +"台大": "臺大", +"台币": "臺幣", +"台座": "臺座", +"台东": "臺東", +"台柱": "臺柱", +"台榭": "臺榭", +"台汽": "臺汽", +"台海": "臺海", +"台澎金马": "臺澎金馬", +"台湾": "臺灣", +"台灯": "臺燈", +"台球": "臺球", +"台省": "臺省", +"台端": "臺端", +"台糖": "臺糖", +"台肥": "臺肥", +"台航": "臺航", +"台视": "臺視", +"台词": "臺詞", +"台车": "臺車", +"台铁": "臺鐵", +"台阶": "臺階", +"台电": "臺電", +"台面": "臺面", +"舂谷": "舂穀", +"兴致": "興緻", +"兴高采烈": "興高采烈", +"旧历": "舊曆", +"舒卷": "舒卷", +"舞台": "舞臺", +"航海历": "航海曆", +"船只": "船隻", +"舰只": "艦隻", +"芬郁": "芬郁", +"花卷": "花卷", +"花盆里": "花盆裡", +"花采": "花采", +"苑里": "苑裡", +"若干": "若干", +"苦干": "苦幹", +"苦里": "苦裏", +"苦卤": "苦鹵", +"范仲淹": "范仲淹", +"范蠡": "范蠡", +"范阳": "范陽", +"茅台": "茅臺", +"茶几": "茶几", +"草丛里": "草叢裡", +"庄里": "莊裡", +"茎干": "莖幹", +"莽荡": "莽蕩", +"菌丝体": "菌絲体", +"菌丝体": "菌絲體", +"华里": "華裡", +"华发": "華髮", +"万卷": "萬卷", +"万历": "萬曆", +"万只": "萬隻", +"落发": "落髮", +"着儿": "著兒", +"着书立说": "著書立說", +"着色软体": "著色軟體", +"着重指出": "著重指出", +"着录": "著錄", +"着录规则": "著錄規則", +"蓄发": "蓄髮", +"蓄须": "蓄鬚", +"蓬发": "蓬髮", +"蓬松": "蓬鬆", +"莲台": "蓮臺", +"荡来荡去": "蕩來蕩去", +"荡女": "蕩女", +"荡妇": "蕩婦", +"荡寇": "蕩寇", +"荡平": "蕩平", +"荡涤": "蕩滌", +"荡漾": "蕩漾", +"荡然": "蕩然", +"荡舟": "蕩舟", +"荡船": "蕩船", +"荡荡": "蕩蕩", +"薑丝": "薑絲", +"薙发": "薙髮", +"借以": "藉以", +"借口": "藉口", +"借故": "藉故", +"借机": "藉機", +"借此": "藉此", +"借由": "藉由", +"借端": "藉端", +"借着": "藉著", +"借借": "藉藉", +"借词": "藉詞", +"借资": "藉資", +"借酒浇愁": "藉酒澆愁", +"藤制": "藤製", +"蕴含着": "蘊含著", +"蕴涵着": "蘊涵著", +"蕴借": "蘊藉", +"萝卜": "蘿蔔", +"虎须": "虎鬚", +"号志": "號誌", +"蜂后": "蜂后", +"蛮干": "蠻幹", +"行事历": "行事曆", +"胡同": "衚衕", +"冲上": "衝上", +"冲下": "衝下", +"冲来": "衝來", +"冲倒": "衝倒", +"冲出": "衝出", +"冲到": "衝到", +"冲刺": "衝刺", +"冲克": "衝剋", +"冲力": "衝力", +"冲劲": "衝勁", +"冲动": "衝動", +"冲去": "衝去", +"冲口": "衝口", +"冲垮": "衝垮", +"冲堂": "衝堂", +"冲压": "衝壓", +"冲天": "衝天", +"冲掉": "衝掉", +"冲撞": "衝撞", +"冲击": "衝擊", +"冲散": "衝散", +"冲决": "衝決", +"冲浪": "衝浪", +"冲激": "衝激", +"冲破": "衝破", +"冲程": "衝程", +"冲突": "衝突", +"冲线": "衝線", +"冲着": "衝著", +"冲冲": "衝衝", +"冲要": "衝要", +"冲起": "衝起", +"冲进": "衝進", +"冲过": "衝過", +"冲锋": "衝鋒", +"表里": "表裡", +"袖里": "袖裡", +"被里": "被裡", +"被复": "被複", +"被复": "被覆", +"被复着": "被覆著", +"被发": "被髮", +"裁并": "裁併", +"裁制": "裁製", +"里面": "裏面", +"里人": "裡人", +"里加": "裡加", +"里外": "裡外", +"里子": "裡子", +"里屋": "裡屋", +"里层": "裡層", +"里布": "裡布", +"里带": "裡帶", +"里弦": "裡弦", +"里应外合": "裡應外合", +"里拉": "裡拉", +"里斯": "裡斯", +"里海": "裡海", +"里脊": "裡脊", +"里衣": "裡衣", +"里里": "裡裡", +"里通外国": "裡通外國", +"里通外敌": "裡通外敵", +"里边": "裡邊", +"里间": "裡間", +"里面": "裡面", +"里头": "裡頭", +"制件": "製件", +"制作": "製作", +"制做": "製做", +"制备": "製備", +"制冰": "製冰", +"制冷": "製冷", +"制剂": "製劑", +"制品": "製品", +"制图": "製圖", +"制成": "製成", +"制法": "製法", +"制为": "製為", +"制片": "製片", +"制版": "製版", +"制程": "製程", +"制糖": "製糖", +"制纸": "製紙", +"制药": "製藥", +"制表": "製表", +"制裁": "製裁", +"制造": "製造", +"制革": "製革", +"制鞋": "製鞋", +"制盐": "製鹽", +"复仞年如": "複仞年如", +"复以百万": "複以百萬", +"复位": "複位", +"复信": "複信", +"复分数": "複分數", +"复列": "複列", +"复利": "複利", +"复印": "複印", +"复原": "複原", +"复句": "複句", +"复合": "複合", +"复名": "複名", +"复员": "複員", +"复壁": "複壁", +"复壮": "複壯", +"复姓": "複姓", +"复字键": "複字鍵", +"复审": "複審", +"复写": "複寫", +"复式": "複式", +"复复": "複復", +"复数": "複數", +"复本": "複本", +"复查": "複查", +"复核": "複核", +"复检": "複檢", +"复次": "複次", +"复比": "複比", +"复决": "複決", +"复活": "複活", +"复测": "複測", +"复亩珍": "複畝珍", +"复发": "複發", +"复目": "複目", +"复眼": "複眼", +"复种": "複種", +"复线": "複線", +"复习": "複習", +"复兴社": "複興社", +"复旧": "複舊", +"复色": "複色", +"复叶": "複葉", +"复盖": "複蓋", +"复苏": "複蘇", +"复制": "複製", +"复诊": "複診", +"复词": "複詞", +"复试": "複試", +"复课": "複課", +"复议": "複議", +"复变函数": "複變函數", +"复赛": "複賽", +"复述": "複述", +"复选": "複選", +"复钱": "複錢", +"复杂": "複雜", +"复电": "複電", +"复音": "複音", +"复韵": "複韻", +"衬里": "襯裡", +"西岳": "西嶽", +"西征": "西征", +"西历": "西曆", +"要冲": "要衝", +"要么": "要麼", +"复上": "覆上", +"复亡": "覆亡", +"复住": "覆住", +"复信": "覆信", +"复命": "覆命", +"复在": "覆在", +"复审": "覆審", +"复成": "覆成", +"复败": "覆敗", +"复文": "覆文", +"复校": "覆校", +"复核": "覆核", +"覆水难收": "覆水難收", +"复没": "覆沒", +"复灭": "覆滅", +"复盆": "覆盆", +"复舟": "覆舟", +"复着": "覆著", +"复盖": "覆蓋", +"复盖着": "覆蓋著", +"复试": "覆試", +"复议": "覆議", +"复车": "覆車", +"复载": "覆載", +"复辙": "覆轍", +"复电": "覆電", +"见复": "見覆", +"亲征": "親征", +"观众台": "觀眾臺", +"观台": "觀臺", +"观象台": "觀象臺", +"角落里": "角落裡", +"觔斗": "觔斗", +"触须": "觸鬚", +"订制": "訂製", +"诉说着": "訴說著", +"词汇": "詞彙", +"试卷": "試卷", +"诗卷": "詩卷", +"话里有话": "話裡有話", +"志哀": "誌哀", +"志喜": "誌喜", +"志庆": "誌慶", +"语云": "語云", +"语汇": "語彙", +"诬蔑": "誣衊", +"诵经台": "誦經臺", +"说着": "說著", +"课征": "課征", +"调制": "調製", +"调频台": "調頻臺", +"请参阅": "請參閱", +"讲台": "講臺", +"谢绝参观": "謝絕參觀", +"护发": "護髮", +"雠隙": "讎隙", +"豆腐干": "豆腐干", +"竖着": "豎著", +"丰富多采": "豐富多采", +"丰滨": "豐濱", +"丰滨乡": "豐濱鄉", +"丰采": "豐采", +"象征着": "象徵著", +"贵干": "貴幹", +"贾后": "賈后", +"赈饥": "賑饑", +"贤后": "賢后", +"质朴": "質朴", +"赌台": "賭檯", +"购并": "購併", +"赤松": "赤鬆", +"起吊": "起吊", +"起复": "起複", +"赶制": "趕製", +"跌荡": "跌蕩", +"跟斗": "跟斗", +"跳荡": "跳蕩", +"跳表": "跳錶", +"踬仆": "躓仆", +"躯干": "軀幹", +"车库里": "車庫裡", +"车站里": "車站裡", +"车里": "車裡", +"轻松": "輕鬆", +"轮回": "輪迴", +"转台": "轉檯", +"辛丑": "辛丑", +"辟邪": "辟邪", +"办伙": "辦伙", +"办公台": "辦公檯", +"辞汇": "辭彙", +"农历": "農曆", +"迂回": "迂迴", +"近日里": "近日裡", +"迥然回异": "迥然迴異", +"回光返照": "迴光返照", +"回向": "迴向", +"回圈": "迴圈", +"回廊": "迴廊", +"回形夹": "迴形夾", +"回文": "迴文", +"回旋": "迴旋", +"回流": "迴流", +"回环": "迴環", +"回荡": "迴盪", +"回纹针": "迴紋針", +"回绕": "迴繞", +"回肠": "迴腸", +"回荡": "迴蕩", +"回诵": "迴誦", +"回路": "迴路", +"回转": "迴轉", +"回递性": "迴遞性", +"回避": "迴避", +"回响": "迴響", +"回风": "迴風", +"回首": "迴首", +"迷蒙": "迷濛", +"退伙": "退伙", +"这么着": "這么著", +"这里": "這裏", +"这里": "這裡", +"这只": "這隻", +"这么": "這麼", +"这么着": "這麼著", +"通心面": "通心麵", +"速食面": "速食麵", +"连系": "連繫", +"连台好戏": "連臺好戲", +"游荡": "遊蕩", +"遍布": "遍佈", +"递回": "遞迴", +"远征": "遠征", +"适才": "適纔", +"遮复": "遮覆", +"还冲": "還衝", +"邋里邋遢": "邋裡邋遢", +"那里": "那裡", +"那只": "那隻", +"那么": "那麼", +"那么着": "那麼著", +"邪辟": "邪辟", +"郁烈": "郁烈", +"郁穆": "郁穆", +"郁郁": "郁郁", +"郁闭": "郁閉", +"郁馥": "郁馥", +"乡愿": "鄉愿", +"乡里": "鄉裡", +"邻里": "鄰裡", +"配合着": "配合著", +"配制": "配製", +"酒杯": "酒盃", +"酒坛": "酒罈", +"酥松": "酥鬆", +"醋坛": "醋罈", +"酝借": "醞藉", +"酝酿着": "醞釀著", +"医药": "醫葯", +"醲郁": "醲郁", +"酿制": "釀製", +"采地": "采地", +"采女": "采女", +"采声": "采聲", +"采色": "采色", +"采邑": "采邑", +"里程表": "里程錶", +"重折": "重摺", +"重复": "重複", +"重复": "重覆", +"重锤": "重鎚", +"野台戏": "野臺戲", +"金斗": "金斗", +"金表": "金錶", +"金发": "金髮", +"金霉素": "金黴素", +"钉锤": "釘鎚", +"银朱": "銀硃", +"银发": "銀髮", +"铜制": "銅製", +"铝制": "鋁製", +"钢制": "鋼製", +"录着": "錄著", +"录制": "錄製", +"表带": "錶帶", +"表店": "錶店", +"表厂": "錶廠", +"表壳": "錶殼", +"表链": "錶鏈", +"表面": "錶面", +"锅台": "鍋臺", +"锻鍊出": "鍛鍊出", +"锻鍊身体": "鍛鍊身体", +"锲而不舍": "鍥而不捨", +"锤儿": "鎚兒", +"锤子": "鎚子", +"锤头": "鎚頭", +"链霉素": "鏈黴素", +"镜台": "鏡臺", +"锈病": "鏽病", +"锈菌": "鏽菌", +"锈蚀": "鏽蝕", +"钟表": "鐘錶", +"铁锤": "鐵鎚", +"铁锈": "鐵鏽", +"长征": "長征", +"长发": "長髮", +"长须鲸": "長鬚鯨", +"门帘": "門帘", +"门斗": "門斗", +"门里": "門裡", +"开伙": "開伙", +"开卷": "開卷", +"开诚布公": "開誠佈公", +"开采": "開采", +"閒情逸致": "閒情逸緻", +"閒荡": "閒蕩", +"间不容发": "間不容髮", +"闵采尔": "閔采爾", +"阅卷": "閱卷", +"阑干": "闌干", +"关系": "關係", +"关系着": "關係著", +"防御": "防禦", +"防锈": "防鏽", +"防台": "防颱", +"阿斗": "阿斗", +"阿里": "阿裡", +"除旧布新": "除舊佈新", +"阴干": "陰干", +"阴历": "陰曆", +"阴郁": "陰郁", +"陆征祥": "陸征祥", +"阳春面": "陽春麵", +"阳历": "陽曆", +"阳台": "陽臺", +"只字": "隻字", +"只影": "隻影", +"只手遮天": "隻手遮天", +"只眼": "隻眼", +"只言片语": "隻言片語", +"只身": "隻身", +"雅致": "雅緻", +"雇佣": "雇佣", +"双折": "雙摺", +"杂志": "雜誌", +"鸡丝": "雞絲", +"鸡丝面": "雞絲麵", +"鸡腿面": "雞腿麵", +"鸡只": "雞隻", +"难舍": "難捨", +"雪里": "雪裡", +"云须": "雲鬚", +"电子表": "電子錶", +"电台": "電臺", +"电冲": "電衝", +"电复": "電覆", +"电视台": "電視臺", +"电表": "電錶", +"震荡": "震蕩", +"雾里": "霧裡", +"露台": "露臺", +"灵台": "靈臺", +"青瓦台": "青瓦臺", +"青霉": "青黴", +"面朝着": "面朝著", +"面临着": "面臨著", +"鞋里": "鞋裡", +"鞣制": "鞣製", +"秋千": "鞦韆", +"鞭辟入里": "鞭辟入裡", +"韩国制": "韓國製", +"韩制": "韓製", +"预制": "預製", +"颁布": "頒佈", +"头里": "頭裡", +"头发": "頭髮", +"颊须": "頰鬚", +"颠仆": "顛仆", +"颠复": "顛複", +"颠复": "顛覆", +"显着标志": "顯著標志", +"风土志": "風土誌", +"风斗": "風斗", +"风物志": "風物誌", +"风里": "風裡", +"风采": "風采", +"台风": "颱風", +"刮了": "颳了", +"刮倒": "颳倒", +"刮去": "颳去", +"刮得": "颳得", +"刮着": "颳著", +"刮走": "颳走", +"刮起": "颳起", +"刮风": "颳風", +"飘荡": "飄蕩", +"饭团": "飯糰", +"饼干": "餅干", +"馄饨面": "餛飩麵", +"饥不择食": "饑不擇食", +"饥寒": "饑寒", +"饥民": "饑民", +"饥渴": "饑渴", +"饥溺": "饑溺", +"饥荒": "饑荒", +"饥饱": "饑飽", +"饥饿": "饑餓", +"饥馑": "饑饉", +"首当其冲": "首當其衝", +"香郁": "香郁", +"馥郁": "馥郁", +"马里": "馬裡", +"马表": "馬錶", +"骀荡": "駘蕩", +"腾冲": "騰衝", +"骨子里": "骨子裡", +"骨干": "骨幹", +"骨灰坛": "骨灰罈", +"肮脏": "骯髒", +"脏乱": "髒亂", +"脏兮兮": "髒兮兮", +"脏字": "髒字", +"脏得": "髒得", +"脏东西": "髒東西", +"脏水": "髒水", +"脏的": "髒的", +"脏话": "髒話", +"脏钱": "髒錢", +"高干": "高幹", +"高台": "高臺", +"髭须": "髭鬚", +"发型": "髮型", +"发夹": "髮夾", +"发妻": "髮妻", +"发姐": "髮姐", +"发带": "髮帶", +"发廊": "髮廊", +"发式": "髮式", +"发指": "髮指", +"发捲": "髮捲", +"发根": "髮根", +"发毛": "髮毛", +"发油": "髮油", +"发状": "髮狀", +"发短心长": "髮短心長", +"发端": "髮端", +"发结": "髮結", +"发丝": "髮絲", +"发网": "髮網", +"发肤": "髮膚", +"发胶": "髮膠", +"发菜": "髮菜", +"发蜡": "髮蠟", +"发辫": "髮辮", +"发针": "髮針", +"发长": "髮長", +"发际": "髮際", +"发霜": "髮霜", +"发髻": "髮髻", +"发鬓": "髮鬢", +"鬅松": "鬅鬆", +"松了": "鬆了", +"松些": "鬆些", +"松劲": "鬆勁", +"松动": "鬆動", +"松口": "鬆口", +"松土": "鬆土", +"松弛": "鬆弛", +"松快": "鬆快", +"松懈": "鬆懈", +"松手": "鬆手", +"松散": "鬆散", +"松林": "鬆林", +"松柔": "鬆柔", +"松毛虫": "鬆毛蟲", +"松浮": "鬆浮", +"松涛": "鬆濤", +"松科": "鬆科", +"松节油": "鬆節油", +"松绑": "鬆綁", +"松紧": "鬆緊", +"松缓": "鬆緩", +"松脆": "鬆脆", +"松脱": "鬆脫", +"松起": "鬆起", +"松软": "鬆軟", +"松通": "鬆通", +"松开": "鬆開", +"松饼": "鬆餅", +"松松": "鬆鬆", +"鬈发": "鬈髮", +"胡子": "鬍子", +"胡梢": "鬍梢", +"胡渣": "鬍渣", +"胡髭": "鬍髭", +"胡须": "鬍鬚", +"须根": "鬚根", +"须毛": "鬚毛", +"须生": "鬚生", +"须眉": "鬚眉", +"须发": "鬚髮", +"须须": "鬚鬚", +"鬓发": "鬢髮", +"斗着": "鬥著", +"闹着玩儿": "鬧著玩儿", +"闹着玩儿": "鬧著玩兒", +"郁郁": "鬱郁", +"鱼松": "魚鬆", +"鲸须": "鯨鬚", +"鲇鱼": "鯰魚", +"鹤发": "鶴髮", +"卤化": "鹵化", +"卤味": "鹵味", +"卤族": "鹵族", +"卤水": "鹵水", +"卤汁": "鹵汁", +"卤簿": "鹵簿", +"卤素": "鹵素", +"卤莽": "鹵莽", +"卤钝": "鹵鈍", +"咸味": "鹹味", +"咸土": "鹹土", +"咸度": "鹹度", +"咸得": "鹹得", +"咸水": "鹹水", +"咸海": "鹹海", +"咸淡": "鹹淡", +"咸湖": "鹹湖", +"咸汤": "鹹湯", +"咸的": "鹹的", +"咸肉": "鹹肉", +"咸菜": "鹹菜", +"咸蛋": "鹹蛋", +"咸猪肉": "鹹豬肉", +"咸类": "鹹類", +"咸鱼": "鹹魚", +"咸鸭蛋": "鹹鴨蛋", +"咸卤": "鹹鹵", +"咸咸": "鹹鹹", +"盐卤": "鹽鹵", +"面价": "麵價", +"面包": "麵包", +"面团": "麵團", +"面店": "麵店", +"面厂": "麵廠", +"面杖": "麵杖", +"面条": "麵條", +"面灰": "麵灰", +"面皮": "麵皮", +"面筋": "麵筋", +"面粉": "麵粉", +"面糊": "麵糊", +"面线": "麵線", +"面茶": "麵茶", +"面食": "麵食", +"面饺": "麵餃", +"面饼": "麵餅", +"麻酱面": "麻醬麵", +"黄历": "黃曆", +"黄发垂髫": "黃髮垂髫", +"黑发": "黑髮", +"黑松": "黑鬆", +"霉毒": "黴毒", +"霉菌": "黴菌", +"鼓里": "鼓裡", +"冬冬": "鼕鼕", +"龙卷": "龍卷", +"龙须": "龍鬚", +} + +zh2Hans = { +'顯著': '显著', +'土著': '土著', +'印表機': '打印机', +'說明檔案': '帮助文件', +"瀋": "沈", +"畫": "划", +"鍾": "钟", +"靦": "腼", +"餘": "余", +"鯰": "鲇", +"鹼": "碱", +"㠏": "㟆", +"𡞵": "㛟", +"万": "万", +"与": "与", +"丑": "丑", +"丟": "丢", +"並": "并", +"丰": "丰", +"么": "么", +"乾": "干", +"乾坤": "乾坤", +"乾隆": "乾隆", +"亂": "乱", +"云": "云", +"亙": "亘", +"亞": "亚", +"仆": "仆", +"价": "价", +"伙": "伙", +"佇": "伫", +"佈": "布", +"体": "体", +"余": "余", +"佣": "佣", +"併": "并", +"來": "来", +"侖": "仑", +"侶": "侣", +"俁": "俣", +"係": "系", +"俔": "伣", +"俠": "侠", +"倀": "伥", +"倆": "俩", +"倈": "俫", +"倉": "仓", +"個": "个", +"們": "们", +"倫": "伦", +"偉": "伟", +"側": "侧", +"偵": "侦", +"偽": "伪", +"傑": "杰", +"傖": "伧", +"傘": "伞", +"備": "备", +"傢": "家", +"傭": "佣", +"傯": "偬", +"傳": "传", +"傴": "伛", +"債": "债", +"傷": "伤", +"傾": "倾", +"僂": "偻", +"僅": "仅", +"僉": "佥", +"僑": "侨", +"僕": "仆", +"僞": "伪", +"僥": "侥", +"僨": "偾", +"價": "价", +"儀": "仪", +"儂": "侬", +"億": "亿", +"儈": "侩", +"儉": "俭", +"儐": "傧", +"儔": "俦", +"儕": "侪", +"儘": "尽", +"償": "偿", +"優": "优", +"儲": "储", +"儷": "俪", +"儸": "㑩", +"儺": "傩", +"儻": "傥", +"儼": "俨", +"儿": "儿", +"兇": "凶", +"兌": "兑", +"兒": "儿", +"兗": "兖", +"党": "党", +"內": "内", +"兩": "两", +"冊": "册", +"冪": "幂", +"准": "准", +"凈": "净", +"凍": "冻", +"凜": "凛", +"几": "几", +"凱": "凯", +"划": "划", +"別": "别", +"刪": "删", +"剄": "刭", +"則": "则", +"剋": "克", +"剎": "刹", +"剗": "刬", +"剛": "刚", +"剝": "剥", +"剮": "剐", +"剴": "剀", +"創": "创", +"劃": "划", +"劇": "剧", +"劉": "刘", +"劊": "刽", +"劌": "刿", +"劍": "剑", +"劏": "㓥", +"劑": "剂", +"劚": "㔉", +"勁": "劲", +"動": "动", +"務": "务", +"勛": "勋", +"勝": "胜", +"勞": "劳", +"勢": "势", +"勩": "勚", +"勱": "劢", +"勵": "励", +"勸": "劝", +"勻": "匀", +"匭": "匦", +"匯": "汇", +"匱": "匮", +"區": "区", +"協": "协", +"卷": "卷", +"卻": "却", +"厂": "厂", +"厙": "厍", +"厠": "厕", +"厭": "厌", +"厲": "厉", +"厴": "厣", +"參": "参", +"叄": "叁", +"叢": "丛", +"台": "台", +"叶": "叶", +"吊": "吊", +"后": "后", +"吳": "吴", +"吶": "呐", +"呂": "吕", +"獃": "呆", +"咼": "呙", +"員": "员", +"唄": "呗", +"唚": "吣", +"問": "问", +"啓": "启", +"啞": "哑", +"啟": "启", +"啢": "唡", +"喎": "㖞", +"喚": "唤", +"喪": "丧", +"喬": "乔", +"單": "单", +"喲": "哟", +"嗆": "呛", +"嗇": "啬", +"嗊": "唝", +"嗎": "吗", +"嗚": "呜", +"嗩": "唢", +"嗶": "哔", +"嘆": "叹", +"嘍": "喽", +"嘔": "呕", +"嘖": "啧", +"嘗": "尝", +"嘜": "唛", +"嘩": "哗", +"嘮": "唠", +"嘯": "啸", +"嘰": "叽", +"嘵": "哓", +"嘸": "呒", +"嘽": "啴", +"噁": "恶", +"噓": "嘘", +"噚": "㖊", +"噝": "咝", +"噠": "哒", +"噥": "哝", +"噦": "哕", +"噯": "嗳", +"噲": "哙", +"噴": "喷", +"噸": "吨", +"噹": "当", +"嚀": "咛", +"嚇": "吓", +"嚌": "哜", +"嚕": "噜", +"嚙": "啮", +"嚥": "咽", +"嚦": "呖", +"嚨": "咙", +"嚮": "向", +"嚲": "亸", +"嚳": "喾", +"嚴": "严", +"嚶": "嘤", +"囀": "啭", +"囁": "嗫", +"囂": "嚣", +"囅": "冁", +"囈": "呓", +"囌": "苏", +"囑": "嘱", +"囪": "囱", +"圇": "囵", +"國": "国", +"圍": "围", +"園": "园", +"圓": "圆", +"圖": "图", +"團": "团", +"坏": "坏", +"垵": "埯", +"埡": "垭", +"埰": "采", +"執": "执", +"堅": "坚", +"堊": "垩", +"堖": "垴", +"堝": "埚", +"堯": "尧", +"報": "报", +"場": "场", +"塊": "块", +"塋": "茔", +"塏": "垲", +"塒": "埘", +"塗": "涂", +"塚": "冢", +"塢": "坞", +"塤": "埙", +"塵": "尘", +"塹": "堑", +"墊": "垫", +"墜": "坠", +"墮": "堕", +"墳": "坟", +"墻": "墙", +"墾": "垦", +"壇": "坛", +"壈": "𡒄", +"壋": "垱", +"壓": "压", +"壘": "垒", +"壙": "圹", +"壚": "垆", +"壞": "坏", +"壟": "垄", +"壠": "垅", +"壢": "坜", +"壩": "坝", +"壯": "壮", +"壺": "壶", +"壼": "壸", +"壽": "寿", +"夠": "够", +"夢": "梦", +"夾": "夹", +"奐": "奂", +"奧": "奥", +"奩": "奁", +"奪": "夺", +"奬": "奖", +"奮": "奋", +"奼": "姹", +"妝": "妆", +"姍": "姗", +"姜": "姜", +"姦": "奸", +"娛": "娱", +"婁": "娄", +"婦": "妇", +"婭": "娅", +"媧": "娲", +"媯": "妫", +"媼": "媪", +"媽": "妈", +"嫗": "妪", +"嫵": "妩", +"嫻": "娴", +"嫿": "婳", +"嬀": "妫", +"嬈": "娆", +"嬋": "婵", +"嬌": "娇", +"嬙": "嫱", +"嬡": "嫒", +"嬤": "嬷", +"嬪": "嫔", +"嬰": "婴", +"嬸": "婶", +"孌": "娈", +"孫": "孙", +"學": "学", +"孿": "孪", +"宁": "宁", +"宮": "宫", +"寢": "寝", +"實": "实", +"寧": "宁", +"審": "审", +"寫": "写", +"寬": "宽", +"寵": "宠", +"寶": "宝", +"將": "将", +"專": "专", +"尋": "寻", +"對": "对", +"導": "导", +"尷": "尴", +"屆": "届", +"屍": "尸", +"屓": "屃", +"屜": "屉", +"屢": "屡", +"層": "层", +"屨": "屦", +"屬": "属", +"岡": "冈", +"峴": "岘", +"島": "岛", +"峽": "峡", +"崍": "崃", +"崗": "岗", +"崢": "峥", +"崬": "岽", +"嵐": "岚", +"嶁": "嵝", +"嶄": "崭", +"嶇": "岖", +"嶔": "嵚", +"嶗": "崂", +"嶠": "峤", +"嶢": "峣", +"嶧": "峄", +"嶮": "崄", +"嶴": "岙", +"嶸": "嵘", +"嶺": "岭", +"嶼": "屿", +"嶽": "岳", +"巋": "岿", +"巒": "峦", +"巔": "巅", +"巰": "巯", +"帘": "帘", +"帥": "帅", +"師": "师", +"帳": "帐", +"帶": "带", +"幀": "帧", +"幃": "帏", +"幗": "帼", +"幘": "帻", +"幟": "帜", +"幣": "币", +"幫": "帮", +"幬": "帱", +"幹": "干", +"幺": "么", +"幾": "几", +"广": "广", +"庫": "库", +"廁": "厕", +"廂": "厢", +"廄": "厩", +"廈": "厦", +"廚": "厨", +"廝": "厮", +"廟": "庙", +"廠": "厂", +"廡": "庑", +"廢": "废", +"廣": "广", +"廩": "廪", +"廬": "庐", +"廳": "厅", +"弒": "弑", +"弳": "弪", +"張": "张", +"強": "强", +"彆": "别", +"彈": "弹", +"彌": "弥", +"彎": "弯", +"彙": "汇", +"彞": "彝", +"彥": "彦", +"征": "征", +"後": "后", +"徑": "径", +"從": "从", +"徠": "徕", +"復": "复", +"徵": "征", +"徹": "彻", +"志": "志", +"恆": "恒", +"恥": "耻", +"悅": "悦", +"悞": "悮", +"悵": "怅", +"悶": "闷", +"惡": "恶", +"惱": "恼", +"惲": "恽", +"惻": "恻", +"愛": "爱", +"愜": "惬", +"愨": "悫", +"愴": "怆", +"愷": "恺", +"愾": "忾", +"愿": "愿", +"慄": "栗", +"態": "态", +"慍": "愠", +"慘": "惨", +"慚": "惭", +"慟": "恸", +"慣": "惯", +"慤": "悫", +"慪": "怄", +"慫": "怂", +"慮": "虑", +"慳": "悭", +"慶": "庆", +"憂": "忧", +"憊": "惫", +"憐": "怜", +"憑": "凭", +"憒": "愦", +"憚": "惮", +"憤": "愤", +"憫": "悯", +"憮": "怃", +"憲": "宪", +"憶": "忆", +"懇": "恳", +"應": "应", +"懌": "怿", +"懍": "懔", +"懞": "蒙", +"懟": "怼", +"懣": "懑", +"懨": "恹", +"懲": "惩", +"懶": "懒", +"懷": "怀", +"懸": "悬", +"懺": "忏", +"懼": "惧", +"懾": "慑", +"戀": "恋", +"戇": "戆", +"戔": "戋", +"戧": "戗", +"戩": "戬", +"戰": "战", +"戱": "戯", +"戲": "戏", +"戶": "户", +"担": "担", +"拋": "抛", +"挩": "捝", +"挾": "挟", +"捨": "舍", +"捫": "扪", +"据": "据", +"掃": "扫", +"掄": "抡", +"掗": "挜", +"掙": "挣", +"掛": "挂", +"採": "采", +"揀": "拣", +"揚": "扬", +"換": "换", +"揮": "挥", +"損": "损", +"搖": "摇", +"搗": "捣", +"搵": "揾", +"搶": "抢", +"摑": "掴", +"摜": "掼", +"摟": "搂", +"摯": "挚", +"摳": "抠", +"摶": "抟", +"摺": "折", +"摻": "掺", +"撈": "捞", +"撏": "挦", +"撐": "撑", +"撓": "挠", +"撝": "㧑", +"撟": "挢", +"撣": "掸", +"撥": "拨", +"撫": "抚", +"撲": "扑", +"撳": "揿", +"撻": "挞", +"撾": "挝", +"撿": "捡", +"擁": "拥", +"擄": "掳", +"擇": "择", +"擊": "击", +"擋": "挡", +"擓": "㧟", +"擔": "担", +"據": "据", +"擠": "挤", +"擬": "拟", +"擯": "摈", +"擰": "拧", +"擱": "搁", +"擲": "掷", +"擴": "扩", +"擷": "撷", +"擺": "摆", +"擻": "擞", +"擼": "撸", +"擾": "扰", +"攄": "摅", +"攆": "撵", +"攏": "拢", +"攔": "拦", +"攖": "撄", +"攙": "搀", +"攛": "撺", +"攜": "携", +"攝": "摄", +"攢": "攒", +"攣": "挛", +"攤": "摊", +"攪": "搅", +"攬": "揽", +"敗": "败", +"敘": "叙", +"敵": "敌", +"數": "数", +"斂": "敛", +"斃": "毙", +"斕": "斓", +"斗": "斗", +"斬": "斩", +"斷": "断", +"於": "于", +"時": "时", +"晉": "晋", +"晝": "昼", +"暈": "晕", +"暉": "晖", +"暘": "旸", +"暢": "畅", +"暫": "暂", +"曄": "晔", +"曆": "历", +"曇": "昙", +"曉": "晓", +"曏": "向", +"曖": "暧", +"曠": "旷", +"曨": "昽", +"曬": "晒", +"書": "书", +"會": "会", +"朧": "胧", +"朮": "术", +"术": "术", +"朴": "朴", +"東": "东", +"杴": "锨", +"极": "极", +"柜": "柜", +"柵": "栅", +"桿": "杆", +"梔": "栀", +"梘": "枧", +"條": "条", +"梟": "枭", +"梲": "棁", +"棄": "弃", +"棖": "枨", +"棗": "枣", +"棟": "栋", +"棧": "栈", +"棲": "栖", +"棶": "梾", +"椏": "桠", +"楊": "杨", +"楓": "枫", +"楨": "桢", +"業": "业", +"極": "极", +"榪": "杩", +"榮": "荣", +"榲": "榅", +"榿": "桤", +"構": "构", +"槍": "枪", +"槤": "梿", +"槧": "椠", +"槨": "椁", +"槳": "桨", +"樁": "桩", +"樂": "乐", +"樅": "枞", +"樓": "楼", +"標": "标", +"樞": "枢", +"樣": "样", +"樸": "朴", +"樹": "树", +"樺": "桦", +"橈": "桡", +"橋": "桥", +"機": "机", +"橢": "椭", +"橫": "横", +"檁": "檩", +"檉": "柽", +"檔": "档", +"檜": "桧", +"檟": "槚", +"檢": "检", +"檣": "樯", +"檮": "梼", +"檯": "台", +"檳": "槟", +"檸": "柠", +"檻": "槛", +"櫃": "柜", +"櫓": "橹", +"櫚": "榈", +"櫛": "栉", +"櫝": "椟", +"櫞": "橼", +"櫟": "栎", +"櫥": "橱", +"櫧": "槠", +"櫨": "栌", +"櫪": "枥", +"櫫": "橥", +"櫬": "榇", +"櫱": "蘖", +"櫳": "栊", +"櫸": "榉", +"櫻": "樱", +"欄": "栏", +"權": "权", +"欏": "椤", +"欒": "栾", +"欖": "榄", +"欞": "棂", +"欽": "钦", +"歐": "欧", +"歟": "欤", +"歡": "欢", +"歲": "岁", +"歷": "历", +"歸": "归", +"歿": "殁", +"殘": "残", +"殞": "殒", +"殤": "殇", +"殨": "㱮", +"殫": "殚", +"殮": "殓", +"殯": "殡", +"殰": "㱩", +"殲": "歼", +"殺": "杀", +"殻": "壳", +"殼": "壳", +"毀": "毁", +"毆": "殴", +"毿": "毵", +"氂": "牦", +"氈": "毡", +"氌": "氇", +"氣": "气", +"氫": "氢", +"氬": "氩", +"氳": "氲", +"汙": "污", +"決": "决", +"沒": "没", +"沖": "冲", +"況": "况", +"洶": "汹", +"浹": "浃", +"涂": "涂", +"涇": "泾", +"涼": "凉", +"淀": "淀", +"淒": "凄", +"淚": "泪", +"淥": "渌", +"淨": "净", +"淩": "凌", +"淪": "沦", +"淵": "渊", +"淶": "涞", +"淺": "浅", +"渙": "涣", +"減": "减", +"渦": "涡", +"測": "测", +"渾": "浑", +"湊": "凑", +"湞": "浈", +"湯": "汤", +"溈": "沩", +"準": "准", +"溝": "沟", +"溫": "温", +"滄": "沧", +"滅": "灭", +"滌": "涤", +"滎": "荥", +"滬": "沪", +"滯": "滞", +"滲": "渗", +"滷": "卤", +"滸": "浒", +"滻": "浐", +"滾": "滚", +"滿": "满", +"漁": "渔", +"漚": "沤", +"漢": "汉", +"漣": "涟", +"漬": "渍", +"漲": "涨", +"漵": "溆", +"漸": "渐", +"漿": "浆", +"潁": "颍", +"潑": "泼", +"潔": "洁", +"潙": "沩", +"潛": "潜", +"潤": "润", +"潯": "浔", +"潰": "溃", +"潷": "滗", +"潿": "涠", +"澀": "涩", +"澆": "浇", +"澇": "涝", +"澐": "沄", +"澗": "涧", +"澠": "渑", +"澤": "泽", +"澦": "滪", +"澩": "泶", +"澮": "浍", +"澱": "淀", +"濁": "浊", +"濃": "浓", +"濕": "湿", +"濘": "泞", +"濛": "蒙", +"濟": "济", +"濤": "涛", +"濫": "滥", +"濰": "潍", +"濱": "滨", +"濺": "溅", +"濼": "泺", +"濾": "滤", +"瀅": "滢", +"瀆": "渎", +"瀇": "㲿", +"瀉": "泻", +"瀋": "沈", +"瀏": "浏", +"瀕": "濒", +"瀘": "泸", +"瀝": "沥", +"瀟": "潇", +"瀠": "潆", +"瀦": "潴", +"瀧": "泷", +"瀨": "濑", +"瀰": "弥", +"瀲": "潋", +"瀾": "澜", +"灃": "沣", +"灄": "滠", +"灑": "洒", +"灕": "漓", +"灘": "滩", +"灝": "灏", +"灠": "漤", +"灣": "湾", +"灤": "滦", +"灧": "滟", +"災": "灾", +"為": "为", +"烏": "乌", +"烴": "烃", +"無": "无", +"煉": "炼", +"煒": "炜", +"煙": "烟", +"煢": "茕", +"煥": "焕", +"煩": "烦", +"煬": "炀", +"煱": "㶽", +"熅": "煴", +"熒": "荧", +"熗": "炝", +"熱": "热", +"熲": "颎", +"熾": "炽", +"燁": "烨", +"燈": "灯", +"燉": "炖", +"燒": "烧", +"燙": "烫", +"燜": "焖", +"營": "营", +"燦": "灿", +"燭": "烛", +"燴": "烩", +"燶": "㶶", +"燼": "烬", +"燾": "焘", +"爍": "烁", +"爐": "炉", +"爛": "烂", +"爭": "争", +"爲": "为", +"爺": "爷", +"爾": "尔", +"牆": "墙", +"牘": "牍", +"牽": "牵", +"犖": "荦", +"犢": "犊", +"犧": "牺", +"狀": "状", +"狹": "狭", +"狽": "狈", +"猙": "狰", +"猶": "犹", +"猻": "狲", +"獁": "犸", +"獄": "狱", +"獅": "狮", +"獎": "奖", +"獨": "独", +"獪": "狯", +"獫": "猃", +"獮": "狝", +"獰": "狞", +"獱": "㺍", +"獲": "获", +"獵": "猎", +"獷": "犷", +"獸": "兽", +"獺": "獭", +"獻": "献", +"獼": "猕", +"玀": "猡", +"現": "现", +"琺": "珐", +"琿": "珲", +"瑋": "玮", +"瑒": "玚", +"瑣": "琐", +"瑤": "瑶", +"瑩": "莹", +"瑪": "玛", +"瑲": "玱", +"璉": "琏", +"璣": "玑", +"璦": "瑷", +"璫": "珰", +"環": "环", +"璽": "玺", +"瓊": "琼", +"瓏": "珑", +"瓔": "璎", +"瓚": "瓒", +"甌": "瓯", +"產": "产", +"産": "产", +"畝": "亩", +"畢": "毕", +"異": "异", +"畵": "画", +"當": "当", +"疇": "畴", +"疊": "叠", +"痙": "痉", +"痾": "疴", +"瘂": "痖", +"瘋": "疯", +"瘍": "疡", +"瘓": "痪", +"瘞": "瘗", +"瘡": "疮", +"瘧": "疟", +"瘮": "瘆", +"瘲": "疭", +"瘺": "瘘", +"瘻": "瘘", +"療": "疗", +"癆": "痨", +"癇": "痫", +"癉": "瘅", +"癘": "疠", +"癟": "瘪", +"癢": "痒", +"癤": "疖", +"癥": "症", +"癧": "疬", +"癩": "癞", +"癬": "癣", +"癭": "瘿", +"癮": "瘾", +"癰": "痈", +"癱": "瘫", +"癲": "癫", +"發": "发", +"皚": "皑", +"皰": "疱", +"皸": "皲", +"皺": "皱", +"盃": "杯", +"盜": "盗", +"盞": "盏", +"盡": "尽", +"監": "监", +"盤": "盘", +"盧": "卢", +"盪": "荡", +"眥": "眦", +"眾": "众", +"睏": "困", +"睜": "睁", +"睞": "睐", +"瞘": "眍", +"瞜": "䁖", +"瞞": "瞒", +"瞭": "了", +"瞶": "瞆", +"瞼": "睑", +"矇": "蒙", +"矓": "眬", +"矚": "瞩", +"矯": "矫", +"硃": "朱", +"硜": "硁", +"硤": "硖", +"硨": "砗", +"确": "确", +"硯": "砚", +"碩": "硕", +"碭": "砀", +"碸": "砜", +"確": "确", +"碼": "码", +"磑": "硙", +"磚": "砖", +"磣": "碜", +"磧": "碛", +"磯": "矶", +"磽": "硗", +"礆": "硷", +"礎": "础", +"礙": "碍", +"礦": "矿", +"礪": "砺", +"礫": "砾", +"礬": "矾", +"礱": "砻", +"祿": "禄", +"禍": "祸", +"禎": "祯", +"禕": "祎", +"禡": "祃", +"禦": "御", +"禪": "禅", +"禮": "礼", +"禰": "祢", +"禱": "祷", +"禿": "秃", +"秈": "籼", +"种": "种", +"稅": "税", +"稈": "秆", +"稏": "䅉", +"稟": "禀", +"種": "种", +"稱": "称", +"穀": "谷", +"穌": "稣", +"積": "积", +"穎": "颖", +"穠": "秾", +"穡": "穑", +"穢": "秽", +"穩": "稳", +"穫": "获", +"穭": "稆", +"窩": "窝", +"窪": "洼", +"窮": "穷", +"窯": "窑", +"窵": "窎", +"窶": "窭", +"窺": "窥", +"竄": "窜", +"竅": "窍", +"竇": "窦", +"竈": "灶", +"竊": "窃", +"竪": "竖", +"競": "竞", +"筆": "笔", +"筍": "笋", +"筑": "筑", +"筧": "笕", +"筴": "䇲", +"箋": "笺", +"箏": "筝", +"節": "节", +"範": "范", +"築": "筑", +"篋": "箧", +"篔": "筼", +"篤": "笃", +"篩": "筛", +"篳": "筚", +"簀": "箦", +"簍": "篓", +"簞": "箪", +"簡": "简", +"簣": "篑", +"簫": "箫", +"簹": "筜", +"簽": "签", +"簾": "帘", +"籃": "篮", +"籌": "筹", +"籖": "签", +"籙": "箓", +"籜": "箨", +"籟": "籁", +"籠": "笼", +"籩": "笾", +"籪": "簖", +"籬": "篱", +"籮": "箩", +"籲": "吁", +"粵": "粤", +"糝": "糁", +"糞": "粪", +"糧": "粮", +"糰": "团", +"糲": "粝", +"糴": "籴", +"糶": "粜", +"糹": "纟", +"糾": "纠", +"紀": "纪", +"紂": "纣", +"約": "约", +"紅": "红", +"紆": "纡", +"紇": "纥", +"紈": "纨", +"紉": "纫", +"紋": "纹", +"納": "纳", +"紐": "纽", +"紓": "纾", +"純": "纯", +"紕": "纰", +"紖": "纼", +"紗": "纱", +"紘": "纮", +"紙": "纸", +"級": "级", +"紛": "纷", +"紜": "纭", +"紝": "纴", +"紡": "纺", +"紬": "䌷", +"細": "细", +"紱": "绂", +"紲": "绁", +"紳": "绅", +"紵": "纻", +"紹": "绍", +"紺": "绀", +"紼": "绋", +"紿": "绐", +"絀": "绌", +"終": "终", +"組": "组", +"絅": "䌹", +"絆": "绊", +"絎": "绗", +"結": "结", +"絕": "绝", +"絛": "绦", +"絝": "绔", +"絞": "绞", +"絡": "络", +"絢": "绚", +"給": "给", +"絨": "绒", +"絰": "绖", +"統": "统", +"絲": "丝", +"絳": "绛", +"絶": "绝", +"絹": "绢", +"綁": "绑", +"綃": "绡", +"綆": "绠", +"綈": "绨", +"綉": "绣", +"綌": "绤", +"綏": "绥", +"綐": "䌼", +"經": "经", +"綜": "综", +"綞": "缍", +"綠": "绿", +"綢": "绸", +"綣": "绻", +"綫": "线", +"綬": "绶", +"維": "维", +"綯": "绹", +"綰": "绾", +"綱": "纲", +"網": "网", +"綳": "绷", +"綴": "缀", +"綵": "䌽", +"綸": "纶", +"綹": "绺", +"綺": "绮", +"綻": "绽", +"綽": "绰", +"綾": "绫", +"綿": "绵", +"緄": "绲", +"緇": "缁", +"緊": "紧", +"緋": "绯", +"緑": "绿", +"緒": "绪", +"緓": "绬", +"緔": "绱", +"緗": "缃", +"緘": "缄", +"緙": "缂", +"線": "线", +"緝": "缉", +"緞": "缎", +"締": "缔", +"緡": "缗", +"緣": "缘", +"緦": "缌", +"編": "编", +"緩": "缓", +"緬": "缅", +"緯": "纬", +"緱": "缑", +"緲": "缈", +"練": "练", +"緶": "缏", +"緹": "缇", +"緻": "致", +"縈": "萦", +"縉": "缙", +"縊": "缢", +"縋": "缒", +"縐": "绉", +"縑": "缣", +"縕": "缊", +"縗": "缞", +"縛": "缚", +"縝": "缜", +"縞": "缟", +"縟": "缛", +"縣": "县", +"縧": "绦", +"縫": "缝", +"縭": "缡", +"縮": "缩", +"縱": "纵", +"縲": "缧", +"縳": "䌸", +"縴": "纤", +"縵": "缦", +"縶": "絷", +"縷": "缕", +"縹": "缥", +"總": "总", +"績": "绩", +"繃": "绷", +"繅": "缫", +"繆": "缪", +"繒": "缯", +"織": "织", +"繕": "缮", +"繚": "缭", +"繞": "绕", +"繡": "绣", +"繢": "缋", +"繩": "绳", +"繪": "绘", +"繫": "系", +"繭": "茧", +"繮": "缰", +"繯": "缳", +"繰": "缲", +"繳": "缴", +"繸": "䍁", +"繹": "绎", +"繼": "继", +"繽": "缤", +"繾": "缱", +"繿": "䍀", +"纈": "缬", +"纊": "纩", +"續": "续", +"纍": "累", +"纏": "缠", +"纓": "缨", +"纔": "才", +"纖": "纤", +"纘": "缵", +"纜": "缆", +"缽": "钵", +"罈": "坛", +"罌": "罂", +"罰": "罚", +"罵": "骂", +"罷": "罢", +"羅": "罗", +"羆": "罴", +"羈": "羁", +"羋": "芈", +"羥": "羟", +"義": "义", +"習": "习", +"翹": "翘", +"耬": "耧", +"耮": "耢", +"聖": "圣", +"聞": "闻", +"聯": "联", +"聰": "聪", +"聲": "声", +"聳": "耸", +"聵": "聩", +"聶": "聂", +"職": "职", +"聹": "聍", +"聽": "听", +"聾": "聋", +"肅": "肃", +"胜": "胜", +"脅": "胁", +"脈": "脉", +"脛": "胫", +"脫": "脱", +"脹": "胀", +"腊": "腊", +"腎": "肾", +"腖": "胨", +"腡": "脶", +"腦": "脑", +"腫": "肿", +"腳": "脚", +"腸": "肠", +"膃": "腽", +"膚": "肤", +"膠": "胶", +"膩": "腻", +"膽": "胆", +"膾": "脍", +"膿": "脓", +"臉": "脸", +"臍": "脐", +"臏": "膑", +"臘": "腊", +"臚": "胪", +"臟": "脏", +"臠": "脔", +"臢": "臜", +"臥": "卧", +"臨": "临", +"臺": "台", +"與": "与", +"興": "兴", +"舉": "举", +"舊": "旧", +"艙": "舱", +"艤": "舣", +"艦": "舰", +"艫": "舻", +"艱": "艰", +"艷": "艳", +"芻": "刍", +"苧": "苎", +"苹": "苹", +"范": "范", +"茲": "兹", +"荊": "荆", +"莊": "庄", +"莖": "茎", +"莢": "荚", +"莧": "苋", +"華": "华", +"萇": "苌", +"萊": "莱", +"萬": "万", +"萵": "莴", +"葉": "叶", +"葒": "荭", +"著名": "著名", +"葤": "荮", +"葦": "苇", +"葯": "药", +"葷": "荤", +"蒓": "莼", +"蒔": "莳", +"蒞": "莅", +"蒼": "苍", +"蓀": "荪", +"蓋": "盖", +"蓮": "莲", +"蓯": "苁", +"蓴": "莼", +"蓽": "荜", +"蔔": "卜", +"蔞": "蒌", +"蔣": "蒋", +"蔥": "葱", +"蔦": "茑", +"蔭": "荫", +"蕁": "荨", +"蕆": "蒇", +"蕎": "荞", +"蕒": "荬", +"蕓": "芸", +"蕕": "莸", +"蕘": "荛", +"蕢": "蒉", +"蕩": "荡", +"蕪": "芜", +"蕭": "萧", +"蕷": "蓣", +"薀": "蕰", +"薈": "荟", +"薊": "蓟", +"薌": "芗", +"薔": "蔷", +"薘": "荙", +"薟": "莶", +"薦": "荐", +"薩": "萨", +"薳": "䓕", +"薴": "苧", +"薺": "荠", +"藉": "借", +"藍": "蓝", +"藎": "荩", +"藝": "艺", +"藥": "药", +"藪": "薮", +"藴": "蕴", +"藶": "苈", +"藹": "蔼", +"藺": "蔺", +"蘄": "蕲", +"蘆": "芦", +"蘇": "苏", +"蘊": "蕴", +"蘋": "苹", +"蘚": "藓", +"蘞": "蔹", +"蘢": "茏", +"蘭": "兰", +"蘺": "蓠", +"蘿": "萝", +"虆": "蔂", +"處": "处", +"虛": "虚", +"虜": "虏", +"號": "号", +"虧": "亏", +"虫": "虫", +"虯": "虬", +"蛺": "蛱", +"蛻": "蜕", +"蜆": "蚬", +"蜡": "蜡", +"蝕": "蚀", +"蝟": "猬", +"蝦": "虾", +"蝸": "蜗", +"螄": "蛳", +"螞": "蚂", +"螢": "萤", +"螮": "䗖", +"螻": "蝼", +"螿": "螀", +"蟄": "蛰", +"蟈": "蝈", +"蟎": "螨", +"蟣": "虮", +"蟬": "蝉", +"蟯": "蛲", +"蟲": "虫", +"蟶": "蛏", +"蟻": "蚁", +"蠅": "蝇", +"蠆": "虿", +"蠐": "蛴", +"蠑": "蝾", +"蠟": "蜡", +"蠣": "蛎", +"蠨": "蟏", +"蠱": "蛊", +"蠶": "蚕", +"蠻": "蛮", +"衆": "众", +"衊": "蔑", +"術": "术", +"衕": "同", +"衚": "胡", +"衛": "卫", +"衝": "冲", +"衹": "只", +"袞": "衮", +"裊": "袅", +"裏": "里", +"補": "补", +"裝": "装", +"裡": "里", +"製": "制", +"複": "复", +"褌": "裈", +"褘": "袆", +"褲": "裤", +"褳": "裢", +"褸": "褛", +"褻": "亵", +"襇": "裥", +"襏": "袯", +"襖": "袄", +"襝": "裣", +"襠": "裆", +"襤": "褴", +"襪": "袜", +"襬": "䙓", +"襯": "衬", +"襲": "袭", +"覆蓋": "覆盖", +"翻來覆去": "翻来覆去", +"見": "见", +"覎": "觃", +"規": "规", +"覓": "觅", +"視": "视", +"覘": "觇", +"覡": "觋", +"覥": "觍", +"覦": "觎", +"親": "亲", +"覬": "觊", +"覯": "觏", +"覲": "觐", +"覷": "觑", +"覺": "觉", +"覽": "览", +"覿": "觌", +"觀": "观", +"觴": "觞", +"觶": "觯", +"觸": "触", +"訁": "讠", +"訂": "订", +"訃": "讣", +"計": "计", +"訊": "讯", +"訌": "讧", +"討": "讨", +"訐": "讦", +"訒": "讱", +"訓": "训", +"訕": "讪", +"訖": "讫", +"託": "讬", +"記": "记", +"訛": "讹", +"訝": "讶", +"訟": "讼", +"訢": "䜣", +"訣": "诀", +"訥": "讷", +"訩": "讻", +"訪": "访", +"設": "设", +"許": "许", +"訴": "诉", +"訶": "诃", +"診": "诊", +"註": "注", +"詁": "诂", +"詆": "诋", +"詎": "讵", +"詐": "诈", +"詒": "诒", +"詔": "诏", +"評": "评", +"詖": "诐", +"詗": "诇", +"詘": "诎", +"詛": "诅", +"詞": "词", +"詠": "咏", +"詡": "诩", +"詢": "询", +"詣": "诣", +"試": "试", +"詩": "诗", +"詫": "诧", +"詬": "诟", +"詭": "诡", +"詮": "诠", +"詰": "诘", +"話": "话", +"該": "该", +"詳": "详", +"詵": "诜", +"詼": "诙", +"詿": "诖", +"誄": "诔", +"誅": "诛", +"誆": "诓", +"誇": "夸", +"誌": "志", +"認": "认", +"誑": "诳", +"誒": "诶", +"誕": "诞", +"誘": "诱", +"誚": "诮", +"語": "语", +"誠": "诚", +"誡": "诫", +"誣": "诬", +"誤": "误", +"誥": "诰", +"誦": "诵", +"誨": "诲", +"說": "说", +"説": "说", +"誰": "谁", +"課": "课", +"誶": "谇", +"誹": "诽", +"誼": "谊", +"誾": "訚", +"調": "调", +"諂": "谄", +"諄": "谆", +"談": "谈", +"諉": "诿", +"請": "请", +"諍": "诤", +"諏": "诹", +"諑": "诼", +"諒": "谅", +"論": "论", +"諗": "谂", +"諛": "谀", +"諜": "谍", +"諝": "谞", +"諞": "谝", +"諢": "诨", +"諤": "谔", +"諦": "谛", +"諧": "谐", +"諫": "谏", +"諭": "谕", +"諮": "谘", +"諱": "讳", +"諳": "谙", +"諶": "谌", +"諷": "讽", +"諸": "诸", +"諺": "谚", +"諼": "谖", +"諾": "诺", +"謀": "谋", +"謁": "谒", +"謂": "谓", +"謄": "誊", +"謅": "诌", +"謊": "谎", +"謎": "谜", +"謐": "谧", +"謔": "谑", +"謖": "谡", +"謗": "谤", +"謙": "谦", +"謚": "谥", +"講": "讲", +"謝": "谢", +"謠": "谣", +"謡": "谣", +"謨": "谟", +"謫": "谪", +"謬": "谬", +"謭": "谫", +"謳": "讴", +"謹": "谨", +"謾": "谩", +"譅": "䜧", +"證": "证", +"譎": "谲", +"譏": "讥", +"譖": "谮", +"識": "识", +"譙": "谯", +"譚": "谭", +"譜": "谱", +"譫": "谵", +"譯": "译", +"議": "议", +"譴": "谴", +"護": "护", +"譸": "诪", +"譽": "誉", +"譾": "谫", +"讀": "读", +"變": "变", +"讎": "仇", +"讎": "雠", +"讒": "谗", +"讓": "让", +"讕": "谰", +"讖": "谶", +"讜": "谠", +"讞": "谳", +"豈": "岂", +"豎": "竖", +"豐": "丰", +"豬": "猪", +"豶": "豮", +"貓": "猫", +"貙": "䝙", +"貝": "贝", +"貞": "贞", +"貟": "贠", +"負": "负", +"財": "财", +"貢": "贡", +"貧": "贫", +"貨": "货", +"販": "贩", +"貪": "贪", +"貫": "贯", +"責": "责", +"貯": "贮", +"貰": "贳", +"貲": "赀", +"貳": "贰", +"貴": "贵", +"貶": "贬", +"買": "买", +"貸": "贷", +"貺": "贶", +"費": "费", +"貼": "贴", +"貽": "贻", +"貿": "贸", +"賀": "贺", +"賁": "贲", +"賂": "赂", +"賃": "赁", +"賄": "贿", +"賅": "赅", +"資": "资", +"賈": "贾", +"賊": "贼", +"賑": "赈", +"賒": "赊", +"賓": "宾", +"賕": "赇", +"賙": "赒", +"賚": "赉", +"賜": "赐", +"賞": "赏", +"賠": "赔", +"賡": "赓", +"賢": "贤", +"賣": "卖", +"賤": "贱", +"賦": "赋", +"賧": "赕", +"質": "质", +"賫": "赍", +"賬": "账", +"賭": "赌", +"賰": "䞐", +"賴": "赖", +"賵": "赗", +"賺": "赚", +"賻": "赙", +"購": "购", +"賽": "赛", +"賾": "赜", +"贄": "贽", +"贅": "赘", +"贇": "赟", +"贈": "赠", +"贊": "赞", +"贋": "赝", +"贍": "赡", +"贏": "赢", +"贐": "赆", +"贓": "赃", +"贔": "赑", +"贖": "赎", +"贗": "赝", +"贛": "赣", +"贜": "赃", +"赬": "赪", +"趕": "赶", +"趙": "赵", +"趨": "趋", +"趲": "趱", +"跡": "迹", +"踐": "践", +"踴": "踊", +"蹌": "跄", +"蹕": "跸", +"蹣": "蹒", +"蹤": "踪", +"蹺": "跷", +"躂": "跶", +"躉": "趸", +"躊": "踌", +"躋": "跻", +"躍": "跃", +"躑": "踯", +"躒": "跞", +"躓": "踬", +"躕": "蹰", +"躚": "跹", +"躡": "蹑", +"躥": "蹿", +"躦": "躜", +"躪": "躏", +"軀": "躯", +"車": "车", +"軋": "轧", +"軌": "轨", +"軍": "军", +"軑": "轪", +"軒": "轩", +"軔": "轫", +"軛": "轭", +"軟": "软", +"軤": "轷", +"軫": "轸", +"軲": "轱", +"軸": "轴", +"軹": "轵", +"軺": "轺", +"軻": "轲", +"軼": "轶", +"軾": "轼", +"較": "较", +"輅": "辂", +"輇": "辁", +"輈": "辀", +"載": "载", +"輊": "轾", +"輒": "辄", +"輓": "挽", +"輔": "辅", +"輕": "轻", +"輛": "辆", +"輜": "辎", +"輝": "辉", +"輞": "辋", +"輟": "辍", +"輥": "辊", +"輦": "辇", +"輩": "辈", +"輪": "轮", +"輬": "辌", +"輯": "辑", +"輳": "辏", +"輸": "输", +"輻": "辐", +"輾": "辗", +"輿": "舆", +"轀": "辒", +"轂": "毂", +"轄": "辖", +"轅": "辕", +"轆": "辘", +"轉": "转", +"轍": "辙", +"轎": "轿", +"轔": "辚", +"轟": "轰", +"轡": "辔", +"轢": "轹", +"轤": "轳", +"辟": "辟", +"辦": "办", +"辭": "辞", +"辮": "辫", +"辯": "辩", +"農": "农", +"迴": "回", +"适": "适", +"逕": "迳", +"這": "这", +"連": "连", +"週": "周", +"進": "进", +"遊": "游", +"運": "运", +"過": "过", +"達": "达", +"違": "违", +"遙": "遥", +"遜": "逊", +"遞": "递", +"遠": "远", +"適": "适", +"遲": "迟", +"遷": "迁", +"選": "选", +"遺": "遗", +"遼": "辽", +"邁": "迈", +"還": "还", +"邇": "迩", +"邊": "边", +"邏": "逻", +"邐": "逦", +"郁": "郁", +"郟": "郏", +"郵": "邮", +"鄆": "郓", +"鄉": "乡", +"鄒": "邹", +"鄔": "邬", +"鄖": "郧", +"鄧": "邓", +"鄭": "郑", +"鄰": "邻", +"鄲": "郸", +"鄴": "邺", +"鄶": "郐", +"鄺": "邝", +"酇": "酂", +"酈": "郦", +"醖": "酝", +"醜": "丑", +"醞": "酝", +"醫": "医", +"醬": "酱", +"醱": "酦", +"釀": "酿", +"釁": "衅", +"釃": "酾", +"釅": "酽", +"采": "采", +"釋": "释", +"釐": "厘", +"釒": "钅", +"釓": "钆", +"釔": "钇", +"釕": "钌", +"釗": "钊", +"釘": "钉", +"釙": "钋", +"針": "针", +"釣": "钓", +"釤": "钐", +"釧": "钏", +"釩": "钒", +"釵": "钗", +"釷": "钍", +"釹": "钕", +"釺": "钎", +"鈀": "钯", +"鈁": "钫", +"鈃": "钘", +"鈄": "钭", +"鈈": "钚", +"鈉": "钠", +"鈍": "钝", +"鈎": "钩", +"鈐": "钤", +"鈑": "钣", +"鈒": "钑", +"鈔": "钞", +"鈕": "钮", +"鈞": "钧", +"鈣": "钙", +"鈥": "钬", +"鈦": "钛", +"鈧": "钪", +"鈮": "铌", +"鈰": "铈", +"鈳": "钶", +"鈴": "铃", +"鈷": "钴", +"鈸": "钹", +"鈹": "铍", +"鈺": "钰", +"鈽": "钸", +"鈾": "铀", +"鈿": "钿", +"鉀": "钾", +"鉅": "钜", +"鉈": "铊", +"鉉": "铉", +"鉋": "铇", +"鉍": "铋", +"鉑": "铂", +"鉕": "钷", +"鉗": "钳", +"鉚": "铆", +"鉛": "铅", +"鉞": "钺", +"鉢": "钵", +"鉤": "钩", +"鉦": "钲", +"鉬": "钼", +"鉭": "钽", +"鉶": "铏", +"鉸": "铰", +"鉺": "铒", +"鉻": "铬", +"鉿": "铪", +"銀": "银", +"銃": "铳", +"銅": "铜", +"銍": "铚", +"銑": "铣", +"銓": "铨", +"銖": "铢", +"銘": "铭", +"銚": "铫", +"銛": "铦", +"銜": "衔", +"銠": "铑", +"銣": "铷", +"銥": "铱", +"銦": "铟", +"銨": "铵", +"銩": "铥", +"銪": "铕", +"銫": "铯", +"銬": "铐", +"銱": "铞", +"銳": "锐", +"銷": "销", +"銹": "锈", +"銻": "锑", +"銼": "锉", +"鋁": "铝", +"鋃": "锒", +"鋅": "锌", +"鋇": "钡", +"鋌": "铤", +"鋏": "铗", +"鋒": "锋", +"鋙": "铻", +"鋝": "锊", +"鋟": "锓", +"鋣": "铘", +"鋤": "锄", +"鋥": "锃", +"鋦": "锔", +"鋨": "锇", +"鋩": "铓", +"鋪": "铺", +"鋭": "锐", +"鋮": "铖", +"鋯": "锆", +"鋰": "锂", +"鋱": "铽", +"鋶": "锍", +"鋸": "锯", +"鋼": "钢", +"錁": "锞", +"錄": "录", +"錆": "锖", +"錇": "锫", +"錈": "锩", +"錏": "铔", +"錐": "锥", +"錒": "锕", +"錕": "锟", +"錘": "锤", +"錙": "锱", +"錚": "铮", +"錛": "锛", +"錟": "锬", +"錠": "锭", +"錡": "锜", +"錢": "钱", +"錦": "锦", +"錨": "锚", +"錩": "锠", +"錫": "锡", +"錮": "锢", +"錯": "错", +"録": "录", +"錳": "锰", +"錶": "表", +"錸": "铼", +"鍀": "锝", +"鍁": "锨", +"鍃": "锪", +"鍆": "钔", +"鍇": "锴", +"鍈": "锳", +"鍋": "锅", +"鍍": "镀", +"鍔": "锷", +"鍘": "铡", +"鍚": "钖", +"鍛": "锻", +"鍠": "锽", +"鍤": "锸", +"鍥": "锲", +"鍩": "锘", +"鍬": "锹", +"鍰": "锾", +"鍵": "键", +"鍶": "锶", +"鍺": "锗", +"鍾": "钟", +"鎂": "镁", +"鎄": "锿", +"鎇": "镅", +"鎊": "镑", +"鎔": "镕", +"鎖": "锁", +"鎘": "镉", +"鎚": "锤", +"鎛": "镈", +"鎝": "𨱏", +"鎡": "镃", +"鎢": "钨", +"鎣": "蓥", +"鎦": "镏", +"鎧": "铠", +"鎩": "铩", +"鎪": "锼", +"鎬": "镐", +"鎮": "镇", +"鎰": "镒", +"鎲": "镋", +"鎳": "镍", +"鎵": "镓", +"鎸": "镌", +"鎿": "镎", +"鏃": "镞", +"鏇": "镟", +"鏈": "链", +"鏌": "镆", +"鏍": "镙", +"鏐": "镠", +"鏑": "镝", +"鏗": "铿", +"鏘": "锵", +"鏜": "镗", +"鏝": "镘", +"鏞": "镛", +"鏟": "铲", +"鏡": "镜", +"鏢": "镖", +"鏤": "镂", +"鏨": "錾", +"鏰": "镚", +"鏵": "铧", +"鏷": "镤", +"鏹": "镪", +"鏽": "锈", +"鐃": "铙", +"鐋": "铴", +"鐐": "镣", +"鐒": "铹", +"鐓": "镦", +"鐔": "镡", +"鐘": "钟", +"鐙": "镫", +"鐝": "镢", +"鐠": "镨", +"鐦": "锎", +"鐧": "锏", +"鐨": "镄", +"鐫": "镌", +"鐮": "镰", +"鐲": "镯", +"鐳": "镭", +"鐵": "铁", +"鐶": "镮", +"鐸": "铎", +"鐺": "铛", +"鐿": "镱", +"鑄": "铸", +"鑊": "镬", +"鑌": "镔", +"鑒": "鉴", +"鑔": "镲", +"鑕": "锧", +"鑞": "镴", +"鑠": "铄", +"鑣": "镳", +"鑥": "镥", +"鑭": "镧", +"鑰": "钥", +"鑱": "镵", +"鑲": "镶", +"鑷": "镊", +"鑹": "镩", +"鑼": "锣", +"鑽": "钻", +"鑾": "銮", +"鑿": "凿", +"钁": "镢", +"镟": "旋", +"長": "长", +"門": "门", +"閂": "闩", +"閃": "闪", +"閆": "闫", +"閈": "闬", +"閉": "闭", +"開": "开", +"閌": "闶", +"閎": "闳", +"閏": "闰", +"閑": "闲", +"間": "间", +"閔": "闵", +"閘": "闸", +"閡": "阂", +"閣": "阁", +"閤": "合", +"閥": "阀", +"閨": "闺", +"閩": "闽", +"閫": "阃", +"閬": "阆", +"閭": "闾", +"閱": "阅", +"閲": "阅", +"閶": "阊", +"閹": "阉", +"閻": "阎", +"閼": "阏", +"閽": "阍", +"閾": "阈", +"閿": "阌", +"闃": "阒", +"闆": "板", +"闈": "闱", +"闊": "阔", +"闋": "阕", +"闌": "阑", +"闍": "阇", +"闐": "阗", +"闒": "阘", +"闓": "闿", +"闔": "阖", +"闕": "阙", +"闖": "闯", +"關": "关", +"闞": "阚", +"闠": "阓", +"闡": "阐", +"闤": "阛", +"闥": "闼", +"阪": "坂", +"陘": "陉", +"陝": "陕", +"陣": "阵", +"陰": "阴", +"陳": "陈", +"陸": "陆", +"陽": "阳", +"隉": "陧", +"隊": "队", +"階": "阶", +"隕": "陨", +"際": "际", +"隨": "随", +"險": "险", +"隱": "隐", +"隴": "陇", +"隸": "隶", +"隻": "只", +"雋": "隽", +"雖": "虽", +"雙": "双", +"雛": "雏", +"雜": "杂", +"雞": "鸡", +"離": "离", +"難": "难", +"雲": "云", +"電": "电", +"霢": "霡", +"霧": "雾", +"霽": "霁", +"靂": "雳", +"靄": "霭", +"靈": "灵", +"靚": "靓", +"靜": "静", +"靨": "靥", +"鞀": "鼗", +"鞏": "巩", +"鞝": "绱", +"鞦": "秋", +"鞽": "鞒", +"韁": "缰", +"韃": "鞑", +"韆": "千", +"韉": "鞯", +"韋": "韦", +"韌": "韧", +"韍": "韨", +"韓": "韩", +"韙": "韪", +"韜": "韬", +"韞": "韫", +"韻": "韵", +"響": "响", +"頁": "页", +"頂": "顶", +"頃": "顷", +"項": "项", +"順": "顺", +"頇": "顸", +"須": "须", +"頊": "顼", +"頌": "颂", +"頎": "颀", +"頏": "颃", +"預": "预", +"頑": "顽", +"頒": "颁", +"頓": "顿", +"頗": "颇", +"領": "领", +"頜": "颌", +"頡": "颉", +"頤": "颐", +"頦": "颏", +"頭": "头", +"頮": "颒", +"頰": "颊", +"頲": "颋", +"頴": "颕", +"頷": "颔", +"頸": "颈", +"頹": "颓", +"頻": "频", +"頽": "颓", +"顆": "颗", +"題": "题", +"額": "额", +"顎": "颚", +"顏": "颜", +"顒": "颙", +"顓": "颛", +"顔": "颜", +"願": "愿", +"顙": "颡", +"顛": "颠", +"類": "类", +"顢": "颟", +"顥": "颢", +"顧": "顾", +"顫": "颤", +"顬": "颥", +"顯": "显", +"顰": "颦", +"顱": "颅", +"顳": "颞", +"顴": "颧", +"風": "风", +"颭": "飐", +"颮": "飑", +"颯": "飒", +"颱": "台", +"颳": "刮", +"颶": "飓", +"颸": "飔", +"颺": "飏", +"颻": "飖", +"颼": "飕", +"飀": "飗", +"飄": "飘", +"飆": "飙", +"飈": "飚", +"飛": "飞", +"飠": "饣", +"飢": "饥", +"飣": "饤", +"飥": "饦", +"飩": "饨", +"飪": "饪", +"飫": "饫", +"飭": "饬", +"飯": "饭", +"飲": "饮", +"飴": "饴", +"飼": "饲", +"飽": "饱", +"飾": "饰", +"飿": "饳", +"餃": "饺", +"餄": "饸", +"餅": "饼", +"餉": "饷", +"養": "养", +"餌": "饵", +"餎": "饹", +"餏": "饻", +"餑": "饽", +"餒": "馁", +"餓": "饿", +"餕": "馂", +"餖": "饾", +"餚": "肴", +"餛": "馄", +"餜": "馃", +"餞": "饯", +"餡": "馅", +"館": "馆", +"餱": "糇", +"餳": "饧", +"餶": "馉", +"餷": "馇", +"餺": "馎", +"餼": "饩", +"餾": "馏", +"餿": "馊", +"饁": "馌", +"饃": "馍", +"饅": "馒", +"饈": "馐", +"饉": "馑", +"饊": "馓", +"饋": "馈", +"饌": "馔", +"饑": "饥", +"饒": "饶", +"饗": "飨", +"饜": "餍", +"饞": "馋", +"饢": "馕", +"馬": "马", +"馭": "驭", +"馮": "冯", +"馱": "驮", +"馳": "驰", +"馴": "驯", +"馹": "驲", +"駁": "驳", +"駐": "驻", +"駑": "驽", +"駒": "驹", +"駔": "驵", +"駕": "驾", +"駘": "骀", +"駙": "驸", +"駛": "驶", +"駝": "驼", +"駟": "驷", +"駡": "骂", +"駢": "骈", +"駭": "骇", +"駰": "骃", +"駱": "骆", +"駸": "骎", +"駿": "骏", +"騁": "骋", +"騂": "骍", +"騅": "骓", +"騌": "骔", +"騍": "骒", +"騎": "骑", +"騏": "骐", +"騖": "骛", +"騙": "骗", +"騤": "骙", +"騧": "䯄", +"騫": "骞", +"騭": "骘", +"騮": "骝", +"騰": "腾", +"騶": "驺", +"騷": "骚", +"騸": "骟", +"騾": "骡", +"驀": "蓦", +"驁": "骜", +"驂": "骖", +"驃": "骠", +"驄": "骢", +"驅": "驱", +"驊": "骅", +"驌": "骕", +"驍": "骁", +"驏": "骣", +"驕": "骄", +"驗": "验", +"驚": "惊", +"驛": "驿", +"驟": "骤", +"驢": "驴", +"驤": "骧", +"驥": "骥", +"驦": "骦", +"驪": "骊", +"驫": "骉", +"骯": "肮", +"髏": "髅", +"髒": "脏", +"體": "体", +"髕": "髌", +"髖": "髋", +"髮": "发", +"鬆": "松", +"鬍": "胡", +"鬚": "须", +"鬢": "鬓", +"鬥": "斗", +"鬧": "闹", +"鬩": "阋", +"鬮": "阄", +"鬱": "郁", +"魎": "魉", +"魘": "魇", +"魚": "鱼", +"魛": "鱽", +"魢": "鱾", +"魨": "鲀", +"魯": "鲁", +"魴": "鲂", +"魷": "鱿", +"魺": "鲄", +"鮁": "鲅", +"鮃": "鲆", +"鮊": "鲌", +"鮋": "鲉", +"鮍": "鲏", +"鮎": "鲇", +"鮐": "鲐", +"鮑": "鲍", +"鮒": "鲋", +"鮓": "鲊", +"鮚": "鲒", +"鮜": "鲘", +"鮝": "鲞", +"鮞": "鲕", +"鮦": "鲖", +"鮪": "鲔", +"鮫": "鲛", +"鮭": "鲑", +"鮮": "鲜", +"鮳": "鲓", +"鮶": "鲪", +"鮺": "鲝", +"鯀": "鲧", +"鯁": "鲠", +"鯇": "鲩", +"鯉": "鲤", +"鯊": "鲨", +"鯒": "鲬", +"鯔": "鲻", +"鯕": "鲯", +"鯖": "鲭", +"鯗": "鲞", +"鯛": "鲷", +"鯝": "鲴", +"鯡": "鲱", +"鯢": "鲵", +"鯤": "鲲", +"鯧": "鲳", +"鯨": "鲸", +"鯪": "鲮", +"鯫": "鲰", +"鯴": "鲺", +"鯷": "鳀", +"鯽": "鲫", +"鯿": "鳊", +"鰁": "鳈", +"鰂": "鲗", +"鰃": "鳂", +"鰈": "鲽", +"鰉": "鳇", +"鰍": "鳅", +"鰏": "鲾", +"鰐": "鳄", +"鰒": "鳆", +"鰓": "鳃", +"鰜": "鳒", +"鰟": "鳑", +"鰠": "鳋", +"鰣": "鲥", +"鰥": "鳏", +"鰨": "鳎", +"鰩": "鳐", +"鰭": "鳍", +"鰮": "鳁", +"鰱": "鲢", +"鰲": "鳌", +"鰳": "鳓", +"鰵": "鳘", +"鰷": "鲦", +"鰹": "鲣", +"鰺": "鲹", +"鰻": "鳗", +"鰼": "鳛", +"鰾": "鳔", +"鱂": "鳉", +"鱅": "鳙", +"鱈": "鳕", +"鱉": "鳖", +"鱒": "鳟", +"鱔": "鳝", +"鱖": "鳜", +"鱗": "鳞", +"鱘": "鲟", +"鱝": "鲼", +"鱟": "鲎", +"鱠": "鲙", +"鱣": "鳣", +"鱤": "鳡", +"鱧": "鳢", +"鱨": "鲿", +"鱭": "鲚", +"鱯": "鳠", +"鱷": "鳄", +"鱸": "鲈", +"鱺": "鲡", +"䰾": "鲃", +"䲁": "鳚", +"鳥": "鸟", +"鳧": "凫", +"鳩": "鸠", +"鳬": "凫", +"鳲": "鸤", +"鳳": "凤", +"鳴": "鸣", +"鳶": "鸢", +"鳾": "䴓", +"鴆": "鸩", +"鴇": "鸨", +"鴉": "鸦", +"鴒": "鸰", +"鴕": "鸵", +"鴛": "鸳", +"鴝": "鸲", +"鴞": "鸮", +"鴟": "鸱", +"鴣": "鸪", +"鴦": "鸯", +"鴨": "鸭", +"鴯": "鸸", +"鴰": "鸹", +"鴴": "鸻", +"鴷": "䴕", +"鴻": "鸿", +"鴿": "鸽", +"鵁": "䴔", +"鵂": "鸺", +"鵃": "鸼", +"鵐": "鹀", +"鵑": "鹃", +"鵒": "鹆", +"鵓": "鹁", +"鵜": "鹈", +"鵝": "鹅", +"鵠": "鹄", +"鵡": "鹉", +"鵪": "鹌", +"鵬": "鹏", +"鵮": "鹐", +"鵯": "鹎", +"鵲": "鹊", +"鵷": "鹓", +"鵾": "鹍", +"鶄": "䴖", +"鶇": "鸫", +"鶉": "鹑", +"鶊": "鹒", +"鶓": "鹋", +"鶖": "鹙", +"鶘": "鹕", +"鶚": "鹗", +"鶡": "鹖", +"鶥": "鹛", +"鶩": "鹜", +"鶪": "䴗", +"鶬": "鸧", +"鶯": "莺", +"鶲": "鹟", +"鶴": "鹤", +"鶹": "鹠", +"鶺": "鹡", +"鶻": "鹘", +"鶼": "鹣", +"鶿": "鹚", +"鷀": "鹚", +"鷁": "鹢", +"鷂": "鹞", +"鷄": "鸡", +"鷈": "䴘", +"鷊": "鹝", +"鷓": "鹧", +"鷖": "鹥", +"鷗": "鸥", +"鷙": "鸷", +"鷚": "鹨", +"鷥": "鸶", +"鷦": "鹪", +"鷫": "鹔", +"鷯": "鹩", +"鷲": "鹫", +"鷳": "鹇", +"鷸": "鹬", +"鷹": "鹰", +"鷺": "鹭", +"鷽": "鸴", +"鷿": "䴙", +"鸂": "㶉", +"鸇": "鹯", +"鸌": "鹱", +"鸏": "鹲", +"鸕": "鸬", +"鸘": "鹴", +"鸚": "鹦", +"鸛": "鹳", +"鸝": "鹂", +"鸞": "鸾", +"鹵": "卤", +"鹹": "咸", +"鹺": "鹾", +"鹽": "盐", +"麗": "丽", +"麥": "麦", +"麩": "麸", +"麯": "曲", +"麵": "面", +"麼": "么", +"麽": "么", +"黃": "黄", +"黌": "黉", +"點": "点", +"黨": "党", +"黲": "黪", +"黴": "霉", +"黶": "黡", +"黷": "黩", +"黽": "黾", +"黿": "鼋", +"鼉": "鼍", +"鼕": "冬", +"鼴": "鼹", +"齊": "齐", +"齋": "斋", +"齎": "赍", +"齏": "齑", +"齒": "齿", +"齔": "龀", +"齕": "龁", +"齗": "龂", +"齙": "龅", +"齜": "龇", +"齟": "龃", +"齠": "龆", +"齡": "龄", +"齣": "出", +"齦": "龈", +"齪": "龊", +"齬": "龉", +"齲": "龋", +"齶": "腭", +"齷": "龌", +"龍": "龙", +"龎": "厐", +"龐": "庞", +"龔": "龚", +"龕": "龛", +"龜": "龟", + +"幾畫": "几画", +"賣畫": "卖画", +"滷鹼": "卤碱", +"原畫": "原画", +"口鹼": "口碱", +"古畫": "古画", +"名畫": "名画", +"奇畫": "奇画", +"如畫": "如画", +"弱鹼": "弱碱", +"彩畫": "彩画", +"所畫": "所画", +"扉畫": "扉画", +"教畫": "教画", +"水鹼": "水碱", +"洋鹼": "洋碱", +"炭畫": "炭画", +"畫一": "画一", +"畫上": "画上", +"畫下": "画下", +"畫中": "画中", +"畫供": "画供", +"畫兒": "画儿", +"畫具": "画具", +"畫出": "画出", +"畫史": "画史", +"畫品": "画品", +"畫商": "画商", +"畫圈": "画圈", +"畫境": "画境", +"畫工": "画工", +"畫帖": "画帖", +"畫幅": "画幅", +"畫意": "画意", +"畫成": "画成", +"畫景": "画景", +"畫本": "画本", +"畫架": "画架", +"畫框": "画框", +"畫法": "画法", +"畫王": "画王", +"畫界": "画界", +"畫符": "画符", +"畫紙": "画纸", +"畫線": "画线", +"畫航": "画航", +"畫舫": "画舫", +"畫虎": "画虎", +"畫論": "画论", +"畫譜": "画谱", +"畫象": "画象", +"畫質": "画质", +"畫貼": "画贴", +"畫軸": "画轴", +"畫頁": "画页", +"鹽鹼": "盐碱", +"鹼": "碱", +"鹼基": "碱基", +"鹼度": "碱度", +"鹼水": "碱水", +"鹼熔": "碱熔", +"磁畫": "磁画", +"策畫": "策画", +"組畫": "组画", +"絹畫": "绢画", +"耐鹼": "耐碱", +"肉鹼": "肉碱", +"膠畫": "胶画", +"茶鹼": "茶碱", +"西畫": "西画", +"貼畫": "贴画", +"返鹼": "返碱", +"鍾鍛": "锺锻", +"鍛鍾": "锻锺", +"雕畫": "雕画", +"鯰": "鲶", +"三聯畫": "三联画", +"中國畫": "中国画", +"書畫": "书画", +"書畫社": "书画社", +"五筆畫": "五笔画", +"作畫": "作画", +"入畫": "入画", +"寫生畫": "写生画", +"刻畫": "刻画", +"動畫": "动画", +"勾畫": "勾画", +"單色畫": "单色画", +"卡通畫": "卡通画", +"國畫": "国画", +"圖畫": "图画", +"壁畫": "壁画", +"字畫": "字画", +"宣傳畫": "宣传画", +"工筆畫": "工笔画", +"年畫": "年画", +"幽默畫": "幽默画", +"指畫": "指画", +"描畫": "描画", +"插畫": "插画", +"擘畫": "擘画", +"春畫": "春画", +"木刻畫": "木刻画", +"機械畫": "机械画", +"比畫": "比画", +"毛筆畫": "毛笔画", +"水粉畫": "水粉画", +"油畫": "油画", +"海景畫": "海景画", +"漫畫": "漫画", +"點畫": "点画", +"版畫": "版画", +"畫": "画", +"畫像": "画像", +"畫冊": "画册", +"畫刊": "画刊", +"畫匠": "画匠", +"畫捲": "画卷", +"畫圖": "画图", +"畫壇": "画坛", +"畫室": "画室", +"畫家": "画家", +"畫屏": "画屏", +"畫展": "画展", +"畫布": "画布", +"畫師": "画师", +"畫廊": "画廊", +"畫報": "画报", +"畫押": "画押", +"畫板": "画板", +"畫片": "画片", +"畫畫": "画画", +"畫皮": "画皮", +"畫眉鳥": "画眉鸟", +"畫稿": "画稿", +"畫筆": "画笔", +"畫院": "画院", +"畫集": "画集", +"畫面": "画面", +"筆畫": "笔画", +"細密畫": "细密画", +"繪畫": "绘画", +"自畫像": "自画像", +"蠟筆畫": "蜡笔画", +"裸體畫": "裸体画", +"西洋畫": "西洋画", +"透視畫": "透视画", +"銅版畫": "铜版画", +"鍾": "锺", +"靜物畫": "静物画", +"餘": "馀", +} + +zh2TW = { +"缺省": "預設", +"串行": "串列", +"以太网": "乙太網", +"位图": "點陣圖", +"例程": "常式", +"信道": "通道", +"光标": "游標", +"光盘": "光碟", +"光驱": "光碟機", +"全角": "全形", +"加载": "載入", +"半角": "半形", +"变量": "變數", +"噪声": "雜訊", +"脱机": "離線", +"声卡": "音效卡", +"老字号": "老字號", +"字号": "字型大小", +"字库": "字型檔", +"字段": "欄位", +"字符": "字元", +"存盘": "存檔", +"寻址": "定址", +"尾注": "章節附註", +"异步": "非同步", +"总线": "匯流排", +"括号": "括弧", +"接口": "介面", +"控件": "控制項", +"权限": "許可權", +"盘片": "碟片", +"硅片": "矽片", +"硅谷": "矽谷", +"硬盘": "硬碟", +"磁盘": "磁碟", +"磁道": "磁軌", +"程控": "程式控制", +"端口": "埠", +"算子": "運算元", +"算法": "演算法", +"芯片": "晶片", +"芯片": "晶元", +"词组": "片語", +"译码": "解碼", +"软驱": "軟碟機", +"快闪存储器": "快閃記憶體", +"闪存": "快閃記憶體", +"鼠标": "滑鼠", +"进制": "進位", +"交互式": "互動式", +"仿真": "模擬", +"优先级": "優先順序", +"传感": "感測", +"便携式": "攜帶型", +"信息论": "資訊理論", +"写保护": "防寫", +"分布式": "分散式", +"分辨率": "解析度", +"服务器": "伺服器", +"等于": "等於", +"局域网": "區域網", +"计算机": "電腦", +"扫瞄仪": "掃瞄器", +"宽带": "寬頻", +"数据库": "資料庫", +"奶酪": "乳酪", +"巨商": "鉅賈", +"手电": "手電筒", +"万历": "萬曆", +"永历": "永曆", +"词汇": "辭彙", +"习用": "慣用", +"元音": "母音", +"任意球": "自由球", +"头球": "頭槌", +"入球": "進球", +"粒入球": "顆進球", +"打门": "射門", +"火锅盖帽": "蓋火鍋", +"打印机": "印表機", +"打印機": "印表機", +"字节": "位元組", +"字節": "位元組", +"打印": "列印", +"打印": "列印", +"硬件": "硬體", +"硬件": "硬體", +"二极管": "二極體", +"二極管": "二極體", +"三极管": "三極體", +"三極管": "三極體", +"软件": "軟體", +"軟件": "軟體", +"网络": "網路", +"網絡": "網路", +"人工智能": "人工智慧", +"航天飞机": "太空梭", +"穿梭機": "太空梭", +"因特网": "網際網路", +"互聯網": "網際網路", +"机器人": "機器人", +"機械人": "機器人", +"移动电话": "行動電話", +"流動電話": "行動電話", +"调制解调器": "數據機", +"調制解調器": "數據機", +"短信": "簡訊", +"短訊": "簡訊", +"乌兹别克斯坦": "烏茲別克", +"乍得": "查德", +"乍得": "查德", +"也门": "葉門", +"也門": "葉門", +"伯利兹": "貝里斯", +"伯利茲": "貝里斯", +"佛得角": "維德角", +"佛得角": "維德角", +"克罗地亚": "克羅埃西亞", +"克羅地亞": "克羅埃西亞", +"冈比亚": "甘比亞", +"岡比亞": "甘比亞", +"几内亚比绍": "幾內亞比索", +"幾內亞比紹": "幾內亞比索", +"列支敦士登": "列支敦斯登", +"列支敦士登": "列支敦斯登", +"利比里亚": "賴比瑞亞", +"利比里亞": "賴比瑞亞", +"加纳": "迦納", +"加納": "迦納", +"加蓬": "加彭", +"加蓬": "加彭", +"博茨瓦纳": "波札那", +"博茨瓦納": "波札那", +"卡塔尔": "卡達", +"卡塔爾": "卡達", +"卢旺达": "盧安達", +"盧旺達": "盧安達", +"危地马拉": "瓜地馬拉", +"危地馬拉": "瓜地馬拉", +"厄瓜多尔": "厄瓜多", +"厄瓜多爾": "厄瓜多", +"厄立特里亚": "厄利垂亞", +"厄立特里亞": "厄利垂亞", +"吉布提": "吉布地", +"吉布堤": "吉布地", +"哈萨克斯坦": "哈薩克", +"哥斯达黎加": "哥斯大黎加", +"哥斯達黎加": "哥斯大黎加", +"图瓦卢": "吐瓦魯", +"圖瓦盧": "吐瓦魯", +"土库曼斯坦": "土庫曼", +"圣卢西亚": "聖露西亞", +"聖盧西亞": "聖露西亞", +"圣基茨和尼维斯": "聖克里斯多福及尼維斯", +"聖吉斯納域斯": "聖克里斯多福及尼維斯", +"圣文森特和格林纳丁斯": "聖文森及格瑞那丁", +"聖文森特和格林納丁斯": "聖文森及格瑞那丁", +"圣马力诺": "聖馬利諾", +"聖馬力諾": "聖馬利諾", +"圭亚那": "蓋亞那", +"圭亞那": "蓋亞那", +"坦桑尼亚": "坦尚尼亞", +"坦桑尼亞": "坦尚尼亞", +"埃塞俄比亚": "衣索比亞", +"埃塞俄比亞": "衣索比亞", +"基里巴斯": "吉里巴斯", +"基里巴斯": "吉里巴斯", +"塔吉克斯坦": "塔吉克", +"塞拉利昂": "獅子山", +"塞拉利昂": "獅子山", +"塞浦路斯": "塞普勒斯", +"塞浦路斯": "塞普勒斯", +"塞舌尔": "塞席爾", +"塞舌爾": "塞席爾", +"多米尼加": "多明尼加", +"多明尼加共和國": "多明尼加", +"多米尼加联邦": "多米尼克", +"多明尼加聯邦": "多米尼克", +"安提瓜和巴布达": "安地卡及巴布達", +"安提瓜和巴布達": "安地卡及巴布達", +"尼日利亚": "奈及利亞", +"尼日利亞": "奈及利亞", +"尼日尔": "尼日", +"尼日爾": "尼日", +"巴巴多斯": "巴貝多", +"巴巴多斯": "巴貝多", +"巴布亚新几内亚": "巴布亞紐幾內亞", +"巴布亞新畿內亞": "巴布亞紐幾內亞", +"布基纳法索": "布吉納法索", +"布基納法索": "布吉納法索", +"布隆迪": "蒲隆地", +"布隆迪": "蒲隆地", +"希腊": "希臘", +"帕劳": "帛琉", +"意大利": "義大利", +"意大利": "義大利", +"所罗门群岛": "索羅門群島", +"所羅門群島": "索羅門群島", +"文莱": "汶萊", +"斯威士兰": "史瓦濟蘭", +"斯威士蘭": "史瓦濟蘭", +"斯洛文尼亚": "斯洛維尼亞", +"斯洛文尼亞": "斯洛維尼亞", +"新西兰": "紐西蘭", +"新西蘭": "紐西蘭", +"格林纳达": "格瑞那達", +"格林納達": "格瑞那達", +"格鲁吉亚": "喬治亞", +"格魯吉亞": "喬治亞", +"佐治亚": "喬治亞", +"佐治亞": "喬治亞", +"毛里塔尼亚": "茅利塔尼亞", +"毛里塔尼亞": "茅利塔尼亞", +"毛里求斯": "模里西斯", +"毛里裘斯": "模里西斯", +"沙特阿拉伯": "沙烏地阿拉伯", +"沙地阿拉伯": "沙烏地阿拉伯", +"波斯尼亚和黑塞哥维那": "波士尼亞赫塞哥維納", +"波斯尼亞黑塞哥維那": "波士尼亞赫塞哥維納", +"津巴布韦": "辛巴威", +"津巴布韋": "辛巴威", +"洪都拉斯": "宏都拉斯", +"洪都拉斯": "宏都拉斯", +"特立尼达和托巴哥": "千里達托貝哥", +"特立尼達和多巴哥": "千里達托貝哥", +"瑙鲁": "諾魯", +"瑙魯": "諾魯", +"瓦努阿图": "萬那杜", +"瓦努阿圖": "萬那杜", +"溫納圖萬": "那杜", +"科摩罗": "葛摩", +"科摩羅": "葛摩", +"科特迪瓦": "象牙海岸", +"突尼斯": "突尼西亞", +"索马里": "索馬利亞", +"索馬里": "索馬利亞", +"老挝": "寮國", +"老撾": "寮國", +"肯尼亚": "肯亞", +"肯雅": "肯亞", +"苏里南": "蘇利南", +"莫桑比克": "莫三比克", +"莱索托": "賴索托", +"萊索托": "賴索托", +"贝宁": "貝南", +"貝寧": "貝南", +"赞比亚": "尚比亞", +"贊比亞": "尚比亞", +"阿塞拜疆": "亞塞拜然", +"阿塞拜疆": "亞塞拜然", +"阿拉伯联合酋长国": "阿拉伯聯合大公國", +"阿拉伯聯合酋長國": "阿拉伯聯合大公國", +"马尔代夫": "馬爾地夫", +"馬爾代夫": "馬爾地夫", +"马耳他": "馬爾他", +"马里共和国": "馬利共和國", +"馬里共和國": "馬利共和國", +"方便面": "速食麵", +"快速面": "速食麵", +"即食麵": "速食麵", +"薯仔": "土豆", +"蹦极跳": "笨豬跳", +"绑紧跳": "笨豬跳", +"冷菜": "冷盤", +"凉菜": "冷盤", +"出租车": "計程車", +"台球": "撞球", +"桌球": "撞球", +"雪糕": "冰淇淋", +"卫生": "衛生", +"衞生": "衛生", +"平治": "賓士", +"奔驰": "賓士", +"積架": "捷豹", +"福士": "福斯", +"雪铁龙": "雪鐵龍", +"马自达": "馬自達", +"萬事得": "馬自達", +"拿破仑": "拿破崙", +"拿破侖": "拿破崙", +"布什": "布希", +"布殊": "布希", +"克林顿": "柯林頓", +"克林頓": "柯林頓", +"侯赛因": "海珊", +"侯賽因": "海珊", +"凡高": "梵谷", +"狄安娜": "黛安娜", +"戴安娜": "黛安娜", +"赫拉": "希拉", +} + +zh2HK = { +"打印机": "打印機", +"印表機": "打印機", +"字节": "位元組", +"字節": "位元組", +"打印": "打印", +"列印": "打印", +"硬件": "硬件", +"硬體": "硬件", +"二极管": "二極管", +"二極體": "二極管", +"三极管": "三極管", +"三極體": "三極管", +"数码": "數碼", +"數位": "數碼", +"软件": "軟件", +"軟體": "軟件", +"网络": "網絡", +"網路": "網絡", +"人工智能": "人工智能", +"人工智慧": "人工智能", +"航天飞机": "穿梭機", +"太空梭": "穿梭機", +"因特网": "互聯網", +"網際網路": "互聯網", +"机器人": "機械人", +"機器人": "機械人", +"移动电话": "流動電話", +"行動電話": "流動電話", +"调制解调器": "調制解調器", +"數據機": "調制解調器", +"短信": "短訊", +"簡訊": "短訊", +"乍得": "乍得", +"查德": "乍得", +"也门": "也門", +"葉門": "也門", +"伯利兹": "伯利茲", +"貝里斯": "伯利茲", +"佛得角": "佛得角", +"維德角": "佛得角", +"克罗地亚": "克羅地亞", +"克羅埃西亞": "克羅地亞", +"冈比亚": "岡比亞", +"甘比亞": "岡比亞", +"几内亚比绍": "幾內亞比紹", +"幾內亞比索": "幾內亞比紹", +"列支敦士登": "列支敦士登", +"列支敦斯登": "列支敦士登", +"利比里亚": "利比里亞", +"賴比瑞亞": "利比里亞", +"加纳": "加納", +"迦納": "加納", +"加蓬": "加蓬", +"加彭": "加蓬", +"博茨瓦纳": "博茨瓦納", +"波札那": "博茨瓦納", +"卡塔尔": "卡塔爾", +"卡達": "卡塔爾", +"卢旺达": "盧旺達", +"盧安達": "盧旺達", +"危地马拉": "危地馬拉", +"瓜地馬拉": "危地馬拉", +"厄瓜多尔": "厄瓜多爾", +"厄瓜多": "厄瓜多爾", +"厄立特里亚": "厄立特里亞", +"厄利垂亞": "厄立特里亞", +"吉布提": "吉布堤", +"吉布地": "吉布堤", +"哥斯达黎加": "哥斯達黎加", +"哥斯大黎加": "哥斯達黎加", +"图瓦卢": "圖瓦盧", +"吐瓦魯": "圖瓦盧", +"圣卢西亚": "聖盧西亞", +"聖露西亞": "聖盧西亞", +"圣基茨和尼维斯": "聖吉斯納域斯", +"聖克里斯多福及尼維斯": "聖吉斯納域斯", +"圣文森特和格林纳丁斯": "聖文森特和格林納丁斯", +"聖文森及格瑞那丁": "聖文森特和格林納丁斯", +"圣马力诺": "聖馬力諾", +"聖馬利諾": "聖馬力諾", +"圭亚那": "圭亞那", +"蓋亞那": "圭亞那", +"坦桑尼亚": "坦桑尼亞", +"坦尚尼亞": "坦桑尼亞", +"埃塞俄比亚": "埃塞俄比亞", +"衣索匹亞": "埃塞俄比亞", +"衣索比亞": "埃塞俄比亞", +"基里巴斯": "基里巴斯", +"吉里巴斯": "基里巴斯", +"狮子山": "獅子山", +"塞普勒斯": "塞浦路斯", +"塞舌尔": "塞舌爾", +"塞席爾": "塞舌爾", +"多米尼加": "多明尼加共和國", +"多明尼加": "多明尼加共和國", +"多米尼加联邦": "多明尼加聯邦", +"多米尼克": "多明尼加聯邦", +"安提瓜和巴布达": "安提瓜和巴布達", +"安地卡及巴布達": "安提瓜和巴布達", +"尼日利亚": "尼日利亞", +"奈及利亞": "尼日利亞", +"尼日尔": "尼日爾", +"尼日": "尼日爾", +"巴巴多斯": "巴巴多斯", +"巴貝多": "巴巴多斯", +"巴布亚新几内亚": "巴布亞新畿內亞", +"巴布亞紐幾內亞": "巴布亞新畿內亞", +"布基纳法索": "布基納法索", +"布吉納法索": "布基納法索", +"布隆迪": "布隆迪", +"蒲隆地": "布隆迪", +"義大利": "意大利", +"所罗门群岛": "所羅門群島", +"索羅門群島": "所羅門群島", +"斯威士兰": "斯威士蘭", +"史瓦濟蘭": "斯威士蘭", +"斯洛文尼亚": "斯洛文尼亞", +"斯洛維尼亞": "斯洛文尼亞", +"新西兰": "新西蘭", +"紐西蘭": "新西蘭", +"格林纳达": "格林納達", +"格瑞那達": "格林納達", +"格鲁吉亚": "喬治亞", +"格魯吉亞": "喬治亞", +"梵蒂冈": "梵蒂岡", +"毛里塔尼亚": "毛里塔尼亞", +"茅利塔尼亞": "毛里塔尼亞", +"毛里求斯": "毛里裘斯", +"模里西斯": "毛里裘斯", +"沙烏地阿拉伯": "沙特阿拉伯", +"波斯尼亚和黑塞哥维那": "波斯尼亞黑塞哥維那", +"波士尼亞赫塞哥維納": "波斯尼亞黑塞哥維那", +"津巴布韦": "津巴布韋", +"辛巴威": "津巴布韋", +"洪都拉斯": "洪都拉斯", +"宏都拉斯": "洪都拉斯", +"特立尼达和托巴哥": "特立尼達和多巴哥", +"千里達托貝哥": "特立尼達和多巴哥", +"瑙鲁": "瑙魯", +"諾魯": "瑙魯", +"瓦努阿图": "瓦努阿圖", +"萬那杜": "瓦努阿圖", +"科摩罗": "科摩羅", +"葛摩": "科摩羅", +"索马里": "索馬里", +"索馬利亞": "索馬里", +"老挝": "老撾", +"寮國": "老撾", +"肯尼亚": "肯雅", +"肯亞": "肯雅", +"莫桑比克": "莫桑比克", +"莫三比克": "莫桑比克", +"莱索托": "萊索托", +"賴索托": "萊索托", +"贝宁": "貝寧", +"貝南": "貝寧", +"赞比亚": "贊比亞", +"尚比亞": "贊比亞", +"阿塞拜疆": "阿塞拜疆", +"亞塞拜然": "阿塞拜疆", +"阿拉伯联合酋长国": "阿拉伯聯合酋長國", +"阿拉伯聯合大公國": "阿拉伯聯合酋長國", +"马尔代夫": "馬爾代夫", +"馬爾地夫": "馬爾代夫", +"馬利共和國": "馬里共和國", +"方便面": "即食麵", +"快速面": "即食麵", +"速食麵": "即食麵", +"泡麵": "即食麵", +"土豆": "馬鈴薯", +"华乐": "中樂", +"民乐": "中樂", +"計程車": "的士", +"出租车": "的士", +"公車": "巴士", +"自行车": "單車", +"犬只": "狗隻", +"台球": "桌球", +"撞球": "桌球", +"冰淇淋": "雪糕", +"賓士": "平治", +"捷豹": "積架", +"福斯": "福士", +"雪铁龙": "先進", +"雪鐵龍": "先進", +"沃尓沃": "富豪", +"马自达": "萬事得", +"馬自達": "萬事得", +"寶獅": "標致", +"拿破崙": "拿破侖", +"布什": "布殊", +"布希": "布殊", +"克林顿": "克林頓", +"柯林頓": "克林頓", +"萨达姆": "薩達姆", +"海珊": "侯賽因", +"侯赛因": "侯賽因", +"大卫·贝克汉姆": "大衛碧咸", +"迈克尔·欧文": "米高奧雲", +"珍妮弗·卡普里亚蒂": "卡佩雅蒂", +"马拉特·萨芬": "沙芬", +"迈克尔·舒马赫": "舒麥加", +"希特勒": "希特拉", +"狄安娜": "戴安娜", +"黛安娜": "戴安娜", +} + +zh2CN = { +"記憶體": "内存", +"預設": "默认", +"串列": "串行", +"乙太網": "以太网", +"點陣圖": "位图", +"常式": "例程", +"游標": "光标", +"光碟": "光盘", +"光碟機": "光驱", +"全形": "全角", +"共用": "共享", +"載入": "加载", +"半形": "半角", +"變數": "变量", +"雜訊": "噪声", +"因數": "因子", +"功能變數名稱": "域名", +"音效卡": "声卡", +"字型大小": "字号", +"字型檔": "字库", +"欄位": "字段", +"字元": "字符", +"存檔": "存盘", +"定址": "寻址", +"章節附註": "尾注", +"非同步": "异步", +"匯流排": "总线", +"括弧": "括号", +"介面": "接口", +"控制項": "控件", +"許可權": "权限", +"碟片": "盘片", +"矽片": "硅片", +"矽谷": "硅谷", +"硬碟": "硬盘", +"磁碟": "磁盘", +"磁軌": "磁道", +"程式控制": "程控", +"運算元": "算子", +"演算法": "算法", +"晶片": "芯片", +"晶元": "芯片", +"片語": "词组", +"軟碟機": "软驱", +"快閃記憶體": "快闪存储器", +"滑鼠": "鼠标", +"進位": "进制", +"互動式": "交互式", +"優先順序": "优先级", +"感測": "传感", +"攜帶型": "便携式", +"資訊理論": "信息论", +"迴圈": "循环", +"防寫": "写保护", +"分散式": "分布式", +"解析度": "分辨率", +"伺服器": "服务器", +"等於": "等于", +"區域網": "局域网", +"巨集": "宏", +"掃瞄器": "扫瞄仪", +"寬頻": "宽带", +"資料庫": "数据库", +"乳酪": "奶酪", +"鉅賈": "巨商", +"手電筒": "手电", +"萬曆": "万历", +"永曆": "永历", +"辭彙": "词汇", +"母音": "元音", +"自由球": "任意球", +"頭槌": "头球", +"進球": "入球", +"顆進球": "粒入球", +"射門": "打门", +"蓋火鍋": "火锅盖帽", +"印表機": "打印机", +"打印機": "打印机", +"位元組": "字节", +"字節": "字节", +"列印": "打印", +"打印": "打印", +"硬體": "硬件", +"二極體": "二极管", +"二極管": "二极管", +"三極體": "三极管", +"三極管": "三极管", +"數位": "数码", +"數碼": "数码", +"軟體": "软件", +"軟件": "软件", +"網路": "网络", +"網絡": "网络", +"人工智慧": "人工智能", +"太空梭": "航天飞机", +"穿梭機": "航天飞机", +"網際網路": "因特网", +"互聯網": "因特网", +"機械人": "机器人", +"機器人": "机器人", +"行動電話": "移动电话", +"流動電話": "移动电话", +"調制解調器": "调制解调器", +"數據機": "调制解调器", +"短訊": "短信", +"簡訊": "短信", +"烏茲別克": "乌兹别克斯坦", +"查德": "乍得", +"乍得": "乍得", +"也門": "", +"葉門": "也门", +"伯利茲": "伯利兹", +"貝里斯": "伯利兹", +"維德角": "佛得角", +"佛得角": "佛得角", +"克羅地亞": "克罗地亚", +"克羅埃西亞": "克罗地亚", +"岡比亞": "冈比亚", +"甘比亞": "冈比亚", +"幾內亞比紹": "几内亚比绍", +"幾內亞比索": "几内亚比绍", +"列支敦斯登": "列支敦士登", +"列支敦士登": "列支敦士登", +"利比里亞": "利比里亚", +"賴比瑞亞": "利比里亚", +"加納": "加纳", +"迦納": "加纳", +"加彭": "加蓬", +"加蓬": "加蓬", +"博茨瓦納": "博茨瓦纳", +"波札那": "博茨瓦纳", +"卡塔爾": "卡塔尔", +"卡達": "卡塔尔", +"盧旺達": "卢旺达", +"盧安達": "卢旺达", +"危地馬拉": "危地马拉", +"瓜地馬拉": "危地马拉", +"厄瓜多爾": "厄瓜多尔", +"厄瓜多": "厄瓜多尔", +"厄立特里亞": "厄立特里亚", +"厄利垂亞": "厄立特里亚", +"吉布堤": "吉布提", +"吉布地": "吉布提", +"哈薩克": "哈萨克斯坦", +"哥斯達黎加": "哥斯达黎加", +"哥斯大黎加": "哥斯达黎加", +"圖瓦盧": "图瓦卢", +"吐瓦魯": "图瓦卢", +"土庫曼": "土库曼斯坦", +"聖盧西亞": "圣卢西亚", +"聖露西亞": "圣卢西亚", +"聖吉斯納域斯": "圣基茨和尼维斯", +"聖克里斯多福及尼維斯": "圣基茨和尼维斯", +"聖文森特和格林納丁斯": "圣文森特和格林纳丁斯", +"聖文森及格瑞那丁": "圣文森特和格林纳丁斯", +"聖馬力諾": "圣马力诺", +"聖馬利諾": "圣马力诺", +"圭亞那": "圭亚那", +"蓋亞那": "圭亚那", +"坦桑尼亞": "坦桑尼亚", +"坦尚尼亞": "坦桑尼亚", +"埃塞俄比亞": "埃塞俄比亚", +"衣索匹亞": "埃塞俄比亚", +"衣索比亞": "埃塞俄比亚", +"吉里巴斯": "基里巴斯", +"基里巴斯": "基里巴斯", +"塔吉克": "塔吉克斯坦", +"塞拉利昂": "塞拉利昂", +"塞普勒斯": "塞浦路斯", +"塞浦路斯": "塞浦路斯", +"塞舌爾": "塞舌尔", +"塞席爾": "塞舌尔", +"多明尼加共和國": "多米尼加", +"多明尼加": "多米尼加", +"多明尼加聯邦": "多米尼加联邦", +"多米尼克": "多米尼加联邦", +"安提瓜和巴布達": "安提瓜和巴布达", +"安地卡及巴布達": "安提瓜和巴布达", +"尼日利亞": "尼日利亚", +"奈及利亞": "尼日利亚", +"尼日爾": "尼日尔", +"尼日": "尼日尔", +"巴貝多": "巴巴多斯", +"巴巴多斯": "巴巴多斯", +"巴布亞新畿內亞": "巴布亚新几内亚", +"巴布亞紐幾內亞": "巴布亚新几内亚", +"布基納法索": "布基纳法索", +"布吉納法索": "布基纳法索", +"蒲隆地": "布隆迪", +"布隆迪": "布隆迪", +"希臘": "希腊", +"帛琉": "帕劳", +"義大利": "意大利", +"意大利": "意大利", +"所羅門群島": "所罗门群岛", +"索羅門群島": "所罗门群岛", +"汶萊": "文莱", +"斯威士蘭": "斯威士兰", +"史瓦濟蘭": "斯威士兰", +"斯洛文尼亞": "斯洛文尼亚", +"斯洛維尼亞": "斯洛文尼亚", +"新西蘭": "新西兰", +"紐西蘭": "新西兰", +"格林納達": "格林纳达", +"格瑞那達": "格林纳达", +"格魯吉亞": "乔治亚", +"喬治亞": "乔治亚", +"梵蒂岡": "梵蒂冈", +"毛里塔尼亞": "毛里塔尼亚", +"茅利塔尼亞": "毛里塔尼亚", +"毛里裘斯": "毛里求斯", +"模里西斯": "毛里求斯", +"沙地阿拉伯": "沙特阿拉伯", +"沙烏地阿拉伯": "沙特阿拉伯", +"波斯尼亞黑塞哥維那": "波斯尼亚和黑塞哥维那", +"波士尼亞赫塞哥維納": "波斯尼亚和黑塞哥维那", +"津巴布韋": "津巴布韦", +"辛巴威": "津巴布韦", +"宏都拉斯": "洪都拉斯", +"洪都拉斯": "洪都拉斯", +"特立尼達和多巴哥": "特立尼达和托巴哥", +"千里達托貝哥": "特立尼达和托巴哥", +"瑙魯": "瑙鲁", +"諾魯": "瑙鲁", +"瓦努阿圖": "瓦努阿图", +"萬那杜": "瓦努阿图", +"溫納圖": "瓦努阿图", +"科摩羅": "科摩罗", +"葛摩": "科摩罗", +"象牙海岸": "科特迪瓦", +"突尼西亞": "突尼斯", +"索馬里": "索马里", +"索馬利亞": "索马里", +"老撾": "老挝", +"寮國": "老挝", +"肯雅": "肯尼亚", +"肯亞": "肯尼亚", +"蘇利南": "苏里南", +"莫三比克": "莫桑比克", +"莫桑比克": "莫桑比克", +"萊索托": "莱索托", +"賴索托": "莱索托", +"貝寧": "贝宁", +"貝南": "贝宁", +"贊比亞": "赞比亚", +"尚比亞": "赞比亚", +"亞塞拜然": "阿塞拜疆", +"阿塞拜疆": "阿塞拜疆", +"阿拉伯聯合酋長國": "阿拉伯联合酋长国", +"阿拉伯聯合大公國": "阿拉伯联合酋长国", +"南韓": "韩国", +"馬爾代夫": "马尔代夫", +"馬爾地夫": "马尔代夫", +"馬爾他": "马耳他", +"馬利共和國": "马里共和国", +"即食麵": "方便面", +"快速面": "方便面", +"速食麵": "方便面", +"泡麵": "方便面", +"笨豬跳": "蹦极跳", +"绑紧跳": "蹦极跳", +"冷盤": "凉菜", +"冷菜": "凉菜", +"散钱": "零钱", +"谐星": "笑星", +"夜学": "夜校", +"华乐": "民乐", +"中樂": "民乐", +"屋价": "房价", +"的士": "出租车", +"計程車": "出租车", +"公車": "公共汽车", +"單車": "自行车", +"節慶": "节日", +"芝士": "乾酪", +"狗隻": "犬只", +"士多啤梨": "草莓", +"忌廉": "奶油", +"桌球": "台球", +"撞球": "台球", +"雪糕": "冰淇淋", +"衞生": "卫生", +"衛生": "卫生", +"賓士": "奔驰", +"平治": "奔驰", +"積架": "捷豹", +"福斯": "大众", +"福士": "大众", +"雪鐵龍": "雪铁龙", +"萬事得": "马自达", +"馬自達": "马自达", +"寶獅": "标志", +"拿破崙": "拿破仑", +"布殊": "布什", +"布希": "布什", +"柯林頓": "克林顿", +"克林頓": "克林顿", +"薩達姆": "萨达姆", +"海珊": "萨达姆", +"梵谷": "凡高", +"大衛碧咸": "大卫·贝克汉姆", +"米高奧雲": "迈克尔·欧文", +"卡佩雅蒂": "珍妮弗·卡普里亚蒂", +"沙芬": "马拉特·萨芬", +"舒麥加": "迈克尔·舒马赫", +"希特拉": "希特勒", +"黛安娜": "戴安娜", +"希拉": "赫拉", +} + +zh2SG = { +"方便面": "快速面", +"速食麵": "快速面", +"即食麵": "快速面", +"蹦极跳": "绑紧跳", +"笨豬跳": "绑紧跳", +"凉菜": "冷菜", +"冷盤": "冷菜", +"零钱": "散钱", +"散紙": "散钱", +"笑星": "谐星", +"夜校": "夜学", +"民乐": "华乐", +"住房": "住屋", +"房价": "屋价", +"泡麵": "快速面", +}