From 033bdb6c21465fc55d44c63a7e380a428fb9860f Mon Sep 17 00:00:00 2001 From: Azide Date: Sun, 22 May 2022 15:52:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(platform):=E4=B8=BAmcbbsnews=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E4=BA=86=20=E5=9F=BA=E5=B2=A9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=B5=84=E8=AE=AF=20=E8=AE=A2=E9=98=85=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nonebot_bison/platform/mcbbsnews.py | 64 ++++++++++++++----- .../static/mcbbsnews_bedrock_post.txt | 61 ++++++++++++++++++ tests/platforms/test_mcbbsnews.py | 11 ++++ 3 files changed, 120 insertions(+), 16 deletions(-) create mode 100644 tests/platforms/static/mcbbsnews_bedrock_post.txt diff --git a/src/plugins/nonebot_bison/platform/mcbbsnews.py b/src/plugins/nonebot_bison/platform/mcbbsnews.py index 77b9437..f8eca7a 100644 --- a/src/plugins/nonebot_bison/platform/mcbbsnews.py +++ b/src/plugins/nonebot_bison/platform/mcbbsnews.py @@ -1,5 +1,6 @@ import re import time +from typing import Literal import httpx from bs4 import BeautifulSoup, NavigableString, Tag @@ -27,8 +28,8 @@ def _stamp_date(rawdate: str) -> int: return time_stamp -class McbbsJavaNews(NewMessage): - categories = {1: "Java版本资讯"} +class McbbsNews(NewMessage): + categories = {1: "Java版本资讯", 2: "基岩版本资讯"} enable_tag = False platform_name = "mcbbsnews" name = "MCBBS幻翼块讯" @@ -87,6 +88,8 @@ class McbbsJavaNews(NewMessage): match post["category"]: case "Java版本资讯": return Category(1) + case "基岩版本资讯": + return Category(2) case _: raise CategoryNotSupport("McbbsNews订阅暂不支持 `{}".format(post["category"])) @@ -97,20 +100,45 @@ class McbbsJavaNews(NewMessage): return True return False - def _javanews_parser(self, rawtext: str): - """提取Java版本资讯的推送消息""" - # 事先删除不需要的尾部 - rawtext = re.sub(r"【本文排版借助了:[\s\S]*】", "", rawtext) - rawsoup = BeautifulSoup(rawtext.replace("
", ""), "html.parser") + def _news_parser(self, raw_text: str, news_type: Literal["Java版本资讯", "基岩版本资讯"]): + """提取Java/Bedrock版本资讯的推送消息""" + raw_soup = BeautifulSoup(raw_text.replace("
", ""), "html.parser") # 获取头图 - pic_tag = rawsoup.find( - "img", file=re.compile(r"https://www.minecraft.net/\S*header.jpg") - ) - pic_url: list[str] = [pic_tag.get("src", pic_tag.get("file"))] - # 获取blockquote标签下的内容 - soup = rawsoup.find( - "td", id=re.compile(r"postmessage_[0-9]*") - ).blockquote.blockquote + match news_type: + case "Java版本资讯": + # 获取头图 + pic_tag = raw_soup.find( + "img", file=re.compile(r"https://www.minecraft.net/\S*header.jpg") + ) + pic_url: list[str] = ( + [pic_tag.get("src", pic_tag.get("file"))] if pic_tag else [] + ) + # 获取blockquote标签下的内容 + soup = raw_soup.find( + "td", id=re.compile(r"postmessage_[0-9]*") + ).blockquote.blockquote + case "基岩版本资讯": + # 获取头图 + pic_tag_0 = raw_soup.find( + "img", file=re.compile(r"https://www.minecraft.net/\S*header.jpg") + ) + pic_tag_1 = raw_soup.find( + "img", + file=re.compile(r"https://feedback.minecraft.net/\S*beta\S*.jpg"), + ) + pic_url: list[str] = [ + pic_tag_0.get("src", pic_tag_0.get("file")) if pic_tag_0 else None, + pic_tag_1.get("src", pic_tag_1.get("file")) if pic_tag_1 else None, + ] + # 获取blockquote标签下的内容 + soup = ( + raw_soup.find("td", id=re.compile(r"postmessage_[0-9]*")) + .select("blockquote:nth-of-type(2)")[0] + .blockquote + ) + case _: + raise CategoryNotSupport(f"该函数不支持处理{news_type}") + # 通用步骤 # 删除无用的div和span段内容 for del_tag in soup.find_all(["div", "span"]): del_tag.extract() @@ -175,7 +203,11 @@ class McbbsJavaNews(NewMessage): match raw_post["category"]: case "Java版本资讯": - text, pic_urls = self._javanews_parser(html.text) + # 事先删除不需要的尾部 + raw_text = re.sub(r"【本文排版借助了:[\s\S]*】", "", html.text) + text, pic_urls = self._news_parser(raw_text, raw_post["category"]) + case "基岩版本资讯": + text, pic_urls = self._news_parser(html.text, raw_post["category"]) case _: raise CategoryNotSupport( "McbbsNews订阅暂不支持 `{}".format(raw_post["category"]) diff --git a/tests/platforms/static/mcbbsnews_bedrock_post.txt b/tests/platforms/static/mcbbsnews_bedrock_post.txt new file mode 100644 index 0000000..c693018 --- /dev/null +++ b/tests/platforms/static/mcbbsnews_bedrock_post.txt @@ -0,0 +1,61 @@ +这里便是本周测试版的新内容啦!一如往常的,请搜索你能发现的bug,在 +报告给我们,并在 +这里 +留下你的反馈。 + +MinecraftBeta + +Windows平台上的MinecraftBeta将要退出历史舞台了!如果想要继续体验我们先行版本上的新特性的话,你将需要安装MinecraftPreview版本。你可以在这里 +取得更多详细信息。 + +特性和漏洞修复 + +悦灵 + +现在悦灵不会随其主人一同被传送到下界了。这个更改将暂时保留至我们修复悦灵在传送至其他维度后卡进方块憋死的bug。(MCPE-155678) + +方块 + +与自然生成的相对应,非自然生成的幽匿尖啸体现在将在多次激活间间隔一定的冷却时间(MCPE-153944) +使用精准采集破坏时,幽匿尖啸体和幽匿感测体将不再掉落经验值(MCPE-153359,MCPE-153965) +增加了破坏强化深板岩所需要的时间,并使其与所使用的工具相独立,以更好地与Java版相匹配(MCPE-154097) +幽匿块现在无法通过火和灵魂火传播了 + +红树沼泽 + +红树现在将在负Y维度的位置正确生长(MCPE-154983) + +图像 + +修复了Android平台上图像崩坏的问题(MCPE-155509) +修复了多次使用表情符号引起的视觉故障问题(MCPE-155049) + +移动 + +使用移动预测的Actor现在将再次被平滑传送 + +稳定性和性能 + +优化了某些Android设备上的游戏性能(MCPE-142934) +修复了一个尝试渲染依靠生物群系数据着色的方块时可能引起的崩溃 + +用户界面 + +现在按下Shift键并点击物品将再次能够将相同物品合并进同一槽位了(MCPE-153992) +添加了修改通知持续时间的设置项 + +技术性更新 + +方块 + +修复了复制一个命令方块到另一个后,需要再次切换红石信号才能使其生效的问题 + +Gametest框架(实验性游戏内容) + +专用服务器已经更新,现在允许服务器在运行脚本时显式列出他们想要加载的脚本模块。默认配置文件位于/config/default/permissions.json。如果没有这个新文件,默认情况下将禁用所有脚本模块 + +【苦力怕553译自 +feedback.minecraft.net2022年5月12日发布的MinecraftBeta&Preview-1.19.0.32/33 +】 +【本文排版借助了: +v2.4.7】 diff --git a/tests/platforms/test_mcbbsnews.py b/tests/platforms/test_mcbbsnews.py index 936980a..732097e 100644 --- a/tests/platforms/test_mcbbsnews.py +++ b/tests/platforms/test_mcbbsnews.py @@ -28,12 +28,23 @@ def javanews_post_1(): return get_file("mcbbsnews_java_post-1.txt") +@pytest.fixture(scope="module") +def bedrocknews_post(): + return get_file("mcbbsnews_bedrock_post.txt") + + @pytest.mark.asyncio async def test_javanews_parser(mcbbsnews, raw_post_list, javanews_post_0): post = await mcbbsnews.parse(raw_post_list[3]) assert post.text == javanews_post_0 +@pytest.mark.asyncio +async def test_bedrocknews_parser(mcbbsnews, raw_post_list, bedrocknews_post): + post = await mcbbsnews.parse(raw_post_list[4]) + assert post.text == bedrocknews_post + + @pytest.mark.asyncio @respx.mock async def test_fetch_new(mcbbsnews, dummy_user_subinfo, javanews_post_1):