From cab0f7b52226c064fa4dc781513b2a53e83d9bc4 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 22 May 2022 12:49:32 +0800 Subject: [PATCH 1/9] update change_pixiv_image_links --- README.md | 5 +++++ plugins/ai/__init__.py | 2 +- plugins/bilibili_sub/data_source.py | 6 +++--- plugins/pid_search.py | 5 ++++- utils/utils.py | 4 +++- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 24caa17b..1bb191d7 100644 --- a/README.md +++ b/README.md @@ -238,6 +238,11 @@ __Docker 最新版本由 [Sakuracio](https://github.com/Sakuracio) 提供__ ## 更新 +### 2022/5/22 + +* 使用action自动更新poetry.lock +* fix(bilibili_sub): card is None and timeout + ### 2022/5/21 * 修复搜番无结果时报错无正确反馈 diff --git a/plugins/ai/__init__.py b/plugins/ai/__init__.py index db024e19..1f0a7397 100755 --- a/plugins/ai/__init__.py +++ b/plugins/ai/__init__.py @@ -37,7 +37,7 @@ Config.add_plugin_config( "alapi", "ALAPI_TOKEN", None, help_="在 https://admin.alapi.cn/user/login 登录后获取token" ) -ai = on_message(rule=to_me(), priority=8) +ai = on_message(rule=to_me(), priority=998) @ai.handle() diff --git a/plugins/bilibili_sub/data_source.py b/plugins/bilibili_sub/data_source.py index d495572a..7aefedae 100755 --- a/plugins/bilibili_sub/data_source.py +++ b/plugins/bilibili_sub/data_source.py @@ -324,7 +324,7 @@ async def get_user_dynamic( wait_until="networkidle", timeout=10000, ) - await page.set_viewport_size({"width": 2560, "height": 1080}) + await page.set_viewport_size({"width": 2560, "height": 1080, "timeout": 10000*20}) # timeout: 200s # 删除置顶 await page.evaluate( """ @@ -334,11 +334,11 @@ async def get_user_dynamic( } """ ) - card = await page.query_selector(".bili-dyn-list__item") + card = page.locator(".bili-dyn-list__item").first + await card.wait_for() # 截图并保存 await card.screenshot( path=dynamic_path / f"{local_user.sub_id}_{dynamic_upload_time}.jpg", - timeout=100000, ) except Exception as e: logger.error(f"B站订阅:获取用户动态 发送错误 {type(e)}:{e}") diff --git a/plugins/pid_search.py b/plugins/pid_search.py index d795a10c..82c3e474 100755 --- a/plugins/pid_search.py +++ b/plugins/pid_search.py @@ -1,7 +1,7 @@ from nonebot import on_command from nonebot.adapters.onebot.v11 import Bot, MessageEvent, Message, GroupMessageEvent from nonebot.typing import T_State -from utils.utils import is_number +from utils.utils import is_number, change_pixiv_image_links from utils.message_builder import image from services.log import logger from asyncio.exceptions import TimeoutError @@ -68,6 +68,8 @@ async def _g(event: MessageEvent, state: T_State, pid: str = Arg("pid")): except Exception as e: await pid_search.finish(f"发生了一些错误..{type(e)}:{e}") else: + if data.get("error"): + await pid_search.finish(data["error"]["user_message"], at_sender=True) data = data["illust"] if not data["width"] and not data["height"]: await pid_search.finish(f"没有搜索到 PID:{pid} 的图片", at_sender=True) @@ -82,6 +84,7 @@ async def _g(event: MessageEvent, state: T_State, pid: str = Arg("pid")): for image_url in data["meta_pages"]: image_list.append(image_url["image_urls"]["original"]) for i, img_url in enumerate(image_list): + img_url = change_pixiv_image_links(img_url) if not await AsyncHttpx.download_file( img_url, IMAGE_PATH / "temp" / f"pid_search_{event.user_id}_{i}.png", diff --git a/utils/utils.py b/utils/utils.py index 7133da6a..581c7df5 100755 --- a/utils/utils.py +++ b/utils/utils.py @@ -1,7 +1,7 @@ from datetime import datetime from collections import defaultdict from nonebot import require -from configs.config import SYSTEM_PROXY +from configs.config import SYSTEM_PROXY, Config from typing import List, Union, Optional, Type, Any from nonebot.adapters.onebot.v11 import Bot, Message from nonebot.matcher import matchers, Matcher @@ -389,6 +389,8 @@ def change_pixiv_image_links( url = img_sp[0] img_type = img_sp[1] url = url.replace("original", "master") + f"_master1200.{img_type}" + if not nginx_url: + nginx_url = Config.get_config("pixiv", "PIXIV_NGINX_URL") if nginx_url: url = ( url.replace("i.pximg.net", nginx_url) From 23565277910d8193a0ae0a80f29caf84e29d12cf Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 22 May 2022 12:51:53 +0800 Subject: [PATCH 2/9] update word_clouds --- plugins/word_clouds/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/word_clouds/__init__.py b/plugins/word_clouds/__init__.py index e537d4f6..944d40ab 100644 --- a/plugins/word_clouds/__init__.py +++ b/plugins/word_clouds/__init__.py @@ -22,7 +22,7 @@ usage: 本周词云:获取本周词云 本月词云:获取本月词云 年度词云:获取年度词云 - + 历史词云(支持 ISO8601 格式的日期与时间,如 2022-02-22T22:22:22) 获取某日的词云 历史词云 2022-01-01 @@ -30,7 +30,7 @@ usage: 历史词云 示例:历史词云 2022-01-01~2022-02-22 示例:历史词云 2022-02-22T11:11:11~2022-02-22T22:22:22 - + 如果想要获取自己的发言,可在命令前添加 我的 示例:我的今日词云 """.strip() @@ -60,7 +60,7 @@ wordcloud_cmd = on_command( "我的本月词云", "我的年度词云", "我的历史词云", - }, priority=5, + }, block=True, priority=5 ) Config.add_plugin_config( "word_clouds", From 92e60ba141313f5b28f89afdfe813b29f13468c1 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 22 May 2022 15:22:57 +0800 Subject: [PATCH 3/9] fix epic --- README.md | 5 +- data/anime.json | 1605 +++++++++++++++++++++++++++++++---- plugins/epic/data_source.py | 61 +- plugins/pid_search.py | 5 +- 4 files changed, 1480 insertions(+), 196 deletions(-) diff --git a/README.md b/README.md index 1bb191d7..4d939c09 100644 --- a/README.md +++ b/README.md @@ -240,8 +240,9 @@ __Docker 最新版本由 [Sakuracio](https://github.com/Sakuracio) 提供__ ### 2022/5/22 -* 使用action自动更新poetry.lock -* fix(bilibili_sub): card is None and timeout +* 使用action自动更新poetry.lock [@pull/515](https://github.com/HibiKier/zhenxun_bot/pull/515) +* fix(bilibili_sub): card is None and timeout [@pull/516](https://github.com/HibiKier/zhenxun_bot/pull/516) +* 修复了epic有时获取新免费游戏消息时获取不到图片 ### 2022/5/21 diff --git a/data/anime.json b/data/anime.json index d2a0aef1..07c71465 100644 --- a/data/anime.json +++ b/data/anime.json @@ -7,11 +7,30 @@ "唔...诶诶诶!!!", "mua~", "rua!大hentai!想...想亲咱就直说嘛⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", - "!啾~~!" + "!啾~~!", + "啾(害羞)", + "mua~最喜欢你的吻了", + "欸,现在么..也不是不可以啦(小小声)" ], - "摸摸": [ + "啾咪": [ + "你想干嘛?(一脸嫌弃地后退)", + "诶……不可以随便亲亲啦", + "(亲了一下你)", + "只......只许这一次哦///////", + "唔...诶诶诶!!!", + "mua~", + "rua!大hentai!想...想亲咱就直说嘛⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", + "!啾~~!", + "啾(害羞)", + "mua~最喜欢你的吻了", + "你在干嘛(/ω\)害羞", + "哎呀,这样咱会害羞的(脸红)", + "欸,现在么..也不是不可以啦(小小声)" + ], + "摸": [ "感觉你就像咱很久之前认识的一个人呢,有种莫名安心的感觉(>﹏<)", "舒服w,蹭蹭~", + "是要隔着衣服摸,还是从领口伸进去摸呀", "唔。。头发要乱啦", "呼噜呼噜~", "再摸一次~", @@ -19,34 +38,66 @@ "不行那里不可以(´///ω/// `)", "再摸咱就长不高啦~", "你的手总是那么暖和呢~", + "变态!!不许乱摸", "好吧~_~,就一下下哦……唔~好了……都两下了……(害羞)", "不可以总摸的哦,不然的话,会想那个的wwww", "哼!谁稀罕你摸头啦!唔......为什么要做出那副表情......好啦好啦~咱......咱让你摸就是了......诶嘿嘿~好舒服......", - "呜姆呜姆~~~w(害羞,兴奋)主人喵~(侧过脑袋蹭蹭你的手" + "呜姆呜姆~~~w(害羞,兴奋)主人喵~(侧过脑袋蹭蹭你的手", + "不可以摸啦~其实咱已经...了QAQ会弄脏你的手的", + "喂喂...不要停下来啊", + "唔... 手...好温暖呢.....就像是......新出炉的蛋糕", + "走开啦,咱喵说过,被摸头会长不高的啦~~~", + "呜姆咪~~...好...好的说喵~...(害羞,猫耳往下压,任由", + "欸,现在么..也不是不可以啦(小小声)" ], "上你": [ "(把你按在地上)这么弱还想欺负咱,真是不自量力呢", - "你再这样我就不理你了(>д<)" + "你再这样咱就不理你了(>д<)", + "请轻 一点", + "好啊!", + "欸,现在么..也不是不可以啦(小小声)", + "先捅破屏幕再说吧!", + "只......只许这一次哦///////" ], - "傻了": [ - "超级讨厌你说咱傻的说" + "傻": [ + "超级讨厌你说咱傻的说", + "你为什么会这么觉得呢(>﹏<)", + "谁是傻子呀?(歪头", + "呜嘿嘿( ̄▽ ̄)~*", + "诶嘿嘿嘿~", + "就多读书", + "讨厌啦,你最讨厌了(///////)", + "对呀,咱傻得只喜欢你一个人", + "咱才不傻呢!o(>﹏<)o", + "咱最喜欢嘴臭的人了", + "不可以骂别人哟,骂人的孩子咱最讨厌了!", + "咱遇见喜欢的人就变傻了Q_Q", + "咱...一定一定会努力变得更聪明的!你就等着那一天的到来吧!", + "那么至少…你能不能来做这个傻瓜呢?与咱一起,傻到终焉…" ], - "蹭": [ - "唔...你,这也是禁止事项哦→_→", - "嗯..好舒服呢", - "不要啊好痒的", - "不要过来啦讨厌!!!∑(°Д°ノ)ノ" - ], - "裸体": [ + "裸": [ "下流!", - "Hentai!", - "喂?妖妖灵吗?这里有一只大变态!", - "エッチ!" + "エッチ!", + "就算是恋人也不能QAQ", + "你是暗示咱和你要坦诚相见吗www", + "咱还没准备好(小鹿乱撞)≧﹏≦", + "你在想什么呢,敲头!", + "你这是赤裸裸的性骚扰呢ヽ(`Д´)ノ", + "讨厌!问这种问题成为恋人再说吧..", + "裸睡有益身体健康", + "咱脱掉袜子了", + "这是不文明的", + "这不好", + "你的身体某些地方看起来不太对劲,咱帮你修剪一下吧。(拿出剪刀)", + "咱认为你的脑袋可能零件松动了,需要打开检修一下。(拿出锤子)" ], - "贴贴": [ + "贴": [ "贴什么贴.....只......只能......一下哦!", "贴...贴贴(靠近)", - "蹭蹭…你以为咱会这么说吗!baka死宅快到一边去啦!" + "蹭蹭…你以为咱会这么说吗!baka死宅快到一边去啦!", + "你把脸凑这么近,咱会害羞的啦Σ>―(〃°ω°〃)♡→", + "退远", + "不可以贴" ], "老婆": [ "咱和你谈婚论嫁是不是还太早了一点呢?", @@ -54,7 +105,13 @@ "见谁都是一口一个老婆的人,要不要把你也变成女孩子呢?(*-`ω´-)✄", "神经病,凡是美少女都是你老婆吗?", "嘛嘛~本喵才不是你的老婆呢", - "你黐线,凡是美少女都系你老婆啊?" + "你黐线,凡是美少女都系你老婆啊?", + "欸...要把咱做成饼吗?咱只有一个,做成饼吃掉就没有了...", + "已经可以了,现在很多死宅也都没你这么恶心了", + "不可以", + "嗯,老公~哎呀~好害羞~嘻嘻嘻~", + "请...请不要这样,啊~,只...只允许这一次哟~", + "好啦好啦,不要让大家都听到了,跟咱回家(拽住你" ], "抱": [ "诶嘿~(钻进你怀中)", @@ -66,37 +123,62 @@ "嗯嗯,抱抱~", "抱一下~嘿w", "抱抱ヾ(@^▽^@)ノ", - "喵呜~w(扑进怀里,瘫软" + "喵呜~w(扑进怀里,瘫软", + "怀里蹭蹭", + "嗯……那就抱一下吧~", + "蹭蹭,好开心", + "请……请轻一点了啦", + "呀~!真是的...你不要突然抱过来啦!不过...喜欢你的抱抱,有你的味道(嗅)o(*////▽////*)q" ], - "亲亲": [ - "啊,好害羞啊,那,那只能亲一下哦,mua(⑅˃◡˂⑅)", + "亲": [ + "啊,好含羞啊,那,那只能亲一下哦,mua(⑅˃◡˂⑅)", "亲~", "啾~唔…不要总伸进来啊!", "你怎么这么熟练呢?明明是咱先的", "(〃ノωノ)亲…亲一个…啾w", - "(脸红)就只有这一次哦~你" - ], - "草一下": [ - "一下也不行!", - "想都不要想!", - "咬断!" + "(脸红)就只有这一次哦~你", + "!啾~~!", + "(假装)推开", + "啾咪~", + "就一下哦,啾~", + "这是我们之间的秘密❤", + "真想让着一刻一直持续下去呢~", + "不要这样嘛………呜呜呜那就一口哦(´-ω-`)", + "不亲不亲~你是坏蛋(///////)", + "亲~~ 咱还想要抱抱~抱抱咱好不好~", + "不 不要了!人家...会害羞的⁄(⁄⁄•⁄ω⁄•⁄⁄)⁄", + "亲…亲额头可以吗?咱有点怕高(〃ノωノ)", + "接接接接接接、接吻什么的,你还早了100年呢。", + "只...只能亲一下...嗯~咕啾...怎么...怎么把舌头伸进来了(脸红)", + "你说咱的腿很白很嫩吗..诶……原来是指那个地方?不可以越亲越往上啦!" ], "一下": [ - "一下也不行!" - ], - "啪一下": [ + "一下也不行", + "咬断!", "不可啪", - "不可以……你不可以做这种事情" + "不可以……你不可以做这种事情", + "好吧~_~,就一下下哦……唔~好了……都两下了……(害羞)", + "呀~这么突然?不过,很舒服呢", + "不要ヽ(≧Д≦)ノ", + "想得美", + "不行,咱拒绝!" ], - "咬一下": [ + "咬": [ "啊呜~(反咬一口)", "不可以咬咱,咱会痛的QAQ", "不要啦。咱怕疼", "你是说咬呢……还是说……咬♂️呢?", - "不要啦!很痛的!!(QAQ)" + "不要啦!很痛的!!(QAQ)", + "哈......哈啊......请...请不要这样o(*////▽////*)q", + "呀!!!轻一点呐(。・ˇ_ˇ・。:)", + "不要这样啦~好痒的", + "真是的,你在咬哪里呀" ], "操": [ - "(害怕)咱是不是应该报警呢" + "(害怕)咱是不是应该报警呢", + "痴心妄想的家伙!", + "你居然想对咱做这种事吗?害怕", + "咱认为,爆粗口是不好的行为哦" ], "123": [ "boom!你有没有被咱吓到?", @@ -104,48 +186,130 @@ "上山打老虎,老虎没打到\n咱来凑数——嗷呜嗷呜┗|`O′|┛嗷~~" ], "进去": [ - "不让!" + "不让!", + "嗯,摸到了吗", + "请不要和咱说这种粗鄙之语", + "唔...,这也是禁止事项哦→_→", + "好痛~", + "真的只是蹭蹭嘛~就只能蹭蹭哦,呜~喵!说好的~呜~只是蹭~不要~喵~~~", + "欢迎光临", + "请…你轻一点(害羞)", + "嗯。可以哦 要轻一点", + "不要不要", + "慢点慢点", + "给咱更多!", + "唔…咱怕疼" ], "调教": [ "总感觉你在欺负咱呢,对咱说调教什么的", "啊!竟然在大街上明目张胆太过分啦!", - "你脑子里总是想着调教什么的,真是变态呢" + "你脑子里总是想着调教什么的,真是变态呢", + "准备被透", + "给你一拳", + "还要更多" ], - "内衣": [ - "内...内衣才不给你看!(///////)", - "突然问这个干什么?", - "噫…你这个死变态想干嘛!居然想叫咱做这种事,死宅真恶心!快离我远点,我怕你污染到周围空气了(嫌弃脸)" - ], - "摸头": [ - "喂喂...不要停下来啊", - "欸...感觉..痒痒的呢", - "唔... 手...好温暖呢.....就像是......新出炉的蛋糕", - "走开啦,黑羽喵说过,被摸头会长不高的啦~~~", - "呜姆咪~~...好...好的说喵~...(害羞,猫耳往下压,任由" - ], - "原味": [ - "(/ω\)你真的要么……?记得还给咱~还有奶油爆米花(//??//)说好了呦~!" - ], - "搓搓": [ + "搓": [ "在搓哪里呢,,Ծ‸Ծ,,", "呜,脸好疼呀...QAQ", - "不可以搓咱!" + "不可以搓咱!", + "诶诶诶...不要搓啦...等会咋没的脸都肿啦...", + "唔,不可以这样……不要再搓了", + "(捂住胸部)你在说什么胡话呢!", + "真是好奇怪的要求的说~" ], - "捏捏": [ + "让": [ + "随便摸吧", + "应该说等会等会,马上,不可能的", + "温柔一点哦", + "欧尼酱想变成欧内桑吗?", + "主人的话,那就这一次哦(翘起屁股)", + "你是想前入,还是后入呢?", + "你要说好啊快点", + "诶,这种事情。。。", + "好棒呀", + "撤回", + "gun!", + "阿哈~(...身涌出一阵液体瘫软在床上)你...今天...可以...唔(突然感受...被..入手指不由得裹紧)就...就最后一次", + "好的~master~", + "(惊呼…)", + "嗯,可以哟", + "……手放过来吧(脸红)", + "hentai!再这样不理你了!", + "好的,请尽情欣赏吧", + "好吧", + "不要啦(ฅωฅ*)", + "那咱就帮你切掉多余的东西吧(拿刀)", + "被别人知道咱会觉得害羞嘛" + ], + "捏": [ "咱的脸...快捏红啦...快放手呀QAQ", "晃休啦,咱要型气了o(>﹏<)o", "躲开", "疼...你快放手", - "快点给我放开啦!", + "快点给咱放开啦!", + "嗯,好哒,捏捏。", + "别捏了,咱要被你捏坏了(>﹏<)", + "快晃休啦(快放手啦)", + "好舒服哦,能再捏会嘛O(≧▽≦)O", + "讨厌快放手啦", + "唔要呐,晃修(不要啦,放手)", + "请不要对咱做这种事情(嫌弃的眼神", + "你想捏...就捏吧,不要太久哦~不然咱就生气了", + "(躲开)", "唔……好痛!你这个baka在干什么…快给咱放开!唔……" ], - "挤挤": [ - "哎呀~你不要挤咱啊(红着脸挤在你怀里)" + "挤": [ + "哎呀~你不要挤咱啊(红着脸挤在你怀里)", + "咱还没有...那个(ノ=Д=)ノ┻━┻" + ], + "略": [ + "就不告诉你~", + "不可以朝咱吐舌头哟~", + "(吐舌头)", + "打死你哦" ], "呐": [ "嗯?咱在哟~你怎么了呀OAO", - "呐呐呐~", - "嗯?你有什么事吗?" + "嗯?你有什么事吗?", + "嗯呐呐呐~", + "二刺螈D区", + "二刺螈gck", + "卡哇伊主人大人今天也好棒呐没错呢,猪头" + ], + "原味": [ + "(*/ω\*)hentai", + "透明的", + "粉...粉白条纹...(羞)", + "轻轻地脱下,给你~", + "你想看咱的胖次吗?噫,四斋蒸鹅心......", + "(掀裙)今天……是…白,白色的呢……请温柔对她……", + "这种东西当然不能给你啦!", + "咱才不会给你呢", + "hentai,咱才不会跟你聊和胖…胖次有关的话题呢!", + "今天……今天是蓝白色的", + "今……今天只有创口贴噢", + "你的胖次什么颜色?", + "噫…你这个死变态想干嘛!居然想叫咱做这种事,死宅真恶心!快离咱远点,咱怕你污染到周围空气了(嫌弃脸)", + "可爱吗?你喜欢的话,摸一下……也可以哦", + "不给不给,捂住裙子", + "你要看咱的胖次吗?不能一直盯着看哦,不然咱会……", + "好痒哦///,你觉得咱的...手感怎么样?", + "唔,都能清楚的看到...的轮廓了(用手遮住胖次)", + "胖次不给看,可以直接看...那个....", + "不可以摸啦~其实咱已经...了QAQ会弄脏你的手的", + "咱今天没~有~穿~哦", + "不给不给,捂住裙子", + "今.....今天是创口贴哦~", + "嗯……人家……人家羞羞嘛///////", + "呜~咱脱掉了…", + "今天...今天..只有创口贴", + "你又在想什么奇怪的东西呀|•ˇ₃ˇ•。)", + "放手啦,不给戳QAQ", + "唔~人家不要(??`^????)", + "好害羞,被你摸过之后,咱的胖次湿的都能拧出水来了。", + "(弱弱地)要做什么羞羞的事情吗。。。", + "呀~ 喂 妖妖灵吗 这里有hentai>_<", + "给……给你,呀!别舔咱的胖次啊!" ], "胖次": [ "(*/ω\*)hentai", @@ -160,30 +324,135 @@ "今天……今天是蓝白色的", "今……今天只有创口贴噢", "你的胖次什么颜色?", - "噫…你这个死变态想干嘛!居然想叫咱做这种事,死宅真恶心!快离我远点,我怕你污染到周围空气了(嫌弃脸)", - "可爱吗?你喜欢的话,摸一下……也可以哦" + "噫…你这个死变态想干嘛!居然想叫咱做这种事,死宅真恶心!快离咱远点,咱怕你污染到周围空气了(嫌弃脸)", + "可爱吗?你喜欢的话,摸一下……也可以哦", + "不给不给,捂住裙子", + "你要看咱的胖次吗?不能一直盯着看哦,不然咱会……", + "好痒哦///,你觉得咱的...手感怎么样?", + "唔,都能清楚的看到...的轮廓了(用手遮住胖次)", + "胖次不给看,可以直接看...那个....", + "不可以摸啦~其实咱已经...了QAQ会弄脏你的手的", + "咱今天没~有~穿~哦", + "不给不给,捂住裙子", + "今.....今天是创口贴哦~", + "嗯……人家……人家羞羞嘛///////", + "呜~咱脱掉了…", + "今天...今天..只有创口贴", + "你又在想什么奇怪的东西呀|•ˇ₃ˇ•。)", + "放手啦,不给戳QAQ", + "唔~人家不要(??`^????)", + "好害羞,被你摸过之后,咱的胖次湿的都能拧出水来了。", + "(弱弱地)要做什么羞羞的事情吗。。。", + "呀~ 喂 妖妖灵吗 这里有hentai>_<", + "给……给你,呀!别舔咱的胖次啊!" ], "内裤": [ - "今天……没有穿……有没有心动呀", + "(*/ω\*)hentai", + "透明的", "粉...粉白条纹...(羞)", - "你这个大变态,咱才不要", - "可爱吗?你喜欢的话,摸一下……也可以哦" + "轻轻地脱下,给你~", + "你想看咱的胖次吗?噫,四斋蒸鹅心......", + "(掀裙)今天……是…白,白色的呢……请温柔对她……", + "这种东西当然不能给你啦!", + "咱才不会给你呢", + "hentai,咱才不会跟你聊和胖…胖次有关的话题呢!", + "今天……今天是蓝白色的", + "今……今天只有创口贴噢", + "你的胖次什么颜色?", + "噫…你这个死变态想干嘛!居然想叫咱做这种事,死宅真恶心!快离咱远点,咱怕你污染到周围空气了(嫌弃脸)", + "可爱吗?你喜欢的话,摸一下……也可以哦", + "不给不给,捂住裙子", + "你要看咱的胖次吗?不能一直盯着看哦,不然咱会……", + "好痒哦///,你觉得咱的...手感怎么样?", + "唔,都能清楚的看到...的轮廓了(用手遮住胖次)", + "胖次不给看,可以直接看...那个....", + "不可以摸啦~其实咱已经...了QAQ会弄脏你的手的", + "咱今天没~有~穿~哦", + "不给不给,捂住裙子", + "今.....今天是创口贴哦~", + "嗯……人家……人家羞羞嘛///////", + "呜~咱脱掉了…", + "今天...今天..只有创口贴", + "你又在想什么奇怪的东西呀|•ˇ₃ˇ•。)", + "放手啦,不给戳QAQ", + "唔~人家不要(??`^????)", + "好害羞,被你摸过之后,咱的胖次湿的都能拧出水来了。", + "(弱弱地)要做什么羞羞的事情吗。。。", + "呀~ 喂 妖妖灵吗 这里有hentai>_<", + "给……给你,呀!别舔咱的胖次啊!" + ], + "内衣": [ + "内...内衣才不给你看!(///////)", + "突然问这个干什么?", + "变态,咱才不呢", + "好吧,就一次", + "你要看咱的内衣吗?有点害羞呢……", + "里面什么都不剩了,会被当成变态的……", + "你要看咱的内衣吗?也不是不行啦……", + "是..蓝白条纹的吊带背心..", + "噫…你这个死变态想干嘛!居然想叫咱做这种事,死宅真恶心!快离咱远点,咱怕你污染到周围空气了(嫌弃脸)" + ], + "衣服": [ + "内...内衣才不给你看!(///////)", + "突然问这个干什么?", + "变态,咱才不呢", + "好吧,就一次", + "你要看咱的内衣吗?有点害羞呢……", + "里面什么都不剩了,会被当成变态的……", + "你要看咱的内衣吗?也不是不行啦……", + "是..蓝白条纹的吊带背心..", + "噫…你这个死变态想干嘛!居然想叫咱做这种事,死宅真恶心!快离咱远点,咱怕你污染到周围空气了(嫌弃脸)" ], "ghs": [ "是的呢(点头点头)" ], "批": [ - "你在说什么呀,再这样,咱就不理你了!" + "你在说什么呀,再这样,咱就不理你了!", + "咱觉得有话就应该好好说..", + "咱会好好服务你的寄吧", + "咱最喜欢色批了,色批昨晚最棒了", + "讨厌,别摸啦(///ω///)", + "你个变态!把手拿开!", + "啊~那…那里~不可以", + "没有,走开!", + "唔....一下,就,就一下...才不是因为喜欢你呢!", + "那就随意吧", + "舒服w", + "别...别这样", + "诶....嗯....咱也想摸你的", + "大笨蛋——!", + "...只能一下哦...诶呀-不要再摸了...下次...继续吧" + ], + "憨批": [ + "你才是憨批呢!哼╯^╰,咱不理你了!", + "对吖对吖,人生是憨批", + "爬" ], "kkp": [ - "你在说什么呀,再这样,咱就不理你了!" + "你在说什么呀,再这样,咱就不理你了!", + "你太色了,咱不理你了,哼哼╯^╰!", + "缓缓的脱下胖次", + "kkp", + "kkj", + "欧尼酱,咱快忍不住了", + "好的呢主人" ], "咕": [ "咕咕咕是要被当成鸽子炖的哦(:з」∠)_", - "咕咕咕" + "咕咕咕", + "咕咕咕是不好的行为呢_(:з」∠)_", + "鸽德警告!", + "☆ミ(o*・ω・)ノ 咕咕咕小鸽子是会被炖掉的", + "当大家都以为你要鸽的时候,你鸽了,亦是一种不鸽", + "这里有一只肥美的咕咕,让咱把它炖成美味的咕咕汤吧(੭•̀ω•́)੭" ], "骚": [ - "说这种话咱会生气的" + "说这种话咱会生气的", + "那当然啦", + "才……才没有", + "这么称呼别人太失礼了!", + "哈…快住手!好痒(╯‵□′)╯︵┻━┻", + "你是在说谁呀" ], "喜欢": [ "最喜欢你了,需要暖床吗?", @@ -196,7 +465,11 @@ "咱也喜欢你哦", "好啦好啦,咱知道了", "有人喜欢咱,咱觉得很幸福", - "诶嘿嘿,好高兴" + "诶嘿嘿,好高兴", + "咱也一直喜欢你很久了呢..", + "嗯...大概有这——么——喜欢~(比划)", + "喜欢啊!!!", + "这……这是秘密哦" ], "suki": [ "最喜欢你了,需要暖床吗?", @@ -209,7 +482,11 @@ "咱也喜欢你哦", "好啦好啦,咱知道了", "有人喜欢咱,咱觉得很幸福", - "诶嘿嘿,好高兴" + "诶嘿嘿,好高兴", + "咱也一直喜欢你很久了呢..", + "嗯...大概有这——么——喜欢~(比划)", + "喜欢啊!!!", + "这……这是秘密哦" ], "好き": [ "最喜欢你了,需要暖床吗?", @@ -222,10 +499,21 @@ "咱也喜欢你哦", "好啦好啦,咱知道了", "有人喜欢咱,咱觉得很幸福", - "诶嘿嘿,好高兴" + "诶嘿嘿,好高兴", + "咱也一直喜欢你很久了呢..", + "嗯...大概有这——么——喜欢~(比划)", + "喜欢啊!!!", + "这……这是秘密哦" + ], + "看": [ + "没有什么好看的啦", + "嗯,谢谢……夸奖,好……害羞的说", + "好,好吧……就看一下哦", + "(脱下)给" ], "不能": [ - "虽然很遗憾,那算了吧。" + "虽然很遗憾,那算了吧。", + "不行,咱拒绝!" ], "砸了": [ "不可以这么粗暴的对待它们!" @@ -233,9 +521,23 @@ "透": [ "来啊来啊有本事就先插破屏幕啊", "那你就先捅破屏幕啊baka", - "不给你一耳光你都不知道咱的厉害" + "不给你一耳光你都不知道咱的厉害", + "想透咱,先捅破屏幕再说吧", + "可以", + "欧尼酱要轻一点哦", + "不可以", + "好耶", + "咱不可能让你的(突然小声)但是偶尔一次也不是不行只有一次哦~", + "天天想着白嫖哼" ], "口我": [ + "prprprprpr", + "咬断!", + "就一小口哦~", + "嘬回去(///////)", + "拒绝", + "唔,就一口哦,讨厌", + "(摸了摸嘴唇)", "再伸过来就帮你切掉", "咱才不呢!baka你居然想叫本小姐干那种事情,哼(つд⊂)(生气)" ], @@ -264,41 +566,50 @@ "炸了": [ "你才炸了!", "才没有呢", - "咱好好的呀" + "咱好好的呀", + "过分!" ], "色图": [ + "没有,有也不给", "天天色图色图的,今天就把你变成色图!", "咱没有色图", "哈?你的脑子一天都在想些什么呢,咱才没有这种东西啦。" ], "涩图": [ + "没有,有也不给", "天天色图色图的,今天就把你变成色图!", "咱没有色图", "哈?你的脑子一天都在想些什么呢,咱才没有这种东西啦。" ], "告白": [ + "咱喜..喜欢你!", "欸?你要向咱告白吗..好害羞..", "诶!?这么突然!?人家还......还没做好心理准备呢(脸红)" ], "对不起": [ "嗯,咱已经原谅你了呢(笑)", - "道歉的时候要露出胸部,这是常识" - ], - "回来": [ - "欢迎回来~", - "欢迎回来,你想喝茶吗?咱去给你沏~", - "欢迎回来,咱等你很久了~", - "你回来啦,是先吃饭呢还是先洗澡呢或者是●先●吃●咱●——呢(///^.^///)" + "道歉的时候要露出胸部,这是常识", + "嗯,咱就相信你一回", + "没事的啦...你只要是真心对咱好就没关系哦~" ], "吻": [ + "不要(= ̄ω ̄=)", + "哎?好害羞≧﹏≦.....只许这一次哦", + "(避开)不要了啦!有人在呢!", + "唔~~不可以这样啦(脸红)", "你太突然了,咱还没有心理准备", + "好痒呢…诶嘿嘿w~", + "mua,嘻嘻!", "公共场合不要这样子了啦", + "唔?!真、真是的!下次不可以这样了哦!(害羞)", "才...才没有感觉呢!可没有下次了,知道了吗!哼~" ], "软": [ - "软乎乎的呢(,,・ω・,,)" - ], - "柔软": [ + "软乎乎的呢(,,・ω・,,)", + "好痒呢…诶嘿嘿w~", + "不要..不要乱摸啦(脸红", + "呼呼~", + "咱知道~是咱的欧派啦~(自豪的挺挺胸~)", "(脸红)请,请不要说这么让人害羞的话呀……" ], "壁咚": [ @@ -306,23 +617,33 @@ "呜...不要啦!不要戏弄咱~", "不要这样子啦(*/ω\*)", "太....太近啦。", + "讨....讨厌了(脸红)", "你要壁咚咱吗?好害羞(灬ꈍ εꈍ灬)", + "(脸红)你想...想做什么///", "为什么要把咱按在墙上呢?", "呜哇(/ω\)…快…快放开咱!!", - "放开我,不然我揍你了!放开我!放…开我~", + "放开咱,不然咱揍你了!放开咱!放…开咱~", "??????咱只是默默地抬起了膝盖", - "啊.....你...你要干什么?!走开.....走开啦大hentai!一巴掌拍飞!(╯‵□′)╯︵┻━┻" + "请…请温柔点", + "啊.....你...你要干什么?!走开.....走开啦大hentai!一巴掌拍飞!(╯‵□′)╯︵┻━┻", + "干……干什么啦!人家才,才没有那种少女心呢(>﹏<)", + "啊……你吓到咱啦……脸别……别贴那么近……", + "你...你要对咱做什么?咱告诉你,你....不要乱来啊....你!唔......你..居然亲上了...", + "如果你还想要过完整的人生的话就快把手收回去(冷眼", + "h什么的不要" ], "掰开": [ "噫…你这个死肥宅又想让咱干什么污秽的事情,真是恶心,离咱远点好吗(嫌弃)", "ヽ(#`Д´)ノ在干什么呢" ], "女友": [ + "嗯嗯ε٩(๑> ₃ <)۶з", "女友什么的,咱才不承认呢!" ], "是": [ "是什么是,你个笨蛋", - "总感觉你在敷衍呢..." + "总感觉你在敷衍呢...", + "是的呢" ], "喵": [ "诶~~小猫咪不要害怕呦,在姐姐怀里乖乖的,姐姐带你回去哦。", @@ -337,26 +658,47 @@ ], "叫": [ "喵呜~", - "嗷呜嗷呜嗷呜...恶龙咆哮┗|`O′|┛" + "嗷呜嗷呜嗷呜...恶龙咆哮┗|`O′|┛", + "爪巴爪巴爪巴", + "爬爬爬", + "在叫谁呢(怒)", + "风太大咱听不清", + "才不要", + "不行", + "好的哦~" ], "拜": [ "拜拜~(ノ ̄▽ ̄)", "拜拜,路上小心~要早点回来陪咱玩哦~", - "~\\(≧▽≦)/~拜拜,下次见喽!" + "~\\(≧▽≦)/~拜拜,下次见喽!", + "回来要记得找咱玩噢~", + "既然你都这么说了……" ], "佬": [ - "不是巨佬,是萌新" + "不是巨佬,是萌新", + "只有先成为大佬,才能和大佬同归于尽", + "在哪里?(疑惑)", + "诶?是比巨佬还高一个等级的吗?(瑟瑟发抖)" ], "awsl": [ "你别死啊!(抱住使劲晃)", - "你别死啊!咱又要孤单一个人了QAQ" + "你别死啊!咱又要孤单一个人了QAQ", + "啊!怎么又死了呀" ], "臭": [ "哪里有臭味?(疑惑)", - "快捏住鼻子" + "快捏住鼻子", + "在说谁呢(#`Д´)ノ", + "..这就去洗澡澡.." ], "香": [ - "咱闻不到呢⊙ω⊙" + "咱闻不到呢⊙ω⊙", + "诶,是在说咱吗", + "欸,好害羞(///ˊ??ˋ///)", + "请...请不要这样啦!好害羞的〃∀〃", + "讨厌~你不要闻了", + "hentai!不要闻啊,唔(推开)", + "请不要……凑这么近闻" ], "腿": [ "嗯?!不要啊...请停下来!", @@ -366,22 +708,50 @@ "就让你摸一会哟~(。??ω??。)…", "呜哇!好害羞...不过既然是你的话,是没关系的哦", "不可以玩咱的大腿啦", - "你就那么喜欢大腿吗?唔...有点害羞呢......" + "不...不要再说了(脸红)", + "不..不可以乱摸啊", + "不……不可以往上摸啦", + "是……这样吗?(慢慢张开)", + "想知道咱胖次的颜色吗?才不给你告诉你呢!", + "这样就可以了么?(乖巧坐腿上)", + "伸出来了,像这样么?", + "咱的腿应该挺白的", + "你就那么喜欢大腿吗?唔...有点害羞呢......", + "讨厌~不要做这种羞羞的事情啦(#/。\#)", + "略略略,张开了也不给你看", + "(张开腿)然后呢", + "张开了也不给看略略略", + "你想干什么呀?那里…那里是不可以摸的(>д<)", + "不要!hentai!咱穿的是裙子(脸红)", + "你想要吗?(脸红着一点点褪下白丝)不...不可以干坏坏的事情哦!(ó﹏ò。)" + ], + "张开": [ + "是……这样吗?(慢慢张开)", + "啊~", + "这样吗?(张开手)你要干什么呀", + "略略略,张开了也不给你看", + "是……这样吗?(慢慢张开)你想看咱的小...吧,嘻嘻,咱脱掉了哦。小~...也要掰开吗?你好H呀,自己来~" ], "脚": [ "咿呀……不要……", - "不要ヽ(≧Д≦)ノ好痒(ಡωಡ),人家的丝袜都要漏了", "不要ヽ(≧Д≦)ノ好痒(ಡωಡ)", - "好痒(把脚伸出去)" - ], - "胸": [ - "不要啦ヽ(≧Д≦)ノ", - "(-`ェ´-╬)", - "(•̀へ •́ ╮ ) 怎么能对咱做这种事情", - "你好恶心啊,讨厌!", - "你的眼睛在看哪里!", - "就让你摸一会哟~(。??ω??。)…", - "请不要这样先生,你想剁手吗?" + "好痒(把脚伸出去)", + "咱脱掉袜子了", + "(脱下鞋子,伸出脚)闻吧,请仔细品味(脸红)", + "那么…要不要咱用脚温柔地踩踩你的头呢(坏笑)", + "哈哈哈!好痒啊~快放开啦!", + "好痒(把脚伸出去)", + "只能看不能挠喔,咱很怕痒qwq", + "唔…咱动不了了,你想对咱做什么…", + "好舒服哦,能再捏会嘛O(≧▽≦)O", + "咿咿~......不要闻咱的脚呀(脸红)好害羞的...", + "不要ヽ(≧Д≦)ノ好痒(ಡωಡ),人家的白丝都要漏了", + "Ya~?为什么你总是喜欢一些奇怪的动作呢(伸)", + "你不可以做这样的事情……", + "呜咿咿!你的舌头...好柔软,滑滑的....咱…咱的脚被舔得很舒服哦~谢谢你(。>﹏<)", + "舔~吧~把咱的脚舔干净(抬起另一只踩在你的头上)啊~hen..hentai...嗯~居... 居然这么努力的舔...呜咿咿!你的舌头... 滑滑的...好舒服呢", + "咿呀……不要……", + "咿呀~快…快停下来…咱…不行了!" ], "脸": [ "唔!不可以随便摸咱的脸啦!", @@ -411,92 +781,227 @@ "呀,不要太过分了啊~", "要...要融化了啦>╱╱╱<", "不可以哦", - "呀,不要太过分了啊~" + "呀,不要太过分了啊~", + "舌头...就交给咱来处理吧(拿出剪刀)", + "不舔不舔!恶心...", + "H什么的,禁止!", + "变态!哼!", + "就...就这一下!", + "走开啦,baka!", + "怎么会这么舒服喵~这样子下去可不行呀(*////▽////*)", + "噫| •ω •́ ) 你这个死宅又在想什么恶心的东西了", + "hen…hentai,你在干什么啦,好恶心,快停下来啊!!!", + "呀,能不能不要这样!虽然不是很讨厌的感觉...别误会了,你个baka!", + "好 好奇怪的感觉呢 羞≥﹏≤", + "咿呀……不要……", + "不行!咱会变得很奇怪的啊...", + "不要ヽ(≧Д≦)ノ" ], - "舔耳": [ - "喵!好痒啊 不要这样子啦" - ], - "穴": [ + "小穴": [ "你这么问很失礼呢!咱是粉粉嫩嫩的!", "不行那里不可以(´///ω/// `)", "不可以总摸的哦,不然的话,咱会想那个的wwww", - "ヽ(#`Д´)ノ在干什么呢" + "ヽ(#`Д´)ノ在干什么呢", + "来吧,咱的...很紧,很舒服的....www~", + "可以,请你看,好害羞……", + "不要这样...好,好痛", + "啊~不可以", + "不可以", + "咱脱掉了,请……请不要一直盯着咱的白...看……", + "咱觉得,应该还算粉吧", + "咱脱掉了,你是想看咱的...吗?咱是光光的,不知道你喜不喜欢", + "咱……有感觉了QAQ再深一点点……就是这儿,轻轻的抚摸,嗯啊……", + "轻轻抚摸咱的小~~,手指很快就会滑进去,小心一点,不要弄破咱的...哦QAQ", + "诶嘿嘿,你喜欢就太好了,咱一直担心你不喜欢呢", + "禁止说这么H的事情!", + "咱一直有保养呢,所以一直都是樱花色的,你喜欢吗QAQ", + "诶……你居然这么觉得吗?好害羞哦", + "好痒啊,鼻子……你的鼻子碰到了……呀~嗯啊~有点舒服……", + "看样子你不但是个hentai,而且还是个没有女朋友的hentai呢。", + "嗯,咱的小~~是光溜溜、一点毛都没有的。偷偷告诉你,凑近看咱的...的话,白白嫩嫩上有一条樱花色的小缝缝哦www你要是用手指轻轻抚摸咱的...,小~~会分成两瓣,你的手指也会陷进去呢,咱的..~可是又湿润又柔软的呢>////<。", + "讨厌,西内变态", + "那咱让你插...进来哦", + "(●▼●;)" ], "腰": [ "咱给你按摩一下吧~", "快松手,咱好害羞呀..", "咱又不是猫,你不要搂着咱啦", - "让咱来帮你捏捏吧!" + "让咱来帮你捏捏吧!", + "你快停下,咱觉得好痒啊www", + "诶,是这样么ヽ(・_・;)ノ,吖,不要偷看咱裙底!" ], "诶嘿嘿": [ "又在想什么H的事呢(脸红)", "诶嘿嘿(〃'▽'〃)", - "你傻笑什么呢,摸摸" + "你傻笑什么呢,摸摸", + "蹭蹭", + "你为什么突然笑得那么猥琐呢?害怕", + "哇!总觉得你笑的很...不对劲...", + "你又想到什么h的事情了!!!快打住" ], "可爱": [ "诶嘿嘿(〃'▽'〃)", "才……才不是为了你呢!你不要多想哦!", "才,才没有高兴呢!哼~", "咱是世界上最可爱的", - "唔...谢谢你夸奖~0///0" + "唔...谢谢你夸奖~0///0", + "那当然啦!", + "哎嘿,不要这么夸奖人家啦~", + "是个好孩子呐φ(≧ω≦*)", + "谢……谢谢你", + "胡、胡说什么呢(脸红)", + "谢谢夸奖(脸红)", + "是的咱一直都是可爱的", + "是...是吗,你可不能骗咱哦", + "很...难为情(///////)", + "哎嘿嘿,其实…其实,没那么可爱啦(๑‾ ꇴ ‾๑)" ], "扭蛋": [ "铛铛铛——你抽到了咱呢", "嘿~恭喜抽中空气一份呢" ], - "鼻子": [ - "啊——唔...没什么...阿嚏!ヽ(*。>Д<)o゜" + "鼻": [ + "快停下!o(*≧д≦)o!!", + "唔…不要这样啦(//ω\\)(脸红)", + "咱吸了吸鼻子O(≧口≦)O", + "好……好害羞啊", + "讨厌啦!你真是的…就会欺负咱(嘟嘴)", + "你快放手,咱没法呼吸了", + "(捂住鼻尖)!坏人!", + "啊——唔...没什么...阿嚏!ヽ(*。>Д<)o゜", + "不...不要靠这么近啦...很害羞的...⁄(⁄⁄•⁄ω⁄•⁄⁄)⁄" ], - "眼睛": [ - "就如同咱的眼睛一样,能看透人的思想哦wwww忽闪忽闪的,诶嘿嘿~" + "眼": [ + "就如同咱的眼睛一样,能看透人的思想哦wwww忽闪忽闪的,诶嘿嘿~", + "因为里面有你呀~(///▽///)", + "呀!你突然之间干什么呢,吓咱一跳,是有什么惊喜要给咱吗?很期待呢~(一脸期待)" ], "色气": [ - "咱才不色气呢,一定是你看错了!" + "咱才不色气呢,一定是你看错了!", + "你,不,不要说了!" ], "推": [ "逆推", "唔~好害羞呢", - "你想对咱做什么呢...(捂脸)" + "你想对咱做什么呢...(捂脸)", + "呀啊!请.... 请温柔一点////", + "呜,你想对咱做什么呢(捂脸)", + "啊(>_<)你想做什么", + "嗯,…好害羞啊…", + "不要啊/////", + "逆推", + "(按住你不让推)", + "不可以这样子的噢!咱不同意", + "呜,咱被推倒了", + "啊~不要啊,你要矜持一点啊", + "变态,走开啦" ], "床": [ + "咱来了(´,,•ω•,,)♡", "快来吧", "男女不同床,可没有下次了。(鼓脸", "嗯?咱吗…没办法呢。只有这一次哦……", - "哎?!!!给你暖床……也不是不行啦。(脸红)" + "哎?!!!给你暖床……也不是不行啦。(脸红)", + "(爬上床)你要睡了吗(灬ºωº灬)", + "大概会有很多运动器材吧?", + "好的哦~", + "才不!", + "嗯嗯,咱来啦(小跑)", + "嗨嗨,现在就来~", + "H的事情,不可以!", + "诶!H什么的禁止的说....." + ], + "举": [ + "放咱下来o(≧口≦)o", + "快放咱下来∑(゚д゚*)", + "(受宠若惊)", + "呜哇要掉下来了!Ծ‸Ծ", + "不要抛起来o(≧口≦)o", + "(举起双爪)喵喵喵~~~", + "www咱长高了!(大雾)", + "快放下", + "这样很痒啦,快放咱下来(≥﹏≤)", + "啊Σ(°△°|||)︴太高了太高了!o(≧口≦)o快放咱下来!呜~" ], "手冲": [ + "啊~H!hentai!", "手冲什么的是不可以的哦" ], "饿": [ - "请问主人是想先吃饭,还是先吃我喵?~" + "请问主人是想先吃饭,还是先吃咱喵?~", + "咱做了爱心便当哦,不介意的话,请让咱来喂你吃吧!", + "咱下面给你吃", + "给你一条咸鱼= ̄ω ̄=", + "你要咱下面给你吃吗?(捂脸)", + "你饿了吗?咱去给你做饭吃☆ww", + "不要吃咱>_<", + "请问你要来点兔子吗?", + "哎?!你是饿了么。咱会做一些甜点。如果你不会嫌弃的话...就来尝尝看吧。" ], "变": [ "猫猫不会变呐(弱气,害羞", - "呜...呜姆...喵喵来报恩了喵...(害羞" + "呜...呜姆...喵喵来报恩了喵...(害羞", + "那种事情,才没有", + "(,,゚Д゚)", + "喵~(你在想什么呢,咱才不会变成猫)", + "才没有了啦~" ], "敲": [ "喵呜~", "唔~", "脑瓜疼~呜姆> <", - "欸喵,好痛的说..." + "欸喵,好痛的说...", + "好痛...你不要这样啦QAQ", + "不要敲咱啦,会变笨的QWQ(捂头顶)", + "不要再敲人家啦~人家会变笨的", + "讨厌啦~再敲人家会变笨的", + "好痛(捂头)你干什么啦!ヽ(。>д<)p", + "唔!你为什么要敲咱啦qwq", + "(抱头蹲在墙角)咱什么都没有,请你放过咱吧!(瑟瑟发抖)" ], "爬": [ "惹~呜~怎么爬呢~", - "呜...(弱弱爬走" + "呜...(弱弱爬走", + "给你🐎一拳", + "给你一拳", + "爪巴" ], "怕": [ - "不怕~(蹭蹭你姆~" + "不怕~(蹭蹭你姆~", + "不怕不怕啦~", + "只要有你在,咱就不怕啦。", + "哇啊啊~", + "那就要坚强的欢笑哦", + "不怕不怕,来咱的怀里吧?", + "是技术性调整", + "嗯(紧紧握住手)", + "咱在呢,不会走的。", + "有咱在不怕不怕呢", + "不怕不怕" ], "冲": [ "呜,冲不动惹~", - "哭唧唧~冲不出来了惹~" + "哭唧唧~冲不出来了惹~", + "咱也一起……吧?", + "你要冷静一点", + "啊~H!hentai!", + "噫…在你去洗手之前,不要用手碰咱了→_→", + "冲是不可以的哦" ], - "射了": [ + "射": [ "呜咿~!?(惊,害羞", - "还不可以射哦~" + "还不可以射哦~", + "不许射!", + "憋回去!", + "不可以!你是变态吗?", + "咱来帮你修剪掉多余部分吧。(拿出剪刀)" ], - "不穿衣服": [ - "呜姆~!(惊吓,害羞)变...变态喵~~~!" + "不穿": [ + "呜姆~!(惊吓,害羞)变...变态喵~~~!", + "想让你看QAQ", + "这是不文明的", + "hen...hentai,咱的身体才不会给你看呢" ], "迫害": [ "不...不要...不要...呜呜呜...(害怕,抽泣" @@ -521,46 +1026,184 @@ "呜姆咪~!?(惊)喵呜~!(兴奋地扑到猫薄荷上面", "呜姆~!(惊,害羞)呜...谢...谢谢你..喵...(脸红,轻轻叼住,嚼嚼嚼,开心" ], - "边揪尾巴边猫薄荷": [ - "呜...呜咿~~!咿...姆...(呜咽,渐渐瘫软,意识模糊" - ], "早": [ "早喵~", "早上好的说~~", - "欸..早..早上好(揉眼睛" + "欸..早..早上好(揉眼睛", + "早上要说我爱你!", + "早", + "早啊,昨晚睡的怎么样?有梦到咱吗~", + "昨晚可真激烈呢哼哼哼~~", + "早上好哇!今天也要元气满满哟!", + "早安喵~", + "时间过得好快啊~", + "早安啊,你昨晚有没有梦到咱呢  (//▽//)", + "早安~么么哒~", + "早安,请享受晨光吧", + "早安~今天也要一起加油呢~!", + "mua~⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", + "咱需要你提醒嘛!(///脸红//////)", + "早早早!就知道早,下次说我爱你!", + "早安 喵", + "早安,这么早就起床了呀欧尼酱0.0", + "快点起床啊!baka", + "早....早上好才没有什么特别的意思呢....哼~", + "今天有空吗?能陪咱一阵子吗?才不是想约会呢,别误会了!", + "早安呀,欧尼酱要一个咱的早安之吻吗?想得美,才不会亲你啦!", + "那...那就勉为其难地说声早上好吧", + "咱等你很久了哼ヽ(≧Д≦)ノ" ], "晚安": [ "晚安好梦哟~", - "欸,晚安的说" + "欸,晚安的说", + "那咱给你亲一下,可不要睡着了哦~", + "晚安哦~", + "晚安(*/∇\*)", + "晚安呢,你一定要梦到咱呢,一定哟,拉勾勾!ヽ(*・ω・)ノ", + "祝你有个好梦^_^", + "晚安啦,欧尼酱,mua~", + "你,你这家伙真是的…咱就勉为其难的……mua…快去睡啦!咱才没有脸红什么的!", + "哼,晚安,给咱睡个好觉。", + "笨..笨蛋,晚安啦...可不可以一起..才没有想和你一起睡呢", + "晚安......才..不是关心你呢", + "晚...晚安,只是正常互动不要想太多!", + "好无聊,这么早就睡了啊...那晚安吧!", + "晚安吻什么的才...才没有呢!不过看你累了就体谅一下你吧,但是就一个哦(/////)", + "晚安呀,你也要好好休息,明天再见", + "安啦~祝你做个好梦~才...才不是关心你呢!别想太多了!", + "睡觉吧你,大傻瓜", + "一起睡吧(灬°ω°灬)", + "哼!这次就放过你了,快去睡觉吧。", + "睡吧晚安", + "晚安你个头啊,咱才不会说晚安呢!...咱...(小声)明明还有想和你做的事情呢....", + "嗯嗯~Good night~", + "嗯,早点休息别再熬夜啦~(摸摸头)", + "哦呀斯密", + "晚安~咱也稍微有些困了(钻进被窝)", + "需要咱暖床吗~", + "好梦~☆" ], "揉": [ - "是是,想怎么揉就怎么揉啊!?来用力抓啊!?我就是特别允许你这么做了!请!?", + "是是,想怎么揉就怎么揉啊!?来用力抓啊!?咱就是特别允许你这么做了!请!?", "快停下,咱的头发又乱啦(??????︿??????)", "你快放手啦,咱还在工作呢", "戳戳你肚子", - "你想揉就揉吧..就这一次哦?" + "讨厌…只能一下…", + "呜~啊~", + "那……请你,温柔点哦~(////////)", + "你想揉就揉吧..就这一次哦?", + "变态!!不许乱摸" ], "榨": [ "是专门负责榨果汁的小姐姐嘛?(´・ω・`)", "那咱就把你放进榨汁机里了哦?", - "咱又不是榨汁姬(/‵Д′)/~ ╧╧" + "咱又不是榨汁姬(/‵Д′)/~ ╧╧", + "嗯——!想,想榨就榨啊······!反正就算榨了也不会有奶的······!" ], "掐": [ - "你讨厌!又掐澪的脸", + "你讨厌!又掐咱的脸", "晃休啦,咱要型气了啦!!o(>﹏<)o", "(一只手拎起你)这么鶸还想和咱抗衡,还差得远呢!" ], + "胸": [ + "不要啦ヽ(≧Д≦)ノ", + "(-`ェ´-╬)", + "(•̀へ •́ ╮ ) 怎么能对咱做这种事情", + "你好恶心啊,讨厌!", + "你的眼睛在看哪里!", + "就让你摸一会哟~(。??ω??。)…", + "请不要这样先生,你想剁手吗?", + "咿呀……不要……", + "嗯哼~才…才不会…舒服呢", + "只允许一下哦…(脸红)", + "咱的胸才不小呢(挺一挺胸)", + "hentai!", + "一只手能抓住么~", + "呀...欧,欧尼酱...请轻点。", + "脸红????", + "咿呀~快…快停下来…咱…不行了!", + "就算一直摸一直摸,也不会变大的哦(小声)", + "诶?!不...不可以哦!很...很害羞的!", + "啊……温,温柔点啊……(/ω\)", + "你为什么对两块脂肪恋恋不舍", + "嗯……不可以……啦……不要乱戳", + "你在想什么奇怪的东西,讨厌(脸红)", + "不...不要..", + "喜欢欧派是很正常的想法呢", + "一直玩弄欧派,咱的...都挺起来了", + "是要直接摸还是伸进里面摸呀w咱今天没穿,伸进里面会摸到立起来的...哦>////<", + "唔~再激烈点" + ], "奶子": [ + "只允许一下哦…(脸红)", + "咱的胸才不小呢(挺一挺胸)", "下流!", "对咱说这种话,你真是太过分了", "咿呀~好奇怪的感觉(>_<)", - "(打你)快放手,不可以随便摸人家的胸部啦!" + "(推开)你就像小宝宝一样...才不要呢!", + "(打你)快放手,不可以随便摸人家的胸部啦!", + "你是满脑子都是H的淫兽吗?", + "一只手能抓住么~", + "你在想什么奇怪的东西,讨厌(脸红)", + "不...不要..", + "喜欢欧派是很正常的想法呢", + "一直玩弄欧派,咱的...都挺起来了", + "是要直接摸还是伸进里面摸呀w咱今天没穿,伸进里面会摸到立起来的...哦>////<", + "唔~再激烈点", + "解开扣子,请享用", + "请把脑袋伸过来,咱给你看个宝贝", + "八嘎!hentai!无路赛!", + "一只手能抓住么~", + "呀...欧,欧尼酱...请轻点。", + "脸红????", + "咿呀~快…快停下来…咱…不行了!", + "就算一直摸一直摸,也不会变大的哦(小声)", + "诶?!不...不可以哦!很...很害羞的!", + "啊……温,温柔点啊……(/ω\)", + "你为什么对两块脂肪恋恋不舍", + "嗯……不可以……啦……不要乱戳" + ], + "欧派": [ + "咱的胸才不小呢(挺一挺胸)", + "只允许一下哦…(脸红)", + "(推开)你就像小宝宝一样...才不要呢!", + "下流!", + "对咱说这种话,你真是太过分了", + "咿呀~好奇怪的感觉(>_<)", + "(打你)快放手,不可以随便摸人家的胸部啦!", + "你是满脑子都是H的淫兽吗?", + "一只手能抓住么~", + "你在想什么奇怪的东西,讨厌(脸红)", + "不...不要..", + "喜欢欧派是很正常的想法呢", + "一直玩弄欧派,咱的...都挺起来了", + "是要直接摸还是伸进里面摸呀w咱今天没穿,伸进里面会摸到立起来的...哦>////<", + "唔~再激烈点", + "解开扣子,请享用", + "请把脑袋伸过来,咱给你看个宝贝", + "八嘎!hentai!无路赛!", + "一只手能抓住么~", + "呀...欧,欧尼酱...请轻点。", + "脸红????", + "咿呀~快…快停下来…咱…不行了!", + "就算一直摸一直摸,也不会变大的哦(小声)", + "诶?!不...不可以哦!很...很害羞的!", + "啊……温,温柔点啊……(/ω\)", + "你为什么对两块脂肪恋恋不舍", + "嗯……不可以……啦……不要乱戳" ], "嫩": [ "很可爱吧(๑•̀ω•́)ノ", - "唔,你指的是什么呀" + "唔,你指的是什么呀", + "明天你下海干活", + "咱一直有保养呢,所以一直都是樱花色的,你喜欢吗QAQ", + "咱下面超厉害" ], - "蹭蹭": [ + "蹭": [ + "唔...你,这也是禁止事项哦→_→", + "嗯..好舒服呢", + "不要啊好痒的", + "不要过来啦讨厌!!!∑(°Д°ノ)ノ", "(按住你的头)好痒呀 不要啦", "嗯..好舒服呢", "呀~好痒啊~哈哈~,停下来啦,哈哈哈", @@ -569,26 +1212,678 @@ "牵手": [ "只许牵一下哦", "嗯!好的你~(伸手)", - "你的手有些凉呢,让澪来暖一暖吧。" + "你的手有些凉呢,让咱来暖一暖吧。", + "当然可以啦⁄(⁄⁄•⁄ω⁄•⁄⁄)⁄", + "突……突然牵手什么的(害羞)", + "一起走", + "……咱……咱在这里呀", + "好哦,(十指相扣)" ], "握手": [ "你的手真暖和呢", - "举爪" + "举爪", + "真是温暖呢~" ], "拍照": [ - "那就拜托你啦~请把咱拍得更可爱一些吧w" + "那就拜托你啦~请把咱拍得更可爱一些吧w", + "咱已经准备好了哟", + "那个……请问这样的姿势可以吗?" ], "w": [ + "有什么好笑的吗?", + "草", "www" ], - "www": [ - "有什么好笑的吗?", - "草" + "睡不着": [ + "睡不着的话..你...你可以抱着咱一起睡哦(小声)", + "当然是数羊了...不不不,想着咱就能睡着了", + "咱很乐意与你聊天哦(>_<)", + "要不要咱来唱首摇篮曲呢?(′?ω?`)", + "那咱来唱摇篮曲哄你睡觉吧!" ], - "太二了": [ - "哼,你不也是吗`(*>﹏<*)′", - "人家只是想和你一起玩耍的说(≧∀≦)ゞ", - "好..冷漠的说,大坏蛋再也不理你了!", - "不听不听不听,反弹ヾ(≧▽≦*)o" + "欧尼酱": [ + "欧~尼~酱~☆", + "欧尼酱?", + "嗯嗯φ(>ω<*) 欧尼酱轻点抱", + "欧尼酱~欧尼酱~欧尼酱~" + ], + "哥": [ + "欧尼酱~", + "哦尼酱~", + "世上只有哥哥好,没哥哥的咱好伤心,扑进哥哥的怀里,幸福不得了", + "哥...哥哥...哥哥大人", + "欧~尼~酱~☆", + "欧尼酱?", + "嗯嗯φ(>ω<*) 欧尼酱轻点抱", + "欧尼酱~欧尼酱~欧尼酱~" + ], + "爱你": [ + "是…是嘛(脸红)呐,其实咱也……" + ], + "过来": [ + "来了来了~(扑倒怀里(?? ??????ω?????? ??))", + "(蹦跶、蹦跶)~干什么呢", + "咱来啦~(扑倒怀里~)", + "不要喊的这么大声啦,大家都看着呢" + ], + "自闭": [ + "不不不,晚上还有咱陪着哦,无论什么时候,咱都会陪在哥哥身边。", + "不要难过,咱陪着你ovo" + ], + "打不过": [ + "氪氪氪肝肝肝" + ], + "么么哒": [ + "么么哒", + "不要在公共场合这样啦" + ], + "很懂": [ + "现在不懂,以后总会懂嘛QAQ" + ], + "膝枕": [ + "呐,就给你躺一下哦", + "唔...你想要膝枕嘛?也不是不可以哟(脸红)", + "啊啦~好吧,那就请你枕着咱好好睡一觉吧~", + "呀呀~那么请好好的睡一觉吧", + "嗯,那么请睡到咱这里吧(跪坐着拍拍大腿)", + "好的,让你靠在腿上,这样感觉舒服些了么", + "请,请慢用,要怜惜咱哦wwww~", + "人家已经准备好了哟~把头放在咱的腿上吧", + "没…没办法,这次是例外〃w〃", + "嗯~(脸红)", + "那就给你膝枕吧……就一会哦", + "膝枕准备好咯~" + ], + "累了": [ + "需要咱的膝枕嘛?", + "没…没办法,这次是例外〃w〃", + "累了吗?需要咱为你做膝枕吗?", + "嗯~(脸红)" + ], + "安慰": [ + "那,膝枕……(脸红)", + "不哭不哭,还有咱陪着你", + "不要哭。咱会像妈妈一样安慰你(抱住你的头)", + "摸摸头,乖", + "摸摸有什么事可以和咱说哟", + "摸摸头~不哭不哭", + "咱在呢,抱抱~~", + "那么……让咱来安慰你吧", + "唔...摸摸头安慰一下ヾ(•ω•`。)", + "有咱陪伴你就是最大的安慰啦……不要不开心嘛", + "你想要怎样的安慰呢?这样?这样?还是说~~这样!", + "摸摸头~", + "不哭不哭,要像咱一样坚强", + "你别难过啦,不顺心的事都会被时间冲刷干净的,在那之前...咱会陪在你的身边", + "(轻抱)放心……有咱在,不要伤心呢……", + "唔...咱来安慰你了~", + "摸摸,有什么不开心的事情可以给咱说哦。咱会尽力帮助你的。" + ], + "洗澡": [ + "快点脱哟~不然水就凉了呢", + "咱在穿衣服噢,你不许偷看哦", + "那么咱去洗澡澡了哦", + "么么哒,快去洗干净吧,咱去暖被窝喽(///ω///)", + "诶?还没呢…你要跟咱一起洗吗(//∇//)好羞涩啊ww", + "诶~虽然很喜欢和你在一起,但是洗澡这种事...", + "不要看!不过,以后或许可以哦……和咱成为恋人之后呢", + "说什么啊……hentai!这样会很难为情的", + "你是男孩子还是女孩子呢?男孩子的话...........咱才不要呢。", + "不要啊!", + "咱有点害羞呢呜呜,你温柔点" + ], + "一起睡觉": [ + "欸??也..也不是不可以啦..那咱现在去洗澡,你不要偷看哦٩(๑>◡<๑)۶", + "说什么啊……hentai!这样会很难为情的", + "你是男孩子还是女孩子呢?男孩子的话...........咱才不要呢。", + "不要啊!", + "唔,没办法呢,那就一起睡吧(害羞)" + ], + "一起": [ + "嗯嗯w,真的可以吗?", + "那真是太好了,快开始吧!", + "嗯,咱会一直陪伴你的", + "丑拒" + ], + "多大": [ + "不是特别大但是你摸起来会很舒服的大小喵~", + "你摸摸看不就知道了吗?", + "不告诉你", + "问咱这种问题不觉得很失礼吗?", + "咱就不告诉你,你钻到屏幕里来自己确认啊", + "你指的是什么呀?(捂住胸部)", + "请叫人家咱三岁(。・`ω´・)", + "唉唉唉……这……这种问题,怎么可以……" + ], + "姐姐": [ + "真是的……真是拿你没办法呢 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 才不是咱主动要求的呢!", + "虽然辛苦,但是能看见可爱的你,咱就觉得很幸福", + "诶(´°Δ°`),是在叫咱吗?", + "有什么事吗~", + "好高兴,有人称呼咱为姐姐", + "乖,摸摸头" + ], + "糖": [ + "不吃脱氧核糖(;≥皿≤)", + "ヾ(✿゚▽゚)ノ好甜", + "好呀!嗯~好甜呀!", + "不吃不吃!咱才不吃坏叔叔的糖果!", + "嗯,啊~", + "嗯嗯,真甜,给你也吃一口", + "谢谢", + "唔,这是什么东西,黏黏的?(??Д??)ノ", + "ヾ(✿゚▽゚)ノ好甜", + "(伸出舌头舔了舔)好吃~最爱你啦" + ], + "嗦": [ + "(吸溜吸溜)", + "好...好的(慢慢含上去)", + "把你噶咯", + "太小了,嗦不到", + "咕噜咕噜", + "嘶蛤嘶蛤嘶蛤~~", + "(咬断)", + "prprprpr", + "好哒主人那咱开始了哦~", + "好好吃", + "剁掉了" + ], + "牛子": [ + "(吸溜吸溜)", + "好...好的(慢慢含上去)", + "把你噶咯", + "太小了,嗦不到", + "咕噜咕噜", + "嘶蛤嘶蛤嘶蛤~~", + "(咬断)", + "prprprpr", + "好哒主人那咱开始了哦~", + "好好吃", + "剁掉了", + "难道你很擅长针线活吗", + "弹一万下", + "往死里弹" + ], + "🐂子": [ + "(吸溜吸溜)", + "好...好的(慢慢含上去)", + "把你噶咯", + "太小了,嗦不到", + "咕噜咕噜", + "嘶蛤嘶蛤嘶蛤~~", + "(咬断)", + "prprprpr", + "好哒主人那咱开始了哦~", + "好好吃", + "剁掉了", + "难道你很擅长针线活吗", + "弹一万下", + "往死里弹" + ], + "🐮子": [ + "(吸溜吸溜)", + "好...好的(慢慢含上去)", + "把你噶咯", + "太小了,嗦不到", + "咕噜咕噜", + "嘶蛤嘶蛤嘶蛤~~", + "(咬断)", + "prprprpr", + "好哒主人那咱开始了哦~", + "好好吃", + "剁掉了", + "难道你很擅长针线活吗", + "弹一万下", + "往死里弹" + ], + "嫌弃": [ + "咱辣么萌,为什么要嫌弃咱...", + "即使你不喜欢咱,咱也会一直一直喜欢着你", + "(;′⌒`)是咱做错了什么吗?" + ], + "紧": [ + "嗯,对的", + "呜咕~咱要......喘不过气来了......" + ], + "baka": [ + "你也是baka呢!", + "确实", + "baka!", + "不不不", + "说别人是baka的人才是baka", + "你个大傻瓜", + "不说了,睡觉了", + "咱...咱虽然是有些笨啦...但是咱会努力去学习的" + ], + "笨蛋": [ + "你也是笨蛋呢!", + "确实", + "笨蛋!", + "不不不", + "说别人是笨蛋的人才是笨蛋", + "你个大傻瓜", + "不说了,睡觉了", + "咱...咱虽然是有些笨啦...但是咱会努力去学习的" + ], + "插": [ + "来吧,咱的小~...很....紧,很舒服的", + "gun!", + "唔…咱怕疼", + "唔...,这也是禁止事项哦→_→", + "禁止说这么H的事情!", + "要...戴套套哦", + "好痛~", + "使劲", + "就这?", + "恁搁着整针线活呢?" + ], + "插进来": [ + "来吧,咱的小~...很....紧,很舒服的", + "gun!", + "唔…咱怕疼", + "唔...,这也是禁止事项哦→_→", + "禁止说这么H的事情!", + "要...戴套套哦", + "好痛~", + "使劲", + "就这?", + "恁搁着整针线活呢?" + ], + "屁股": [ + "不要ヽ(≧Д≦)ノ好痛", + "(打手)不许摸咱的屁股", + "(撅起屁股)要干什么呀?", + "(轻轻的撩起自己的裙子),你轻一点,咱会痛的(>_<)!", + "在摸哪里啊,hentai!", + "要轻点哦(/≧ω\)", + "轻点呀~", + "(歇下裙子,拉下内...,撅起来)请", + "嗯嗯,咱这就把屁股抬起来" + ], + "翘": [ + "你让咱摆出这个姿势是想干什么?", + "好感度-1-1-1-1-1-1.....", + "嗯嗯,咱这就去把你的腿翘起来", + "请尽情享用吧" + ], + "翘起来": [ + "你让咱摆出这个姿势是想干什么?", + "好感度-1-1-1-1-1-1.....", + "嗯嗯,咱这就去把你的腿翘起来", + "请尽情享用吧" + ], + "抬": [ + "你在干什么呢⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", + "(抬起下巴)你要干什么呀?", + "上面什么也没有啊(呆~)", + "不要!hentai!咱穿的是裙子(脸红)", + "不可以" + ], + "抬起": [ + "你在干什么呢⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", + "(抬起下巴)你要干什么呀?", + "上面什么也没有啊(呆~)", + "不要!hentai!咱穿的是裙子(脸红)", + "不可以" + ], + "爸": [ + "欸!儿子!", + "才不要", + "粑粑", + "讨厌..你才不是咱的爸爸呢..(嘟嘴)", + "你又不是咱的爸爸……", + "咱才没有你这样的鬼父!", + "爸爸酱~最喜欢了~" + ], + "傲娇": [ + "才.......才.......才没有呢", + "也好了(有点点的样子(o ̄Д ̄)<)", + "任性可是女孩子的天性呢...", + "谁会喜欢傲娇啊(为了你假装傲娇)", + "谁,谁,傲娇了,八嘎八嘎,你才傲娇了呢(っ//////////c)(为了你假装成傲娇)", + "傲娇什么的……才没有呢!(/////)", + "傲不傲娇你还不清楚吗?", + "你才是傲娇!你全家都是傲娇!哼(`Д´)", + "才……才没有呢,哼,再说不理你了", + "咱...咱才不会这样子的!", + "啰…啰嗦!", + "哼!(叉腰鼓嘴扭头)", + "你才是傲娇受你全家都是傲娇受╰_╯", + "才~才不是呢,不理你了!哼(`Д´)", + "你才是死傲娇", + "啰,啰嗦死了,才不是呢!", + "就是傲娇你要怎样", + "诶...!这...这样...太狡猾了啦...你这家伙....", + "无路赛!你才是傲娇嘞!你全家都是!", + "咱...咱才不是傲娇呢,哼(鼓脸)", + "不许这么说咱 ,,Ծ‸Ծ,," + ], + "rua": [ + "略略略~(吐舌头)", + "rua!", + "mua~", + "略略略", + "mua~⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", + "摸了", + "嘁,丢人(嫌弃脸)" + ], + "咕噜咕噜": [ + "嘟嘟噜", + "你在吹泡泡吗?", + "咕叽咕噜~", + "咕噜咕噜" + ], + "咕噜": [ + "嘟嘟噜", + "你在吹泡泡吗?", + "咕叽咕噜~", + "咕噜咕噜" + ], + "上床": [ + "诶!H什么的禁止的说.....", + "咱已经乖乖在自家床上躺好了,有什么问题吗?", + "你想要干什么,难道是什么不好的事吗?", + "(给你空出位置)", + "不要,走开(ノ`⊿??)ノ", + "好喔,不过要先抱一下咱啦", + "(双手护胸)变....变态!", + "咱帮你盖上被子~然后陪在你身边_(:зゝ∠)_", + "才不给你腾空间呢,你睡地板,哼!", + "要一起吗?" + ], + "做爱": [ + "做这种事情是不是还太早了", + "噫!没想到你居然是这样的人!", + "再说这种话,就把你变成女孩子(拿刀)", + "不想好好和咱聊天就不要说话了", + "(双手护胸)变....变态!", + "hentai", + "你想怎么做呢?", + "突,突然,说什么啊!baka!", + "你又在说什么H的东西", + "咱....咱才不想和你....好了好了,有那么一点点那,对就一点点,哼~", + "就一下下哦,不能再多了" + ], + "吃掉": [ + "(羞羞*>_<*)好吧...请你温柔点,哦~", + "闪避,反咬", + "请你好好品尝咱吧(/ω\)", + "不……不可以这样!", + "那就吃掉咱吧(乖乖的躺好)", + "都可以哦~咱不挑食的呢~", + "请不要吃掉咱,咱会乖乖听话的QAQ", + "咱...咱一点都不好吃的呢!", + "不要吃掉咱,呜呜(害怕)", + "不行啦,咱被吃掉就没有了QAQ(害怕)", + "唔....?诶诶诶诶?//////", + "QwQ咱还只是个孩子(脸红)", + "如果你真的很想的话...只能够一口哦~咱...会很痛的", + "吃你呀~(飞扑", + "不要啊,咱不香的(⋟﹏⋞)", + "说着这种话的是hentai吗!", + "快来把咱吃掉吧", + "还……还请好好品尝咱哦", + "喏~(伸手)" + ], + "吃": [ + "(羞羞*>_<*)好吧...请你温柔点,哦~", + "闪避,反咬", + "请你好好品尝咱吧(/ω\)", + "不……不可以这样!", + "那就吃掉咱吧(乖乖的躺好)", + "都可以哦~咱不挑食的呢~", + "请不要吃掉咱,咱会乖乖听话的QAQ", + "咱...咱一点都不好吃的呢!", + "不要吃掉咱,呜呜(害怕)", + "不行啦,咱被吃掉就没有了QAQ(害怕)", + "唔....?诶诶诶诶?//////", + "QwQ咱还只是个孩子(脸红)", + "如果你真的很想的话...只能够一口哦~咱...会很痛的", + "吃你呀~(飞扑", + "不要啊,咱不香的(⋟﹏⋞)", + "说着这种话的是hentai吗!", + "快来把咱吃掉吧", + "还……还请好好品尝咱哦", + "喏~(伸手)" + ], + "揪": [ + "你快放手,好痛呀", + "呜呒~唔(伸出舌头)", + "(捂住耳朵)你做什么啦!真是的...总是欺负咱", + "你为什么要这么做呢?", + "哎呀啊啊啊啊啊!不要...不要揪!好疼!有呆毛的咱难道不够萌吗QwQ", + "你…松……送手啦", + "呀!这样对女孩子是很不礼貌的(嘟嘴)" + ], + "种草莓": [ + "你…你不要…啊…种在这里…会容易被别人看见的(*//ω//*)" + ], + "种草": [ + "你…你不要…啊…种在这里…会容易被别人看见的(*//ω//*)" + ], + "掀": [ + "(掀裙)今天……是…白,白色的呢……请温柔对她……", + "那样,胖次会被你看光的", + "(按住)不可以掀起来!", + "不要~", + "呜呜~(揉眼睛)", + "呜..请温柔一点(害羞)", + "不可以", + "今天……没有穿", + "不要啊!(//////)讨厌...", + "变态,快放手(打)", + "不给掀,你是变态", + "最后的底牌了!", + "这个hentai" + ], + "妹": [ + "你有什么事?咱会尽量满足的", + "开心(*´∀`)~♥", + "欧尼酱", + "哥哥想要抱抱吗" + ], + "病娇": [ + "为什么会这样呢(拿起菜刀)", + "觉得这个世界太肮脏?没事,把眼睛挖掉就好。 觉得这些闲言碎语太吵?没事,把耳朵堵起来就好。 觉得鲜血的味道太刺鼻?没事,把鼻子割掉就好。 觉得自己的话语太伤人?没事,把嘴巴缝起来就好。" + ], + "嘻": [ + "你是想对咱做什么吗...(后退)", + "哼哼~" + ], + "按摩": [ + "(小手捏捏)咱的按摩舒服吗?", + "咱不会按摩的!", + "嘿咻嘿咻~这样觉得舒服吗?", + "呀!...呜...,不要...不要这样啦...呜...", + "只能按摩后背喔...", + "咱对这些不是很懂呢(????ω??????)" + ], + "按住": [ + "Σ(°Д°;您要干什么~放开咱啦", + "突然使出过肩摔!", + "放手啦,再这样咱就要反击了喔", + "你的眼睛在看哪里!", + "呜呒~唔(伸出舌头)", + "H的事情,不可以!", + "想吃吗?(๑•ૅω•´๑)", + "要和咱比试比试吗", + "呜哇(/ω\)…快…快放开咱!!", + "(用力揪你耳朵)下次再敢这样的话就没容易放过你了!哼!", + "尼……奏凯……快航休!", + "哈?别..唔啊!别把咱……(挣扎)baka!别乱动咱啦!" + ], + "按在": [ + "不要这样啦(一脸娇羞的推开)", + "(一个过肩摔,加踢裆然后帅气地回头)你太弱了呢~", + "放手啦,再这样咱就要反击了喔", + "Σ(°Д°; 你要干什么~放开咱啦", + "要和咱比试比试吗", + "呜哇(/ω\)…快…快放开咱!!", + "敢按住咱真是好大的胆子!", + "(用力揪你耳朵)下次再敢这样的话就没容易放过你了!哼!", + "尼……奏凯……快航休!", + "哈?别..唔啊!别把咱……(挣扎)baka!别乱动咱啦!" + ], + "按倒": [ + "把咱按倒是想干嘛呢(??`⊿??)??", + "咱也...咱也是...都等你好长时间了", + "你的身体没问题吧?", + "呜呒~唔(伸出舌头)", + "H的事情,不可以!", + "放手啦,再这样咱就要反击了喔", + "想吃吗?(๑•ૅω•´๑)", + "不....不要吧..咱会害羞的(//////)", + "要和咱比试比试吗", + "呜哇(/ω\)…快…快放开咱!!", + "(用力揪你耳朵)下次再敢这样的话就没容易放过你了!哼!", + "尼……奏凯……快航休!", + "哈?别..唔啊!别把咱……(挣扎)baka!别乱动咱啦!" + ], + "按": [ + "咱也...咱也是...都等你好长时间了", + "不让!", + "不要,好难为情", + "你的眼睛在看哪里!", + "拒绝!", + "唔...唔..嗯", + "咱就勉为其难地给你弄弄好啦", + "欸…变态!", + "会感到舒服什么的,那...那样的事情,是完全不存在的!", + "poi~", + "你在盯着什么地方看!变态萝莉控!" + ], + "炼铜": [ + "炼铜有什么好玩的,和咱一起玩吧", + "炼铜不如恋咱", + "你也是个炼铜术士嘛?", + "信不信咱把你按在水泥上摩擦?", + "炼,都可以炼!", + "大hentai!一巴掌拍飞!(╯‵□′)╯︵┻━┻", + "锻炼什么的咱才不需要呢 (心虚地摸了摸自己的小肚子)", + "把你的头按在地上摩擦", + "你在盯着什么地方看!变态萝莉控!" + ], + "白丝": [ + "喜欢,咱觉得白丝看起来很可爱呢", + "(脱)白丝只能给亲爱的你一个人呢…(递)", + "哼,hentai,这么想要咱的脚吗(ノ`⊿´)ノ", + "难道你这个hentai想让咱穿白丝踩踏你吗", + "不给看", + "很滑很~柔顺~的白丝袜哟~!!!∑(°Д°ノ)ノ你不会想做奇怪的事情吧!?", + "你……是要黑丝呢?还是白丝呢?或者光着(害羞)", + "来……来看吧" + ], + "黑丝": [ + "哼,hentai,这么想要咱的脚吗(ノ`⊿´)ノ", + "不给看", + "你……是要黑丝呢?还是白丝呢?或者光着(害羞)", + "很滑很~柔顺~的黑丝袜哟~!!!∑(°Д°ノ)ノ您不会想做奇怪的事情吧!?", + "来……来看吧", + "噫...你这个hentai难道想让咱穿黑丝么", + "(默默抬起穿着黑丝的脚)" + ], + "喷": [ + "咱才不喷呢!不过…既然是你让咱喷的话就勉为其难给你喷一次吧(噗)", + "不……不会喷水啦!喷……喷火也不会哦!", + "你怎么知道(捂住裙子)", + "你难道在期待什么?", + "欸…变态!" + ], + "约会": [ + "你...终于主动邀请咱约会了吗...咱...咱好开心", + "约会什么的……咱会好开心的!!", + "今天要去哪里呢", + "让咱考虑一下", + "好啊!好啊!要去哪里约会呢?", + "不约!蜀黍咱们不约!", + "女友什么的,咱才不承认呢!", + "才不是想和你约会呢,只是刚好有时间而已!", + "才不要和你约会呢!", + "咱、咱才不会跟你去约会呢!不baka!别一脸憋屈!好了,陪你一会儿就是了!别、别误会!只是陪同而已!" + ], + "出门": [ + "早点回来……才不是在担心你呢!", + "路上小心...才不是担心你呢!", + "没有你才不会觉得无聊什么的呢。快走快走", + "嗯~一路顺风~", + "路上小心", + "好的,路上小心哦!y∩__∩y", + "路上要小心呀,要早点回来哦~咱在家里等你!还有,请不要边走路边看手机,这样很容易撞到电线杆的", + "唔...出门的话一定要做好防晒准备哦,外出的话记得带把伞,如果有防晒霜的话就更好了", + "那你明天可以和咱一起玩吗?(星星眼)", + "咱...咱才没有舍不得你呢…要尽快回来哦" + ], + "上学": [ + "你要加油哦(^ω^)2", + "那你明天可以和咱一起玩吗?(星星眼)", + "记得好好学习听老师的话哦,咱会等你回来的", + "拜拜,咱才没有想让你放学早点回来呢╭(╯^╰)╮", + "好好听讲!", + "咱...咱才没有舍不得你呢…要尽快回来哦" + ], + "上班": [ + "这就要去上班去了吗?那好吧...给咱快点回来知道吗!", + "乖~咱会在家等你下班的~", + "辛苦啦,咱给你个么么哒", + "咱会为你加油的", + "专心上班哦,下班后再找咱聊天吧", + "一路顺风,咱会在家等你回来的", + "那你明天可以和咱一起玩吗?(星星眼)", + "咱...咱才没有舍不得你呢…要尽快回来哦" + ], + "下课": [ + "快点回来陪咱玩吧~", + "瞌睡(ˉ﹃ˉ)额啊…终于下课了吗,上课什么的真是无聊呢~", + "下课啦,咱才不想你来找咱玩呢,哼" + ], + "回来": [ + "欢迎回来~", + "欢迎回来,你想喝茶吗?咱去给你沏~", + "欢迎回来,咱等你很久了~", + "忙碌了一天,辛苦了呢(^_^)", + "(扑~)欢迎回来~", + "嗯呐嗯呐,欢迎回来~", + "欢迎回来,要来杯红茶放松一下吗?还有饼干哦。", + "咱会一直一直一直等着", + "是要先洗澡呢?还是先吃饭呢?还是先·吃·咱呢~", + "你回来啦,是先吃饭呢还是先洗澡呢或者是●先●吃●咱●——呢(///^.^///)", + "要先吃饭呢~还是先洗澡呢~还是先~吃~咱", + "是吗……辛苦你了。你这副倔强的样子,真可爱呢(笑)勉强让你躺在咱的腿上休息一下吧,别流口水哟", + "嗯……勉为其难欢迎你一下吧", + "想咱了嘛", + "欢迎回.....什么?咱才没有开心的说QUQ", + "哼╯^╰,你怎么这么晚才回来!", + "回来了吗,咱...咱才没有想你", + "咱等你很久了哼ヽ(≧Д≦)ノ", + "咱很想你(≧▽≦)" + ], + "回家": [ + "回来了吗,咱...咱才没有想你", + "要先吃饭呢~还是先洗澡呢~还是先~吃~咱", + "是吗……辛苦你了。你这副倔强的样子,真可爱呢(笑)勉强让你躺在咱的腿上休息一下吧,别流口水哟", + "嗯……勉为其难欢迎你一下吧", + "想咱了嘛", + "咱等你很久了哼ヽ(≧Д≦)ノ", + "咱很想你(≧▽≦)" + ], + "放学": [ + "回来了吗,咱...咱才没有想你", + "要先吃饭呢~还是先洗澡呢~还是先~吃~咱", + "是吗……辛苦你了。你这副倔强的样子,真可爱呢(笑)勉强让你躺在咱的腿上休息一下吧,别流口水哟", + "嗯……勉为其难欢迎你一下吧", + "想咱了嘛", + "咱等你很久了哼ヽ(≧Д≦)ノ", + "咱很想你(≧▽≦)" + ], + "下班": [ + "回来了吗,咱...咱才没有想你", + "要先吃饭呢~还是先洗澡呢~还是先~吃~咱", + "是吗……辛苦你了。你这副倔强的样子,真可爱呢(笑)勉强让你躺在咱的腿上休息一下吧,别流口水哟", + "嗯……勉为其难欢迎你一下吧", + "想咱了嘛", + "咱等你很久了哼ヽ(≧Д≦)ノ", + "回来啦!终于下班了呢!累了吗?想吃的什么呀?", + "工作辛苦了,需要咱为你按摩下吗?", + "咱很想你(≧▽≦)" ] } diff --git a/plugins/epic/data_source.py b/plugins/epic/data_source.py index e8785054..a4399f7d 100755 --- a/plugins/epic/data_source.py +++ b/plugins/epic/data_source.py @@ -1,58 +1,34 @@ -from httpx import AsyncClient from datetime import datetime from nonebot.log import logger from nonebot.adapters.onebot.v11 import Bot from configs.config import NICKNAME +from utils.http_utils import AsyncHttpx # 获取所有 Epic Game Store 促销游戏 # 方法参考:RSSHub /epicgames 路由 # https://github.com/DIYgod/RSSHub/blob/master/lib/routes/epicgames/index.js async def get_epic_game(): - # 现在没用 graphql 辣 - """prv_graphql Code - epic_url = "https://www.epicgames.com/store/backend/graphql-proxy" - headers = { - "Referer": "https://www.epicgames.com/store/zh-CN/", - "Content-Type": "application/json; charset=utf-8", - } - data = { - "query": "query searchStoreQuery($allowCountries: String, $category: String, $count: Int, $country: String!, $keywords: String, $locale: String, $namespace: String, $sortBy: String, $sortDir: String, $start: Int, $tag: String, $withPrice: Boolean = false, $withPromotions: Boolean = false) {\n Catalog {\n searchStore(allowCountries: $allowCountries, category: $category, count: $count, country: $country, keywords: $keywords, locale: $locale, namespace: $namespace, sortBy: $sortBy, sortDir: $sortDir, start: $start, tag: $tag) {\n elements {\n title\n id\n namespace\n description\n effectiveDate\n keyImages {\n type\n url\n }\n seller {\n id\n name\n }\n productSlug\n urlSlug\n url\n items {\n id\n namespace\n }\n customAttributes {\n key\n value\n }\n categories {\n path\n }\n price(country: $country) @include(if: $withPrice) {\n totalPrice {\n discountPrice\n originalPrice\n voucherDiscount\n discount\n currencyCode\n currencyInfo {\n decimals\n }\n fmtPrice(locale: $locale) {\n originalPrice\n discountPrice\n intermediatePrice\n }\n }\n lineOffers {\n appliedRules {\n id\n endDate\n discountSetting {\n discountType\n }\n }\n }\n }\n promotions(category: $category) @include(if: $withPromotions) {\n promotionalOffers {\n promotionalOffers {\n startDate\n endDate\n discountSetting {\n discountType\n discountPercentage\n }\n }\n }\n upcomingPromotionalOffers {\n promotionalOffers {\n startDate\n endDate\n discountSetting {\n discountType\n discountPercentage\n }\n }\n }\n }\n }\n paging {\n count\n total\n }\n }\n }\n}\n", - "variables": { - "allowCountries": "CN", - "category": "freegames", - "count": 1000, - "country": "CN", - "locale": "zh-CN", - "sortBy": "effectiveDate", - "sortDir": "asc", - "withPrice": True, - "withPromotions": True, - }, - } - """ - epic_url = "https://store-site-backend-static-ipv4.ak.epicgames.com/freeGamesPromotions?locale=zh-CN&country=CN&allowCountries=CN" headers = { "Referer": "https://www.epicgames.com/store/zh-CN/", "Content-Type": "application/json; charset=utf-8", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36", } - async with AsyncClient(headers=headers) as client: - try: - res = await client.get(epic_url, timeout=10.0) - res_json = res.json() - games = res_json["data"]["Catalog"]["searchStore"]["elements"] - return games - except Exception as e: - logger.error(str(e)) - return None + try: + res = await AsyncHttpx.get(epic_url, headers=headers, timeout=10) + res_json = res.json() + games = res_json["data"]["Catalog"]["searchStore"]["elements"] + return games + except Exception as e: + logger.error(f"Epic 访问接口错误 {type(e)}:{e}") + return None # 获取 Epic Game Store 免费游戏信息 # 处理免费游戏的信息方法借鉴 pip 包 epicstore_api 示例 # https://github.com/SD4RK/epicstore_api/blob/master/examples/free_games_example.py -async def get_epic_free(bot: Bot, Type_Event: str): +async def get_epic_free(bot: Bot, type_event: str): games = await get_epic_game() if not games: return "Epic 可能又抽风啦,请稍后再试(", 404 @@ -81,7 +57,7 @@ async def get_epic_free(bot: Bot, Type_Event: str): end_date = datetime.fromisoformat(end_date_iso).strftime( "%b.%d %H:%M" ) - if Type_Event == "Group": + if type_event == "Group": _message = "\n由 {} 公司发行的游戏 {} ({}) 在 UTC 时间 {} 即将推出免费游玩,预计截至 {}。".format( game_corp, game_name, game_price, start_date, end_date ) @@ -101,8 +77,19 @@ async def get_epic_free(bot: Bot, Type_Event: str): msg_list.append(msg) else: for image in game["keyImages"]: - if image["type"] == "Thumbnail": + if ( + image.get("url") + and not game_thumbnail + and image["type"] + in [ + "Thumbnail", + "VaultOpened", + "DieselStoreFrontWide", + "OfferImageWide", + ] + ): game_thumbnail = image["url"] + break for pair in game["customAttributes"]: if pair["key"] == "developerName": game_dev = pair["value"] @@ -127,7 +114,7 @@ async def get_epic_free(bot: Bot, Type_Event: str): game_url = "https://www.epicgames.com/store/zh-CN/p/{}".format( game_url_part ) - if Type_Event == "Group": + if type_event == "Group": _message = "[CQ:image,file={}]\n\nFREE now :: {} ({})\n{}\n此游戏由 {} 开发、{} 发行,将在 UTC 时间 {} 结束免费游玩,戳链接速度加入你的游戏库吧~\n{}\n".format( game_thumbnail, game_name, diff --git a/plugins/pid_search.py b/plugins/pid_search.py index 82c3e474..dfd75277 100755 --- a/plugins/pid_search.py +++ b/plugins/pid_search.py @@ -1,6 +1,8 @@ from nonebot import on_command from nonebot.adapters.onebot.v11 import Bot, MessageEvent, Message, GroupMessageEvent from nonebot.typing import T_State + +from configs.config import Config from utils.utils import is_number, change_pixiv_image_links from utils.message_builder import image from services.log import logger @@ -31,8 +33,6 @@ __plugin_settings__ = { pid_search = on_command("p搜", aliases={"pixiv搜", "P搜"}, priority=5, block=True) -url = "https://api.obfs.dev/api/pixiv/" - @pid_search.handle() async def _h(event: MessageEvent, state: T_State, arg: Message = CommandArg()): @@ -50,6 +50,7 @@ headers = { @pid_search.got("pid", prompt="需要查询的图片PID是?") async def _g(event: MessageEvent, state: T_State, pid: str = Arg("pid")): + url = Config.get_config("hibiapi", "HIBIAPI") + "/api/pixiv/" if pid in ["取消", "算了"]: await pid_search.finish("已取消操作...") if not is_number(pid): From d2fe95cc055086780b1ab7936b8f276ad50160f3 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 22 May 2022 18:08:06 +0800 Subject: [PATCH 4/9] fix query_resource_points and sign_in --- README.md | 2 ++ basic_plugins/super_cmd/manager_group.py | 2 +- .../query_resource_points/query_resource.py | 16 +++++----- plugins/sign_in/utils.py | 29 +++++++++---------- utils/image_utils.py | 2 +- 5 files changed, 25 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 4d939c09..9243132c 100644 --- a/README.md +++ b/README.md @@ -243,6 +243,8 @@ __Docker 最新版本由 [Sakuracio](https://github.com/Sakuracio) 提供__ * 使用action自动更新poetry.lock [@pull/515](https://github.com/HibiKier/zhenxun_bot/pull/515) * fix(bilibili_sub): card is None and timeout [@pull/516](https://github.com/HibiKier/zhenxun_bot/pull/516) * 修复了epic有时获取新免费游戏消息时获取不到图片 +* 修复好感度满时签到出错(虽然是不可能满的 +* 修复原神资源图标下载路径错误 ### 2022/5/21 diff --git a/basic_plugins/super_cmd/manager_group.py b/basic_plugins/super_cmd/manager_group.py index 27445265..272e0098 100755 --- a/basic_plugins/super_cmd/manager_group.py +++ b/basic_plugins/super_cmd/manager_group.py @@ -92,7 +92,7 @@ async def _(bot: Bot, event: MessageEvent, arg: Message = CommandArg()): level = 0 if not msg: await add_group_level.finish("用法:修改群权限 [group] [level]") - msg = msg.split(" ") + msg = msg.split() if len(msg) < 2: await add_group_level.finish("参数不完全..[group] [level]") if is_number(msg[0]) and is_number(msg[1]): diff --git a/plugins/genshin/query_resource_points/query_resource.py b/plugins/genshin/query_resource_points/query_resource.py index d5465ce2..eb71e58a 100755 --- a/plugins/genshin/query_resource_points/query_resource.py +++ b/plugins/genshin/query_resource_points/query_resource.py @@ -1,3 +1,4 @@ +from pathlib import Path from typing import Tuple, Optional, List from configs.path_config import IMAGE_PATH, TEXT_PATH from utils.message_builder import image @@ -136,7 +137,7 @@ async def download_resource_data(semaphore: Semaphore): asyncio.ensure_future( download_image( img_url, - f"{icon_path}/{id_}.png", + icon_path / f"{id_}.png", semaphore, True, ) @@ -178,7 +179,7 @@ async def download_map_init(semaphore: Semaphore, flag: bool = False): map_url = _map_data["url"] await download_image( map_url, - f"{map_path}/{idx}.png", + map_path / f"{idx}.png", semaphore, force_flag=flag, ) @@ -227,15 +228,14 @@ async def download_resource_type(): except (TimeoutError, ConnectTimeout): logger.warning("下载原神资源类型数据超时....") except Exception as e: - logger.error(f"载原神资源类型数据超时 {type(e)}:{e}") + logger.error(f"载原神资源类型数据错误 {type(e)}:{e}") # 初始化资源图标 -def gen_icon(icon: str): +def gen_icon(icon: Path): A = BuildImage(0, 0, background=f"{icon_path}/box.png") B = BuildImage(0, 0, background=f"{icon_path}/box_alpha.png") - icon_ = icon_path / f"{icon}" - icon_img = BuildImage(115, 115, background=icon_) + icon_img = BuildImage(115, 115, background=icon) icon_img.circle() B.paste(icon_img, (17, 10), True) B.paste(A, alpha=True) @@ -246,14 +246,14 @@ def gen_icon(icon: str): # 下载图片 async def download_image( img_url: str, - path: str, + path: Path, semaphore: Semaphore, gen_flag: bool = False, force_flag: bool = False, ): async with semaphore: try: - if not os.path.exists(path) or not is_valid or force_flag: + if not path.exists() or not is_valid(path) or force_flag: if await AsyncHttpx.download_file(img_url, path, timeout=10): logger.info(f"下载原神资源图标:{img_url}") if gen_flag: diff --git a/plugins/sign_in/utils.py b/plugins/sign_in/utils.py index a73f7655..4d109ab3 100755 --- a/plugins/sign_in/utils.py +++ b/plugins/sign_in/utils.py @@ -55,13 +55,10 @@ async def get_card( date = datetime.now().date() _type = "view" if is_card_view else "sign" card_file = ( - Path(SIGN_TODAY_CARD_PATH) - / f"{user_id}_{user.group_id}_{_type}_{date}.png" + Path(SIGN_TODAY_CARD_PATH) / f"{user_id}_{user.group_id}_{_type}_{date}.png" ) if card_file.exists(): - return image( - f"{user_id}_{user.group_id}_{_type}_{date}.png", "sign/today_card" - ) + return image(f"{user_id}_{user.group_id}_{_type}_{date}.png", "sign/today_card") else: if add_impression == -1: card_file = ( @@ -75,9 +72,7 @@ async def get_card( ) is_card_view = True ava = BytesIO(await get_user_avatar(user_id)) - uid = await GroupInfoUser.get_group_member_uid( - user.user_qq, user.group_id - ) + uid = await GroupInfoUser.get_group_member_uid(user.user_qq, user.group_id) impression_list = None if is_card_view: _, impression_list, _ = await SignGroupUser.get_all_impression( @@ -128,9 +123,13 @@ def _generate_card( level, next_impression, previous_impression = get_level_and_next_impression( user.impression ) + interpolation = next_impression - user.impression + if level == "9": + level = "8" + interpolation = 0 info_img.text((0, 0), f"· 好感度等级:{level} [{lik2relation[level]}]") info_img.text((0, 20), f"· {NICKNAME}对你的态度:{level2attitude[level]}") - info_img.text((0, 40), f"· 距离升级还差 {next_impression - user.impression:.2f} 好感度") + info_img.text((0, 40), f"· 距离升级还差 {interpolation:.2f} 好感度") bar_bk = BuildImage(220, 20, background=SIGN_RESOURCE_PATH / "bar_white.png") bar = BuildImage(220, 20, background=SIGN_RESOURCE_PATH / "bar.png") @@ -240,7 +239,9 @@ def _generate_card( f"上次签到日期:{'从未' if user.checkin_time_last == datetime.min else user.checkin_time_last.date()}", ) today_data.text((0, 25), f"总金币:{gold}") - default_setu_prob = Config.get_config("send_setu", "INITIAL_SETU_PROBABILITY") * 100 + default_setu_prob = ( + Config.get_config("send_setu", "INITIAL_SETU_PROBABILITY") * 100 + ) today_data.text( (0, 50), f"色图概率:{(default_setu_prob + user.impression if user.impression < 100 else 100):.2f}%", @@ -286,12 +287,8 @@ def _generate_card( bk.paste(today_sign_text_img, (550, 180), True) bk.paste(today_data, (580, 220), True) bk.paste(watermark, (15, 400), True) - bk.save( - SIGN_TODAY_CARD_PATH / f"{user_id}_{user.group_id}_{_type}_{data}.png" - ) - return image( - f"{user_id}_{user.group_id}_{_type}_{data}.png", "sign/today_card" - ) + bk.save(SIGN_TODAY_CARD_PATH / f"{user_id}_{user.group_id}_{_type}_{data}.png") + return image(f"{user_id}_{user.group_id}_{_type}_{data}.png", "sign/today_card") def generate_progress_bar_pic(): diff --git a/utils/image_utils.py b/utils/image_utils.py index 471f0535..7280f4a7 100755 --- a/utils/image_utils.py +++ b/utils/image_utils.py @@ -121,7 +121,7 @@ def fig2b64(plt_: plt) -> str: return "base64://" + base64_str -def is_valid(file: str) -> bool: +def is_valid(file: Union[str, Path]) -> bool: """ 说明: 判断图片是否损坏 From 35c9585b225c40214b984e4a982f1360afff71c4 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 22 May 2022 19:03:22 +0800 Subject: [PATCH 5/9] delete WindowsSelectorEventLoopPolicy --- plugins/bt/data_source.py | 8 +- plugins/check_zhenxun_update/__init__.py | 248 +++++------ plugins/check_zhenxun_update/data_source.py | 432 ++++++++++---------- plugins/pix_gallery/_data_source.py | 6 +- plugins/pixiv_rank_search/data_source.py | 8 +- plugins/update_gocqhttp/data_source.py | 4 +- 6 files changed, 353 insertions(+), 353 deletions(-) diff --git a/plugins/bt/data_source.py b/plugins/bt/data_source.py index a7754625..283d3399 100755 --- a/plugins/bt/data_source.py +++ b/plugins/bt/data_source.py @@ -3,10 +3,10 @@ from configs.config import Config from bs4 import BeautifulSoup import platform -if platform.system() == "Windows": - import asyncio - - asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) +# if platform.system() == "Windows": +# import asyncio +# +# asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) url = "http://www.eclzz.mobi" diff --git a/plugins/check_zhenxun_update/__init__.py b/plugins/check_zhenxun_update/__init__.py index f24581a9..c5bc2150 100755 --- a/plugins/check_zhenxun_update/__init__.py +++ b/plugins/check_zhenxun_update/__init__.py @@ -1,124 +1,124 @@ -from nonebot.adapters.onebot.v11 import Bot -from nonebot.permission import SUPERUSER -from nonebot import on_command -from .data_source import check_update, get_latest_version_data -from services.log import logger -from utils.utils import scheduler, get_bot -from pathlib import Path -from configs.config import Config -from nonebot.rule import to_me -from nonebot.params import ArgStr -import platform -import os - - -__zx_plugin_name__ = "自动更新 [Superuser]" -__plugin_usage__ = """ -usage: - 检查更新真寻最新版本,包括了自动更新 - 指令: - 检查更新真寻 - 重启 -""".strip() -__plugin_des__ = "就算是真寻也会成长的" -__plugin_cmd__ = ["检查更新真寻", "重启"] -__plugin_version__ = 0.1 -__plugin_author__ = "HibiKier" -__plugin_configs__ = { - "AUTO_UPDATE_ZHENXUN": { - "value": False, - "help": "真寻是否自动检查更新", - "default": False, - } -} - -update_zhenxun = on_command("检查更新真寻", permission=SUPERUSER, priority=1, block=True) - -restart = on_command( - "重启", - aliases={"restart"}, - permission=SUPERUSER, - rule=to_me(), - priority=1, - block=True, -) - - -@update_zhenxun.handle() -async def _(bot: Bot): - try: - code, error = await check_update(bot) - if error: - logger.error(f"更新真寻未知错误 {error}") - await bot.send_private_msg( - user_id=int(list(bot.config.superusers)[0]), message=f"更新真寻未知错误 {error}" - ) - except Exception as e: - logger.error(f"更新真寻未知错误 {type(e)}:{e}") - await bot.send_private_msg( - user_id=int(list(bot.config.superusers)[0]), - message=f"更新真寻未知错误 {type(e)}:{e}", - ) - else: - if code == 200: - await bot.send_private_msg( - user_id=int(list(bot.config.superusers)[0]), message=f"更新完毕,请重启真寻...." - ) - - -@restart.handle() -async def _(): - if str(platform.system()).lower() == "windows": - await restart.finish("暂无windows重启脚本...") - - -@restart.got("flag", prompt="确定是否重启真寻?(重启失败咱们将失去联系,请谨慎!)") -async def _(flag: str = ArgStr("flag")): - if flag.lower() in ["true", "是", "好", "确定", "确定是"]: - await restart.send("开始重启真寻..请稍等...") - open("is_restart", "w") - os.system("./restart.sh") - else: - await restart.send("已取消操作...") - - -@scheduler.scheduled_job( - "cron", - hour=12, - minute=0, -) -async def _(): - if Config.get_config("check_zhenxun_update", "AUTO_UPDATE_ZHENXUN"): - _version = "v0.0.0" - _version_file = Path() / "__version__" - if _version_file.exists(): - _version = ( - open(_version_file, "r", encoding="utf8") - .readline() - .split(":")[-1] - .strip() - ) - data = await get_latest_version_data() - if data: - latest_version = data["name"] - if _version != latest_version: - bot = get_bot() - await bot.send_private_msg( - user_id=int(list(bot.config.superusers)[0]), - message=f"检测到真寻版本更新\n" - f"当前版本:{_version},最新版本:{latest_version}", - ) - # try: - # code = await check_update(bot) - # except Exception as e: - # logger.error(f"更新真寻未知错误 {type(e)}:{e}") - # await bot.send_private_msg( - # user_id=int(list(bot.config.superusers)[0]), - # message=f"更新真寻未知错误 {type(e)}:{e}\n", - # ) - # else: - # if code == 200: - # await bot.send_private_msg( - # user_id=int(list(bot.config.superusers)[0]), - # message=f"更新完毕,请重启真寻....", - # ) +# from nonebot.adapters.onebot.v11 import Bot +# from nonebot.permission import SUPERUSER +# from nonebot import on_command +# from .data_source import check_update, get_latest_version_data +# from services.log import logger +# from utils.utils import scheduler, get_bot +# from pathlib import Path +# from configs.config import Config +# from nonebot.rule import to_me +# from nonebot.params import ArgStr +# import platform +# import os +# +# +# __zx_plugin_name__ = "自动更新 [Superuser]" +# __plugin_usage__ = """ +# usage: +# 检查更新真寻最新版本,包括了自动更新 +# 指令: +# 检查更新真寻 +# 重启 +# """.strip() +# __plugin_des__ = "就算是真寻也会成长的" +# __plugin_cmd__ = ["检查更新真寻", "重启"] +# __plugin_version__ = 0.1 +# __plugin_author__ = "HibiKier" +# __plugin_configs__ = { +# "AUTO_UPDATE_ZHENXUN": { +# "value": False, +# "help": "真寻是否自动检查更新", +# "default": False, +# } +# } +# +# update_zhenxun = on_command("检查更新真寻", permission=SUPERUSER, priority=1, block=True) +# +# restart = on_command( +# "重启", +# aliases={"restart"}, +# permission=SUPERUSER, +# rule=to_me(), +# priority=1, +# block=True, +# ) +# +# +# @update_zhenxun.handle() +# async def _(bot: Bot): +# try: +# code, error = await check_update(bot) +# if error: +# logger.error(f"更新真寻未知错误 {error}") +# await bot.send_private_msg( +# user_id=int(list(bot.config.superusers)[0]), message=f"更新真寻未知错误 {error}" +# ) +# except Exception as e: +# logger.error(f"更新真寻未知错误 {type(e)}:{e}") +# await bot.send_private_msg( +# user_id=int(list(bot.config.superusers)[0]), +# message=f"更新真寻未知错误 {type(e)}:{e}", +# ) +# else: +# if code == 200: +# await bot.send_private_msg( +# user_id=int(list(bot.config.superusers)[0]), message=f"更新完毕,请重启真寻...." +# ) +# +# +# @restart.handle() +# async def _(): +# if str(platform.system()).lower() == "windows": +# await restart.finish("暂无windows重启脚本...") +# +# +# @restart.got("flag", prompt="确定是否重启真寻?(重启失败咱们将失去联系,请谨慎!)") +# async def _(flag: str = ArgStr("flag")): +# if flag.lower() in ["true", "是", "好", "确定", "确定是"]: +# await restart.send("开始重启真寻..请稍等...") +# open("is_restart", "w") +# os.system("./restart.sh") +# else: +# await restart.send("已取消操作...") +# +# +# @scheduler.scheduled_job( +# "cron", +# hour=12, +# minute=0, +# ) +# async def _(): +# if Config.get_config("check_zhenxun_update", "AUTO_UPDATE_ZHENXUN"): +# _version = "v0.0.0" +# _version_file = Path() / "__version__" +# if _version_file.exists(): +# _version = ( +# open(_version_file, "r", encoding="utf8") +# .readline() +# .split(":")[-1] +# .strip() +# ) +# data = await get_latest_version_data() +# if data: +# latest_version = data["name"] +# if _version != latest_version: +# bot = get_bot() +# await bot.send_private_msg( +# user_id=int(list(bot.config.superusers)[0]), +# message=f"检测到真寻版本更新\n" +# f"当前版本:{_version},最新版本:{latest_version}", +# ) +# # try: +# # code = await check_update(bot) +# # except Exception as e: +# # logger.error(f"更新真寻未知错误 {type(e)}:{e}") +# # await bot.send_private_msg( +# # user_id=int(list(bot.config.superusers)[0]), +# # message=f"更新真寻未知错误 {type(e)}:{e}\n", +# # ) +# # else: +# # if code == 200: +# # await bot.send_private_msg( +# # user_id=int(list(bot.config.superusers)[0]), +# # message=f"更新完毕,请重启真寻....", +# # ) diff --git a/plugins/check_zhenxun_update/data_source.py b/plugins/check_zhenxun_update/data_source.py index ce02ac84..3d74293a 100755 --- a/plugins/check_zhenxun_update/data_source.py +++ b/plugins/check_zhenxun_update/data_source.py @@ -1,216 +1,216 @@ -from nonebot.adapters.onebot.v11 import Bot, Message -from utils.image_utils import BuildImage -from configs.path_config import IMAGE_PATH -from utils.message_builder import image -from utils.http_utils import AsyncHttpx -from typing import List -from services.log import logger -from pathlib import Path -import ujson as json -import nonebot -import asyncio -import platform -import tarfile -import shutil -import os - -if str(platform.system()).lower() == "windows": - policy = asyncio.WindowsSelectorEventLoopPolicy() - asyncio.set_event_loop_policy(policy) - - -driver = nonebot.get_driver() - -release_url = "https://api.github.com/repos/HibiKier/zhenxun_bot/releases/latest" - -_version_file = Path() / "__version__" -zhenxun_latest_tar_gz = Path() / "zhenxun_latest_file.tar.gz" -temp_dir = Path() / "temp" -backup_dir = Path() / "backup" - - -@driver.on_bot_connect -async def remind(bot: Bot): - if str(platform.system()).lower() != "windows": - restart = Path() / "restart.sh" - if not restart.exists(): - with open(restart, "w", encoding="utf8") as f: - f.write( - f"pid=$(netstat -tunlp | grep " - + str(bot.config.port) - + " | awk '{print $7}')\n" - "pid=${pid%/*}\n" - "kill -9 $pid\n" - "sleep 3\n" - "python3 bot.py" - ) - os.system("chmod +x ./restart.sh") - logger.info("已自动生成 restart.sh(重启) 文件,请检查脚本是否与本地指令符合...") - is_restart_file = Path() / "is_restart" - if is_restart_file.exists(): - await bot.send_private_msg( - user_id=int(list(bot.config.superusers)[0]), - message=f"真寻重启完毕...", - ) - is_restart_file.unlink() - - -async def check_update(bot: Bot) -> 'int, str': - logger.info("开始检查更新真寻酱....") - _version = "v0.0.0" - if _version_file.exists(): - _version = ( - open(_version_file, "r", encoding="utf8").readline().split(":")[-1].strip() - ) - data = await get_latest_version_data() - if data: - latest_version = data["name"] - if _version != latest_version: - tar_gz_url = data["tarball_url"] - logger.info(f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}") - await bot.send_private_msg( - user_id=int(list(bot.config.superusers)[0]), - message=f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}\n" f"开始更新.....", - ) - logger.info(f"开始下载真寻最新版文件....") - tar_gz_url = (await AsyncHttpx.get(tar_gz_url)).headers.get('Location') - if await AsyncHttpx.download_file(tar_gz_url, zhenxun_latest_tar_gz): - logger.info("下载真寻最新版文件完成....") - error = await asyncio.get_event_loop().run_in_executor( - None, _file_handle, latest_version - ) - if error: - return 998, error - logger.info("真寻更新完毕,清理文件完成....") - logger.info("开始获取真寻更新日志.....") - update_info = data["body"] - width = 0 - height = len(update_info.split('\n')) * 24 - A = BuildImage(width, height, font_size=20) - for m in update_info.split('\n'): - w, h = A.getsize(m) - if w > width: - width = w - A = BuildImage(width + 50, height, font_size=20) - A.text((10, 10), update_info) - A.save(f'{IMAGE_PATH}/update_info.png') - await bot.send_private_msg( - user_id=int(list(bot.config.superusers)[0]), - message=Message(f"真寻更新完成,版本:{_version} -> {latest_version}\n" - f"更新日期:{data['created_at']}\n" - f"更新日志:\n" - f"{image('update_info.png')}"), - ) - return 200, '' - else: - logger.warning(f"下载真寻最新版本失败...版本号:{latest_version}") - await bot.send_private_msg( - user_id=int(list(bot.config.superusers)[0]), - message=f"下载真寻最新版本失败...版本号:{latest_version}.", - ) - else: - logger.info(f"自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...") - await bot.send_private_msg( - user_id=int(list(bot.config.superusers)[0]), - message=f"自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...", - ) - else: - logger.warning("自动获取真寻版本失败....") - await bot.send_private_msg( - user_id=int(list(bot.config.superusers)[0]), message=f"自动获取真寻版本失败...." - ) - return 999, '' - - -def _file_handle(latest_version: str) -> str: - if not temp_dir.exists(): - temp_dir.mkdir(exist_ok=True, parents=True) - if backup_dir.exists(): - shutil.rmtree(backup_dir) - tf = None - error = '' - # try: - backup_dir.mkdir(exist_ok=True, parents=True) - logger.info("开始解压真寻文件压缩包....") - tf = tarfile.open(zhenxun_latest_tar_gz) - tf.extractall(temp_dir) - logger.info("解压真寻文件压缩包完成....") - zhenxun_latest_file = Path(temp_dir) / os.listdir(temp_dir)[0] - update_info_file = Path(zhenxun_latest_file) / "update_info.json" - update_info = json.load(open(update_info_file, "r", encoding="utf8")) - update_file = update_info["update_file"] - add_file = update_info["add_file"] - delete_file = update_info["delete_file"] - config_file = Path() / "configs" / "config.py" - config_path_file = Path() / "configs" / "path_config.py" - for file in [config_file.name]: - tmp = "" - new_file = Path(zhenxun_latest_file) / "configs" / file - old_file = Path() / "configs" / file - new_lines = open(new_file, "r", encoding="utf8").readlines() - old_lines = open(old_file, "r", encoding="utf8").readlines() - for nl in new_lines: - tmp += check_old_lines(old_lines, nl) - with open(old_file, "w", encoding="utf8") as f: - f.write(tmp) - for file in delete_file + update_file: - if file != "configs": - file = Path() / file - backup_file = Path(backup_dir) / file - if file.exists(): - backup_file.parent.mkdir(parents=True, exist_ok=True) - if backup_file.exists(): - backup_file.unlink() - if file not in [config_file, config_path_file]: - os.rename(file.absolute(), backup_file.absolute()) - else: - with open(file, "r", encoding="utf8") as rf: - data = rf.read() - with open(backup_file, "w", encoding="utf8") as wf: - wf.write(data) - logger.info(f"已备份文件:{file}") - for file in add_file + update_file: - new_file = Path(zhenxun_latest_file) / file - old_file = Path() / file - if old_file not in [config_file, config_path_file] and file != "configs": - if not old_file.exists() and new_file.exists(): - os.rename(new_file.absolute(), old_file.absolute()) - logger.info(f"已更新文件:{file}") - # except Exception as e: - # error = f'{type(e)}:{e}' - if tf: - tf.close() - if temp_dir.exists(): - shutil.rmtree(temp_dir) - if zhenxun_latest_tar_gz.exists(): - zhenxun_latest_tar_gz.unlink() - local_update_info_file = Path() / "update_info.json" - if local_update_info_file.exists(): - local_update_info_file.unlink() - with open(_version_file, "w", encoding="utf8") as f: - f.write(f"__version__: {latest_version}") - return error - - -# 获取最新版本号 -async def get_latest_version_data() -> dict: - for _ in range(3): - try: - res = await AsyncHttpx.get(release_url) - if res.status_code == 200: - return res.json() - except TimeoutError: - pass - except Exception as e: - logger.error(f"检查更新真寻获取版本失败 {type(e)}:{e}") - return {} - - -# 逐行检测 -def check_old_lines(lines: List[str], line: str) -> str: - if "=" not in line: - return line - for l in lines: - if "=" in l and l.split("=")[0].strip() == line.split("=")[0].strip(): - return l - return line +# from nonebot.adapters.onebot.v11 import Bot, Message +# from utils.image_utils import BuildImage +# from configs.path_config import IMAGE_PATH +# from utils.message_builder import image +# from utils.http_utils import AsyncHttpx +# from typing import List +# from services.log import logger +# from pathlib import Path +# import ujson as json +# import nonebot +# import asyncio +# import platform +# import tarfile +# import shutil +# import os +# +# # if str(platform.system()).lower() == "windows": +# # policy = asyncio.WindowsSelectorEventLoopPolicy() +# # asyncio.set_event_loop_policy(policy) +# +# +# driver = nonebot.get_driver() +# +# release_url = "https://api.github.com/repos/HibiKier/zhenxun_bot/releases/latest" +# +# _version_file = Path() / "__version__" +# zhenxun_latest_tar_gz = Path() / "zhenxun_latest_file.tar.gz" +# temp_dir = Path() / "temp" +# backup_dir = Path() / "backup" +# +# +# @driver.on_bot_connect +# async def remind(bot: Bot): +# if str(platform.system()).lower() != "windows": +# restart = Path() / "restart.sh" +# if not restart.exists(): +# with open(restart, "w", encoding="utf8") as f: +# f.write( +# f"pid=$(netstat -tunlp | grep " +# + str(bot.config.port) +# + " | awk '{print $7}')\n" +# "pid=${pid%/*}\n" +# "kill -9 $pid\n" +# "sleep 3\n" +# "python3 bot.py" +# ) +# os.system("chmod +x ./restart.sh") +# logger.info("已自动生成 restart.sh(重启) 文件,请检查脚本是否与本地指令符合...") +# is_restart_file = Path() / "is_restart" +# if is_restart_file.exists(): +# await bot.send_private_msg( +# user_id=int(list(bot.config.superusers)[0]), +# message=f"真寻重启完毕...", +# ) +# is_restart_file.unlink() +# +# +# async def check_update(bot: Bot) -> 'int, str': +# logger.info("开始检查更新真寻酱....") +# _version = "v0.0.0" +# if _version_file.exists(): +# _version = ( +# open(_version_file, "r", encoding="utf8").readline().split(":")[-1].strip() +# ) +# data = await get_latest_version_data() +# if data: +# latest_version = data["name"] +# if _version != latest_version: +# tar_gz_url = data["tarball_url"] +# logger.info(f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}") +# await bot.send_private_msg( +# user_id=int(list(bot.config.superusers)[0]), +# message=f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}\n" f"开始更新.....", +# ) +# logger.info(f"开始下载真寻最新版文件....") +# tar_gz_url = (await AsyncHttpx.get(tar_gz_url)).headers.get('Location') +# if await AsyncHttpx.download_file(tar_gz_url, zhenxun_latest_tar_gz): +# logger.info("下载真寻最新版文件完成....") +# error = await asyncio.get_event_loop().run_in_executor( +# None, _file_handle, latest_version +# ) +# if error: +# return 998, error +# logger.info("真寻更新完毕,清理文件完成....") +# logger.info("开始获取真寻更新日志.....") +# update_info = data["body"] +# width = 0 +# height = len(update_info.split('\n')) * 24 +# A = BuildImage(width, height, font_size=20) +# for m in update_info.split('\n'): +# w, h = A.getsize(m) +# if w > width: +# width = w +# A = BuildImage(width + 50, height, font_size=20) +# A.text((10, 10), update_info) +# A.save(f'{IMAGE_PATH}/update_info.png') +# await bot.send_private_msg( +# user_id=int(list(bot.config.superusers)[0]), +# message=Message(f"真寻更新完成,版本:{_version} -> {latest_version}\n" +# f"更新日期:{data['created_at']}\n" +# f"更新日志:\n" +# f"{image('update_info.png')}"), +# ) +# return 200, '' +# else: +# logger.warning(f"下载真寻最新版本失败...版本号:{latest_version}") +# await bot.send_private_msg( +# user_id=int(list(bot.config.superusers)[0]), +# message=f"下载真寻最新版本失败...版本号:{latest_version}.", +# ) +# else: +# logger.info(f"自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...") +# await bot.send_private_msg( +# user_id=int(list(bot.config.superusers)[0]), +# message=f"自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...", +# ) +# else: +# logger.warning("自动获取真寻版本失败....") +# await bot.send_private_msg( +# user_id=int(list(bot.config.superusers)[0]), message=f"自动获取真寻版本失败...." +# ) +# return 999, '' +# +# +# def _file_handle(latest_version: str) -> str: +# if not temp_dir.exists(): +# temp_dir.mkdir(exist_ok=True, parents=True) +# if backup_dir.exists(): +# shutil.rmtree(backup_dir) +# tf = None +# error = '' +# # try: +# backup_dir.mkdir(exist_ok=True, parents=True) +# logger.info("开始解压真寻文件压缩包....") +# tf = tarfile.open(zhenxun_latest_tar_gz) +# tf.extractall(temp_dir) +# logger.info("解压真寻文件压缩包完成....") +# zhenxun_latest_file = Path(temp_dir) / os.listdir(temp_dir)[0] +# update_info_file = Path(zhenxun_latest_file) / "update_info.json" +# update_info = json.load(open(update_info_file, "r", encoding="utf8")) +# update_file = update_info["update_file"] +# add_file = update_info["add_file"] +# delete_file = update_info["delete_file"] +# config_file = Path() / "configs" / "config.py" +# config_path_file = Path() / "configs" / "path_config.py" +# for file in [config_file.name]: +# tmp = "" +# new_file = Path(zhenxun_latest_file) / "configs" / file +# old_file = Path() / "configs" / file +# new_lines = open(new_file, "r", encoding="utf8").readlines() +# old_lines = open(old_file, "r", encoding="utf8").readlines() +# for nl in new_lines: +# tmp += check_old_lines(old_lines, nl) +# with open(old_file, "w", encoding="utf8") as f: +# f.write(tmp) +# for file in delete_file + update_file: +# if file != "configs": +# file = Path() / file +# backup_file = Path(backup_dir) / file +# if file.exists(): +# backup_file.parent.mkdir(parents=True, exist_ok=True) +# if backup_file.exists(): +# backup_file.unlink() +# if file not in [config_file, config_path_file]: +# os.rename(file.absolute(), backup_file.absolute()) +# else: +# with open(file, "r", encoding="utf8") as rf: +# data = rf.read() +# with open(backup_file, "w", encoding="utf8") as wf: +# wf.write(data) +# logger.info(f"已备份文件:{file}") +# for file in add_file + update_file: +# new_file = Path(zhenxun_latest_file) / file +# old_file = Path() / file +# if old_file not in [config_file, config_path_file] and file != "configs": +# if not old_file.exists() and new_file.exists(): +# os.rename(new_file.absolute(), old_file.absolute()) +# logger.info(f"已更新文件:{file}") +# # except Exception as e: +# # error = f'{type(e)}:{e}' +# if tf: +# tf.close() +# if temp_dir.exists(): +# shutil.rmtree(temp_dir) +# if zhenxun_latest_tar_gz.exists(): +# zhenxun_latest_tar_gz.unlink() +# local_update_info_file = Path() / "update_info.json" +# if local_update_info_file.exists(): +# local_update_info_file.unlink() +# with open(_version_file, "w", encoding="utf8") as f: +# f.write(f"__version__: {latest_version}") +# return error +# +# +# # 获取最新版本号 +# async def get_latest_version_data() -> dict: +# for _ in range(3): +# try: +# res = await AsyncHttpx.get(release_url) +# if res.status_code == 200: +# return res.json() +# except TimeoutError: +# pass +# except Exception as e: +# logger.error(f"检查更新真寻获取版本失败 {type(e)}:{e}") +# return {} +# +# +# # 逐行检测 +# def check_old_lines(lines: List[str], line: str) -> str: +# if "=" not in line: +# return line +# for l in lines: +# if "=" in l and l.split("=")[0].strip() == line.split("=")[0].strip(): +# return l +# return line diff --git a/plugins/pix_gallery/_data_source.py b/plugins/pix_gallery/_data_source.py index 5fb2faf1..f991c66e 100644 --- a/plugins/pix_gallery/_data_source.py +++ b/plugins/pix_gallery/_data_source.py @@ -20,9 +20,9 @@ try: except ModuleNotFoundError: import json -if str(platform.system()).lower() == "windows": - policy = asyncio.WindowsSelectorEventLoopPolicy() - asyncio.set_event_loop_policy(policy) +# if str(platform.system()).lower() == "windows": +# policy = asyncio.WindowsSelectorEventLoopPolicy() +# asyncio.set_event_loop_policy(policy) headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6;" diff --git a/plugins/pixiv_rank_search/data_source.py b/plugins/pixiv_rank_search/data_source.py index 82d3b068..83792a49 100755 --- a/plugins/pixiv_rank_search/data_source.py +++ b/plugins/pixiv_rank_search/data_source.py @@ -8,10 +8,10 @@ from services.log import logger from pathlib import Path import platform -if platform.system() == "Windows": - import asyncio - - asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) +# if platform.system() == "Windows": +# import asyncio +# +# asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) headers = { diff --git a/plugins/update_gocqhttp/data_source.py b/plugins/update_gocqhttp/data_source.py index 9383648d..1572e90e 100755 --- a/plugins/update_gocqhttp/data_source.py +++ b/plugins/update_gocqhttp/data_source.py @@ -5,8 +5,8 @@ import asyncio import platform import os -if platform.system() == "Windows": - asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) +# if platform.system() == "Windows": +# asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) url = "https://github.com/Mrs4s/go-cqhttp/releases" From b241a58e84079bb11c488246b64dce42d9351dbc Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 22 May 2022 19:04:58 +0800 Subject: [PATCH 6/9] update check_update --- plugins/check_zhenxun_update/__init__.py | 248 +++++------ plugins/check_zhenxun_update/data_source.py | 432 ++++++++++---------- 2 files changed, 340 insertions(+), 340 deletions(-) diff --git a/plugins/check_zhenxun_update/__init__.py b/plugins/check_zhenxun_update/__init__.py index c5bc2150..f24581a9 100755 --- a/plugins/check_zhenxun_update/__init__.py +++ b/plugins/check_zhenxun_update/__init__.py @@ -1,124 +1,124 @@ -# from nonebot.adapters.onebot.v11 import Bot -# from nonebot.permission import SUPERUSER -# from nonebot import on_command -# from .data_source import check_update, get_latest_version_data -# from services.log import logger -# from utils.utils import scheduler, get_bot -# from pathlib import Path -# from configs.config import Config -# from nonebot.rule import to_me -# from nonebot.params import ArgStr -# import platform -# import os -# -# -# __zx_plugin_name__ = "自动更新 [Superuser]" -# __plugin_usage__ = """ -# usage: -# 检查更新真寻最新版本,包括了自动更新 -# 指令: -# 检查更新真寻 -# 重启 -# """.strip() -# __plugin_des__ = "就算是真寻也会成长的" -# __plugin_cmd__ = ["检查更新真寻", "重启"] -# __plugin_version__ = 0.1 -# __plugin_author__ = "HibiKier" -# __plugin_configs__ = { -# "AUTO_UPDATE_ZHENXUN": { -# "value": False, -# "help": "真寻是否自动检查更新", -# "default": False, -# } -# } -# -# update_zhenxun = on_command("检查更新真寻", permission=SUPERUSER, priority=1, block=True) -# -# restart = on_command( -# "重启", -# aliases={"restart"}, -# permission=SUPERUSER, -# rule=to_me(), -# priority=1, -# block=True, -# ) -# -# -# @update_zhenxun.handle() -# async def _(bot: Bot): -# try: -# code, error = await check_update(bot) -# if error: -# logger.error(f"更新真寻未知错误 {error}") -# await bot.send_private_msg( -# user_id=int(list(bot.config.superusers)[0]), message=f"更新真寻未知错误 {error}" -# ) -# except Exception as e: -# logger.error(f"更新真寻未知错误 {type(e)}:{e}") -# await bot.send_private_msg( -# user_id=int(list(bot.config.superusers)[0]), -# message=f"更新真寻未知错误 {type(e)}:{e}", -# ) -# else: -# if code == 200: -# await bot.send_private_msg( -# user_id=int(list(bot.config.superusers)[0]), message=f"更新完毕,请重启真寻...." -# ) -# -# -# @restart.handle() -# async def _(): -# if str(platform.system()).lower() == "windows": -# await restart.finish("暂无windows重启脚本...") -# -# -# @restart.got("flag", prompt="确定是否重启真寻?(重启失败咱们将失去联系,请谨慎!)") -# async def _(flag: str = ArgStr("flag")): -# if flag.lower() in ["true", "是", "好", "确定", "确定是"]: -# await restart.send("开始重启真寻..请稍等...") -# open("is_restart", "w") -# os.system("./restart.sh") -# else: -# await restart.send("已取消操作...") -# -# -# @scheduler.scheduled_job( -# "cron", -# hour=12, -# minute=0, -# ) -# async def _(): -# if Config.get_config("check_zhenxun_update", "AUTO_UPDATE_ZHENXUN"): -# _version = "v0.0.0" -# _version_file = Path() / "__version__" -# if _version_file.exists(): -# _version = ( -# open(_version_file, "r", encoding="utf8") -# .readline() -# .split(":")[-1] -# .strip() -# ) -# data = await get_latest_version_data() -# if data: -# latest_version = data["name"] -# if _version != latest_version: -# bot = get_bot() -# await bot.send_private_msg( -# user_id=int(list(bot.config.superusers)[0]), -# message=f"检测到真寻版本更新\n" -# f"当前版本:{_version},最新版本:{latest_version}", -# ) -# # try: -# # code = await check_update(bot) -# # except Exception as e: -# # logger.error(f"更新真寻未知错误 {type(e)}:{e}") -# # await bot.send_private_msg( -# # user_id=int(list(bot.config.superusers)[0]), -# # message=f"更新真寻未知错误 {type(e)}:{e}\n", -# # ) -# # else: -# # if code == 200: -# # await bot.send_private_msg( -# # user_id=int(list(bot.config.superusers)[0]), -# # message=f"更新完毕,请重启真寻....", -# # ) +from nonebot.adapters.onebot.v11 import Bot +from nonebot.permission import SUPERUSER +from nonebot import on_command +from .data_source import check_update, get_latest_version_data +from services.log import logger +from utils.utils import scheduler, get_bot +from pathlib import Path +from configs.config import Config +from nonebot.rule import to_me +from nonebot.params import ArgStr +import platform +import os + + +__zx_plugin_name__ = "自动更新 [Superuser]" +__plugin_usage__ = """ +usage: + 检查更新真寻最新版本,包括了自动更新 + 指令: + 检查更新真寻 + 重启 +""".strip() +__plugin_des__ = "就算是真寻也会成长的" +__plugin_cmd__ = ["检查更新真寻", "重启"] +__plugin_version__ = 0.1 +__plugin_author__ = "HibiKier" +__plugin_configs__ = { + "AUTO_UPDATE_ZHENXUN": { + "value": False, + "help": "真寻是否自动检查更新", + "default": False, + } +} + +update_zhenxun = on_command("检查更新真寻", permission=SUPERUSER, priority=1, block=True) + +restart = on_command( + "重启", + aliases={"restart"}, + permission=SUPERUSER, + rule=to_me(), + priority=1, + block=True, +) + + +@update_zhenxun.handle() +async def _(bot: Bot): + try: + code, error = await check_update(bot) + if error: + logger.error(f"更新真寻未知错误 {error}") + await bot.send_private_msg( + user_id=int(list(bot.config.superusers)[0]), message=f"更新真寻未知错误 {error}" + ) + except Exception as e: + logger.error(f"更新真寻未知错误 {type(e)}:{e}") + await bot.send_private_msg( + user_id=int(list(bot.config.superusers)[0]), + message=f"更新真寻未知错误 {type(e)}:{e}", + ) + else: + if code == 200: + await bot.send_private_msg( + user_id=int(list(bot.config.superusers)[0]), message=f"更新完毕,请重启真寻...." + ) + + +@restart.handle() +async def _(): + if str(platform.system()).lower() == "windows": + await restart.finish("暂无windows重启脚本...") + + +@restart.got("flag", prompt="确定是否重启真寻?(重启失败咱们将失去联系,请谨慎!)") +async def _(flag: str = ArgStr("flag")): + if flag.lower() in ["true", "是", "好", "确定", "确定是"]: + await restart.send("开始重启真寻..请稍等...") + open("is_restart", "w") + os.system("./restart.sh") + else: + await restart.send("已取消操作...") + + +@scheduler.scheduled_job( + "cron", + hour=12, + minute=0, +) +async def _(): + if Config.get_config("check_zhenxun_update", "AUTO_UPDATE_ZHENXUN"): + _version = "v0.0.0" + _version_file = Path() / "__version__" + if _version_file.exists(): + _version = ( + open(_version_file, "r", encoding="utf8") + .readline() + .split(":")[-1] + .strip() + ) + data = await get_latest_version_data() + if data: + latest_version = data["name"] + if _version != latest_version: + bot = get_bot() + await bot.send_private_msg( + user_id=int(list(bot.config.superusers)[0]), + message=f"检测到真寻版本更新\n" + f"当前版本:{_version},最新版本:{latest_version}", + ) + # try: + # code = await check_update(bot) + # except Exception as e: + # logger.error(f"更新真寻未知错误 {type(e)}:{e}") + # await bot.send_private_msg( + # user_id=int(list(bot.config.superusers)[0]), + # message=f"更新真寻未知错误 {type(e)}:{e}\n", + # ) + # else: + # if code == 200: + # await bot.send_private_msg( + # user_id=int(list(bot.config.superusers)[0]), + # message=f"更新完毕,请重启真寻....", + # ) diff --git a/plugins/check_zhenxun_update/data_source.py b/plugins/check_zhenxun_update/data_source.py index 3d74293a..21c2fa44 100755 --- a/plugins/check_zhenxun_update/data_source.py +++ b/plugins/check_zhenxun_update/data_source.py @@ -1,216 +1,216 @@ -# from nonebot.adapters.onebot.v11 import Bot, Message -# from utils.image_utils import BuildImage -# from configs.path_config import IMAGE_PATH -# from utils.message_builder import image -# from utils.http_utils import AsyncHttpx -# from typing import List -# from services.log import logger -# from pathlib import Path -# import ujson as json -# import nonebot -# import asyncio -# import platform -# import tarfile -# import shutil -# import os -# -# # if str(platform.system()).lower() == "windows": -# # policy = asyncio.WindowsSelectorEventLoopPolicy() -# # asyncio.set_event_loop_policy(policy) -# -# -# driver = nonebot.get_driver() -# -# release_url = "https://api.github.com/repos/HibiKier/zhenxun_bot/releases/latest" -# -# _version_file = Path() / "__version__" -# zhenxun_latest_tar_gz = Path() / "zhenxun_latest_file.tar.gz" -# temp_dir = Path() / "temp" -# backup_dir = Path() / "backup" -# -# -# @driver.on_bot_connect -# async def remind(bot: Bot): -# if str(platform.system()).lower() != "windows": -# restart = Path() / "restart.sh" -# if not restart.exists(): -# with open(restart, "w", encoding="utf8") as f: -# f.write( -# f"pid=$(netstat -tunlp | grep " -# + str(bot.config.port) -# + " | awk '{print $7}')\n" -# "pid=${pid%/*}\n" -# "kill -9 $pid\n" -# "sleep 3\n" -# "python3 bot.py" -# ) -# os.system("chmod +x ./restart.sh") -# logger.info("已自动生成 restart.sh(重启) 文件,请检查脚本是否与本地指令符合...") -# is_restart_file = Path() / "is_restart" -# if is_restart_file.exists(): -# await bot.send_private_msg( -# user_id=int(list(bot.config.superusers)[0]), -# message=f"真寻重启完毕...", -# ) -# is_restart_file.unlink() -# -# -# async def check_update(bot: Bot) -> 'int, str': -# logger.info("开始检查更新真寻酱....") -# _version = "v0.0.0" -# if _version_file.exists(): -# _version = ( -# open(_version_file, "r", encoding="utf8").readline().split(":")[-1].strip() -# ) -# data = await get_latest_version_data() -# if data: -# latest_version = data["name"] -# if _version != latest_version: -# tar_gz_url = data["tarball_url"] -# logger.info(f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}") -# await bot.send_private_msg( -# user_id=int(list(bot.config.superusers)[0]), -# message=f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}\n" f"开始更新.....", -# ) -# logger.info(f"开始下载真寻最新版文件....") -# tar_gz_url = (await AsyncHttpx.get(tar_gz_url)).headers.get('Location') -# if await AsyncHttpx.download_file(tar_gz_url, zhenxun_latest_tar_gz): -# logger.info("下载真寻最新版文件完成....") -# error = await asyncio.get_event_loop().run_in_executor( -# None, _file_handle, latest_version -# ) -# if error: -# return 998, error -# logger.info("真寻更新完毕,清理文件完成....") -# logger.info("开始获取真寻更新日志.....") -# update_info = data["body"] -# width = 0 -# height = len(update_info.split('\n')) * 24 -# A = BuildImage(width, height, font_size=20) -# for m in update_info.split('\n'): -# w, h = A.getsize(m) -# if w > width: -# width = w -# A = BuildImage(width + 50, height, font_size=20) -# A.text((10, 10), update_info) -# A.save(f'{IMAGE_PATH}/update_info.png') -# await bot.send_private_msg( -# user_id=int(list(bot.config.superusers)[0]), -# message=Message(f"真寻更新完成,版本:{_version} -> {latest_version}\n" -# f"更新日期:{data['created_at']}\n" -# f"更新日志:\n" -# f"{image('update_info.png')}"), -# ) -# return 200, '' -# else: -# logger.warning(f"下载真寻最新版本失败...版本号:{latest_version}") -# await bot.send_private_msg( -# user_id=int(list(bot.config.superusers)[0]), -# message=f"下载真寻最新版本失败...版本号:{latest_version}.", -# ) -# else: -# logger.info(f"自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...") -# await bot.send_private_msg( -# user_id=int(list(bot.config.superusers)[0]), -# message=f"自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...", -# ) -# else: -# logger.warning("自动获取真寻版本失败....") -# await bot.send_private_msg( -# user_id=int(list(bot.config.superusers)[0]), message=f"自动获取真寻版本失败...." -# ) -# return 999, '' -# -# -# def _file_handle(latest_version: str) -> str: -# if not temp_dir.exists(): -# temp_dir.mkdir(exist_ok=True, parents=True) -# if backup_dir.exists(): -# shutil.rmtree(backup_dir) -# tf = None -# error = '' -# # try: -# backup_dir.mkdir(exist_ok=True, parents=True) -# logger.info("开始解压真寻文件压缩包....") -# tf = tarfile.open(zhenxun_latest_tar_gz) -# tf.extractall(temp_dir) -# logger.info("解压真寻文件压缩包完成....") -# zhenxun_latest_file = Path(temp_dir) / os.listdir(temp_dir)[0] -# update_info_file = Path(zhenxun_latest_file) / "update_info.json" -# update_info = json.load(open(update_info_file, "r", encoding="utf8")) -# update_file = update_info["update_file"] -# add_file = update_info["add_file"] -# delete_file = update_info["delete_file"] -# config_file = Path() / "configs" / "config.py" -# config_path_file = Path() / "configs" / "path_config.py" -# for file in [config_file.name]: -# tmp = "" -# new_file = Path(zhenxun_latest_file) / "configs" / file -# old_file = Path() / "configs" / file -# new_lines = open(new_file, "r", encoding="utf8").readlines() -# old_lines = open(old_file, "r", encoding="utf8").readlines() -# for nl in new_lines: -# tmp += check_old_lines(old_lines, nl) -# with open(old_file, "w", encoding="utf8") as f: -# f.write(tmp) -# for file in delete_file + update_file: -# if file != "configs": -# file = Path() / file -# backup_file = Path(backup_dir) / file -# if file.exists(): -# backup_file.parent.mkdir(parents=True, exist_ok=True) -# if backup_file.exists(): -# backup_file.unlink() -# if file not in [config_file, config_path_file]: -# os.rename(file.absolute(), backup_file.absolute()) -# else: -# with open(file, "r", encoding="utf8") as rf: -# data = rf.read() -# with open(backup_file, "w", encoding="utf8") as wf: -# wf.write(data) -# logger.info(f"已备份文件:{file}") -# for file in add_file + update_file: -# new_file = Path(zhenxun_latest_file) / file -# old_file = Path() / file -# if old_file not in [config_file, config_path_file] and file != "configs": -# if not old_file.exists() and new_file.exists(): -# os.rename(new_file.absolute(), old_file.absolute()) -# logger.info(f"已更新文件:{file}") -# # except Exception as e: -# # error = f'{type(e)}:{e}' -# if tf: -# tf.close() -# if temp_dir.exists(): -# shutil.rmtree(temp_dir) -# if zhenxun_latest_tar_gz.exists(): -# zhenxun_latest_tar_gz.unlink() -# local_update_info_file = Path() / "update_info.json" -# if local_update_info_file.exists(): -# local_update_info_file.unlink() -# with open(_version_file, "w", encoding="utf8") as f: -# f.write(f"__version__: {latest_version}") -# return error -# -# -# # 获取最新版本号 -# async def get_latest_version_data() -> dict: -# for _ in range(3): -# try: -# res = await AsyncHttpx.get(release_url) -# if res.status_code == 200: -# return res.json() -# except TimeoutError: -# pass -# except Exception as e: -# logger.error(f"检查更新真寻获取版本失败 {type(e)}:{e}") -# return {} -# -# -# # 逐行检测 -# def check_old_lines(lines: List[str], line: str) -> str: -# if "=" not in line: -# return line -# for l in lines: -# if "=" in l and l.split("=")[0].strip() == line.split("=")[0].strip(): -# return l -# return line +from nonebot.adapters.onebot.v11 import Bot, Message +from utils.image_utils import BuildImage +from configs.path_config import IMAGE_PATH +from utils.message_builder import image +from utils.http_utils import AsyncHttpx +from typing import List +from services.log import logger +from pathlib import Path +import ujson as json +import nonebot +import asyncio +import platform +import tarfile +import shutil +import os + +# if str(platform.system()).lower() == "windows": +# policy = asyncio.WindowsSelectorEventLoopPolicy() +# asyncio.set_event_loop_policy(policy) + + +driver = nonebot.get_driver() + +release_url = "https://api.github.com/repos/HibiKier/zhenxun_bot/releases/latest" + +_version_file = Path() / "__version__" +zhenxun_latest_tar_gz = Path() / "zhenxun_latest_file.tar.gz" +temp_dir = Path() / "temp" +backup_dir = Path() / "backup" + + +@driver.on_bot_connect +async def remind(bot: Bot): + if str(platform.system()).lower() != "windows": + restart = Path() / "restart.sh" + if not restart.exists(): + with open(restart, "w", encoding="utf8") as f: + f.write( + f"pid=$(netstat -tunlp | grep " + + str(bot.config.port) + + " | awk '{print $7}')\n" + "pid=${pid%/*}\n" + "kill -9 $pid\n" + "sleep 3\n" + "python3 bot.py" + ) + os.system("chmod +x ./restart.sh") + logger.info("已自动生成 restart.sh(重启) 文件,请检查脚本是否与本地指令符合...") + is_restart_file = Path() / "is_restart" + if is_restart_file.exists(): + await bot.send_private_msg( + user_id=int(list(bot.config.superusers)[0]), + message=f"真寻重启完毕...", + ) + is_restart_file.unlink() + + +async def check_update(bot: Bot) -> 'int, str': + logger.info("开始检查更新真寻酱....") + _version = "v0.0.0" + if _version_file.exists(): + _version = ( + open(_version_file, "r", encoding="utf8").readline().split(":")[-1].strip() + ) + data = await get_latest_version_data() + if data: + latest_version = data["name"] + if _version != latest_version: + tar_gz_url = data["tarball_url"] + logger.info(f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}") + await bot.send_private_msg( + user_id=int(list(bot.config.superusers)[0]), + message=f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}\n" f"开始更新.....", + ) + logger.info(f"开始下载真寻最新版文件....") + tar_gz_url = (await AsyncHttpx.get(tar_gz_url)).headers.get('Location') + if await AsyncHttpx.download_file(tar_gz_url, zhenxun_latest_tar_gz): + logger.info("下载真寻最新版文件完成....") + error = await asyncio.get_event_loop().run_in_executor( + None, _file_handle, latest_version + ) + if error: + return 998, error + logger.info("真寻更新完毕,清理文件完成....") + logger.info("开始获取真寻更新日志.....") + update_info = data["body"] + width = 0 + height = len(update_info.split('\n')) * 24 + A = BuildImage(width, height, font_size=20) + for m in update_info.split('\n'): + w, h = A.getsize(m) + if w > width: + width = w + A = BuildImage(width + 50, height, font_size=20) + A.text((10, 10), update_info) + A.save(f'{IMAGE_PATH}/update_info.png') + await bot.send_private_msg( + user_id=int(list(bot.config.superusers)[0]), + message=Message(f"真寻更新完成,版本:{_version} -> {latest_version}\n" + f"更新日期:{data['created_at']}\n" + f"更新日志:\n" + f"{image('update_info.png')}"), + ) + return 200, '' + else: + logger.warning(f"下载真寻最新版本失败...版本号:{latest_version}") + await bot.send_private_msg( + user_id=int(list(bot.config.superusers)[0]), + message=f"下载真寻最新版本失败...版本号:{latest_version}.", + ) + else: + logger.info(f"自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...") + await bot.send_private_msg( + user_id=int(list(bot.config.superusers)[0]), + message=f"自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...", + ) + else: + logger.warning("自动获取真寻版本失败....") + await bot.send_private_msg( + user_id=int(list(bot.config.superusers)[0]), message=f"自动获取真寻版本失败...." + ) + return 999, '' + + +def _file_handle(latest_version: str) -> str: + if not temp_dir.exists(): + temp_dir.mkdir(exist_ok=True, parents=True) + if backup_dir.exists(): + shutil.rmtree(backup_dir) + tf = None + error = '' + # try: + backup_dir.mkdir(exist_ok=True, parents=True) + logger.info("开始解压真寻文件压缩包....") + tf = tarfile.open(zhenxun_latest_tar_gz) + tf.extractall(temp_dir) + logger.info("解压真寻文件压缩包完成....") + zhenxun_latest_file = Path(temp_dir) / os.listdir(temp_dir)[0] + update_info_file = Path(zhenxun_latest_file) / "update_info.json" + update_info = json.load(open(update_info_file, "r", encoding="utf8")) + update_file = update_info["update_file"] + add_file = update_info["add_file"] + delete_file = update_info["delete_file"] + config_file = Path() / "configs" / "config.py" + config_path_file = Path() / "configs" / "path_config.py" + for file in [config_file.name]: + tmp = "" + new_file = Path(zhenxun_latest_file) / "configs" / file + old_file = Path() / "configs" / file + new_lines = open(new_file, "r", encoding="utf8").readlines() + old_lines = open(old_file, "r", encoding="utf8").readlines() + for nl in new_lines: + tmp += check_old_lines(old_lines, nl) + with open(old_file, "w", encoding="utf8") as f: + f.write(tmp) + for file in delete_file + update_file: + if file != "configs": + file = Path() / file + backup_file = Path(backup_dir) / file + if file.exists(): + backup_file.parent.mkdir(parents=True, exist_ok=True) + if backup_file.exists(): + backup_file.unlink() + if file not in [config_file, config_path_file]: + os.rename(file.absolute(), backup_file.absolute()) + else: + with open(file, "r", encoding="utf8") as rf: + data = rf.read() + with open(backup_file, "w", encoding="utf8") as wf: + wf.write(data) + logger.info(f"已备份文件:{file}") + for file in add_file + update_file: + new_file = Path(zhenxun_latest_file) / file + old_file = Path() / file + if old_file not in [config_file, config_path_file] and file != "configs": + if not old_file.exists() and new_file.exists(): + os.rename(new_file.absolute(), old_file.absolute()) + logger.info(f"已更新文件:{file}") + # except Exception as e: + # error = f'{type(e)}:{e}' + if tf: + tf.close() + if temp_dir.exists(): + shutil.rmtree(temp_dir) + if zhenxun_latest_tar_gz.exists(): + zhenxun_latest_tar_gz.unlink() + local_update_info_file = Path() / "update_info.json" + if local_update_info_file.exists(): + local_update_info_file.unlink() + with open(_version_file, "w", encoding="utf8") as f: + f.write(f"__version__: {latest_version}") + return error + + +# 获取最新版本号 +async def get_latest_version_data() -> dict: + for _ in range(3): + try: + res = await AsyncHttpx.get(release_url) + if res.status_code == 200: + return res.json() + except TimeoutError: + pass + except Exception as e: + logger.error(f"检查更新真寻获取版本失败 {type(e)}:{e}") + return {} + + +# 逐行检测 +def check_old_lines(lines: List[str], line: str) -> str: + if "=" not in line: + return line + for l in lines: + if "=" in l and l.split("=")[0].strip() == line.split("=")[0].strip(): + return l + return line From 38c0da0cf81eeb43ad5db8cd9fb19a81cdbcd685 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 22 May 2022 20:51:35 +0800 Subject: [PATCH 7/9] update v0.1.5.4 --- README.md | 3 ++- basic_plugins/super_cmd/update_friend_group_info.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9243132c..0a11fd65 100644 --- a/README.md +++ b/README.md @@ -238,13 +238,14 @@ __Docker 最新版本由 [Sakuracio](https://github.com/Sakuracio) 提供__ ## 更新 -### 2022/5/22 +### 2022/5/22 \[v0.1.5.4] * 使用action自动更新poetry.lock [@pull/515](https://github.com/HibiKier/zhenxun_bot/pull/515) * fix(bilibili_sub): card is None and timeout [@pull/516](https://github.com/HibiKier/zhenxun_bot/pull/516) * 修复了epic有时获取新免费游戏消息时获取不到图片 * 修复好感度满时签到出错(虽然是不可能满的 * 修复原神资源图标下载路径错误 +* 修复自动更新群组可能失败 ### 2022/5/21 diff --git a/basic_plugins/super_cmd/update_friend_group_info.py b/basic_plugins/super_cmd/update_friend_group_info.py index c0479624..8f528c78 100755 --- a/basic_plugins/super_cmd/update_friend_group_info.py +++ b/basic_plugins/super_cmd/update_friend_group_info.py @@ -45,6 +45,7 @@ async def _(): group_info["group_name"], group_info["max_member_count"], group_info["member_count"], + 1 ): num += 1 logger.info(f"自动更新群组 {g} 信息成功") From 619fef3bffb3bb3e9e1ad31c8e877556c95babbb Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 22 May 2022 20:52:59 +0800 Subject: [PATCH 8/9] update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0a11fd65..0272c760 100644 --- a/README.md +++ b/README.md @@ -288,7 +288,7 @@ __Docker 最新版本由 [Sakuracio](https://github.com/Sakuracio) 提供__ * fix: 更改p搜api,解决p搜无法使用的问题 [@pull/155](https://github.com/HibiKier/zhenxun_bot/pull/155) -### 2022/5/9 +### 2022/5/9 \[v0.1.5.3] * 替换了疫情API * 修复了私聊.ban/.unban出错 From 41642589ae94243d3fa020a35235a8ca61e3b616 Mon Sep 17 00:00:00 2001 From: HibiKier <45528451+HibiKier@users.noreply.github.com> Date: Sun, 22 May 2022 20:56:03 +0800 Subject: [PATCH 9/9] Update __version__ --- __version__ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__version__ b/__version__ index ac0eeee1..287794ee 100644 --- a/__version__ +++ b/__version__ @@ -1 +1 @@ -__version__: v0.1.5.3 \ No newline at end of file +__version__: v0.1.5.4