🐛 Arknights 公告分类 过滤不可访问的 URL (#495)

This commit is contained in:
AzideCupric 2024-03-10 21:52:30 +08:00 committed by GitHub
parent 55197e4f6b
commit 3cda6bfa0d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 75 additions and 5 deletions

View File

@ -3,7 +3,7 @@ from functools import partial
from httpx import AsyncClient from httpx import AsyncClient
from bs4 import BeautifulSoup as bs from bs4 import BeautifulSoup as bs
from pydantic import Field, BaseModel from pydantic import Field, AnyUrl, BaseModel
from nonebot.compat import type_validate_python from nonebot.compat import type_validate_python
from ..post import Post from ..post import Post
@ -113,7 +113,11 @@ class Arknights(NewMessage):
title=title, title=title,
nickname="明日方舟游戏内公告", nickname="明日方舟游戏内公告",
images=[data.banner_image_url] if data.banner_image_url else None, images=[data.banner_image_url] if data.banner_image_url else None,
url=data.jump_link or None, url=(
url.unicode_string()
if data.jump_link and (url := AnyUrl(data.jump_link)).scheme.startswith("http")
else None
),
timestamp=data.updated_at, timestamp=data.updated_at,
compress=True, compress=True,
) )

5
poetry.lock generated
View File

@ -1,4 +1,4 @@
# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. # This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand.
[[package]] [[package]]
name = "aiodns" name = "aiodns"
@ -3503,7 +3503,6 @@ files = [
{file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
{file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
{file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
{file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"},
{file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
{file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
{file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
@ -3837,7 +3836,7 @@ files = [
[package.dependencies] [package.dependencies]
aiosqlite = {version = "*", optional = true, markers = "extra == \"aiosqlite\""} aiosqlite = {version = "*", optional = true, markers = "extra == \"aiosqlite\""}
greenlet = {version = "!=0.4.17", optional = true, markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\" or extra == \"aiosqlite\""} greenlet = {version = "!=0.4.17", optional = true, markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\" or extra == \"aiosqlite\""}
typing-extensions = {version = ">=4.6.0", optional = true, markers = "extra == \"aiosqlite\""} typing-extensions = ">=4.6.0"
[package.extras] [package.extras]
aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"]

View File

@ -41,6 +41,73 @@ def monster_siren_list_1():
return get_json("monster-siren_list_1.json") return get_json("monster-siren_list_1.json")
@respx.mock
async def test_url_parse(app: App):
from httpx import AsyncClient
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform.arknights import Arknights, BulletinData, BulletinListItem, ArkBulletinResponse
cid_router = respx.get("https://ak-webview.hypergryph.com/api/game/bulletin/1")
def make_bulletin_obj(jump_link: str):
return BulletinData.model_validate({
"cid": "1",
"displayType": 1,
"title": "title",
"category": 1,
"header": "header",
"content": "content",
"jumpLink": jump_link,
"bannerImageUrl": "https://www.baidu.com",
"displayTime": "2021-08-01",
"updatedAt": 1627795200,
})
def make_bulletin_list_item_obj():
return BulletinListItem(
cid="1",
title="title",
category=1,
displayTime="2021-08-01",
updatedAt=1627795200,
sticky=False,
)
def make_response(b: BulletinData):
return Response(200, json=ArkBulletinResponse(code=0, msg="", data=b).model_dump(by_alias=True))
b1 = make_bulletin_obj("")
assert b1.jump_link == ""
b2 = make_bulletin_obj("uniwebview://move?target=shop&param1=SKINSHOP")
assert b2.jump_link == "uniwebview://move?target=shop&param1=SKINSHOP"
b3 = make_bulletin_obj("https://www.baidu.com")
assert b3.jump_link == "https://www.baidu.com"
b4 = make_bulletin_obj("http://www.baidu.com")
assert b4.jump_link == "http://www.baidu.com"
ark = Arknights(ProcessContext(), AsyncClient())
cid_router.mock(return_value=make_response(b1))
p1 = await ark.parse(make_bulletin_list_item_obj())
assert p1.url is None
cid_router.mock(return_value=make_response(b2))
p2 = await ark.parse(make_bulletin_list_item_obj())
assert p2.url is None
cid_router.mock(return_value=make_response(b3))
p3 = await ark.parse(make_bulletin_list_item_obj())
assert p3.url == "https://www.baidu.com/"
cid_router.mock(return_value=make_response(b4))
p4 = await ark.parse(make_bulletin_list_item_obj())
assert p4.url == "http://www.baidu.com/"
@pytest.mark.asyncio() @pytest.mark.asyncio()
async def test_get_date_in_bulletin(app: App): async def test_get_date_in_bulletin(app: App):
from nonebot_bison.utils import ProcessContext from nonebot_bison.utils import ProcessContext