mirror of
				https://github.com/suyiiyii/nonebot-bison.git
				synced 2025-10-28 09:24:53 +08:00 
			
		
		
		
	Merge branch 'main' into next
This commit is contained in:
		
						commit
						22f6796b33
					
				| @ -2,6 +2,8 @@ | |||||||
| 
 | 
 | ||||||
| ## 最近更新 | ## 最近更新 | ||||||
| 
 | 
 | ||||||
|  | - feat (issue #67 ):添加屏蔽特定tag的功能 [@AzideCupric](https://github.com/AzideCupric) ([#101](https://github.com/felinae98/nonebot-bison/pull/101)) | ||||||
|  | 
 | ||||||
| ### 新功能 | ### 新功能 | ||||||
| 
 | 
 | ||||||
| - 在StatusChange中提供了如果api返回错误不更新status的方法 [@felinae98](https://github.com/felinae98) ([#96](https://github.com/felinae98/nonebot-bison/pull/96)) | - 在StatusChange中提供了如果api返回错误不更新status的方法 [@felinae98](https://github.com/felinae98) ([#96](https://github.com/felinae98/nonebot-bison/pull/96)) | ||||||
|  | |||||||
| @ -215,3 +215,29 @@ RSS 链接即为 uid | |||||||
| 
 | 
 | ||||||
| 在网易云网页上电台的链接一般为`https://music.163.com/#/djradio?id=793745436`,`id=` | 在网易云网页上电台的链接一般为`https://music.163.com/#/djradio?id=793745436`,`id=` | ||||||
| 后面的数字即为 uid | 后面的数字即为 uid | ||||||
|  | 
 | ||||||
|  | ### 平台订阅标签(Tag) | ||||||
|  | 
 | ||||||
|  | 社交平台中的 Tag 一般指使用井号(`#`)作为前缀,将关键词进行标记,方便用户进行搜索的功能。   | ||||||
|  | 例子:`#明日方舟# #每日打卡#(weibo、bilibili) #baracamp(Twitter)` | ||||||
|  | 
 | ||||||
|  | 在 Bison 中,用户在添加平台账号订阅时(如果该平台提供有 hashtag 功能),   | ||||||
|  | 会进行`输入需要订阅/屏蔽tag`的步骤。 | ||||||
|  | 
 | ||||||
|  | 如果需要订阅某些 tag,需要直接向 bison 发送需要订阅的一系列 tag,并使用空格进行分隔。   | ||||||
|  | 例:`A1行动预备组 罗德厨房——回甘` | ||||||
|  | 
 | ||||||
|  | 如果需要屏蔽某些 tag,需要在需要屏蔽的 tag 前加上前缀`~`,对于复数的 tag,使用空格进行分隔。   | ||||||
|  | 例:`~123罗德岛 ~莱茵生命漫画` | ||||||
|  | 
 | ||||||
|  | 可以综合运用以上规则进行同时订阅/屏蔽。   | ||||||
|  | 例:`A1行动预备组 ~123罗德岛 罗德厨房——回甘 ~莱茵生命漫画` | ||||||
|  | 
 | ||||||
|  | #### Tag 的推送规则 | ||||||
|  | 
 | ||||||
|  | 每当 Bison 抓取到一条推送,推送中的 Tag 会经过一下检查: | ||||||
|  | 
 | ||||||
|  | - Bison 会对**需屏蔽 Tag**进行最优先检查,只要检测到本次推送中存在**任一**已记录的**需屏蔽 tag**,Bison 便会将该推送丢弃。 | ||||||
|  | - 上一个检查通过后,Bison 会对**需订阅 tag**进行检查,如果本次推送中存在**任一**已记录的**需订阅 tag**,Bison 便会将该推送发送到群中。 | ||||||
|  | - 当已记录的**需订阅 tag**为空时,只要通过了*第一条规则*的检查,Bison 就会将该推送发送到群中。 | ||||||
|  | - 当已记录的**需订阅 tag**不为空时,即使通过了*第一条规则*的检查,若本次推送不含**任何**已记录的**需订阅 tag**,Bison 也会将该推送丢弃。 | ||||||
|  | |||||||
| @ -137,7 +137,7 @@ def do_add_sub(add_sub: Type[Matcher]): | |||||||
|             state["id"] = target |             state["id"] = target | ||||||
|             state["name"] = name |             state["name"] = name | ||||||
|         except (LookupError): |         except (LookupError): | ||||||
|             url = "https://nonebot-bison.vercel.app/usage/#%E6%89%80%E6%94%AF%E6%8C%81%E5%B9%B3%E5%8F%B0%E7%9A%84-uid" |             url = "https://nonebot-bison.netlify.app/usage/#%E6%89%80%E6%94%AF%E6%8C%81%E5%B9%B3%E5%8F%B0%E7%9A%84-uid" | ||||||
|             title = "Bison所支持的平台UID" |             title = "Bison所支持的平台UID" | ||||||
|             content = "查询相关平台的uid格式或获取方式" |             content = "查询相关平台的uid格式或获取方式" | ||||||
|             image = "https://s3.bmp.ovh/imgs/2022/03/ab3cc45d83bd3dd3.jpg" |             image = "https://s3.bmp.ovh/imgs/2022/03/ab3cc45d83bd3dd3.jpg" | ||||||
| @ -182,13 +182,17 @@ def do_add_sub(add_sub: Type[Matcher]): | |||||||
|         if not platform_manager[state["platform"]].enable_tag: |         if not platform_manager[state["platform"]].enable_tag: | ||||||
|             state["tags"] = [] |             state["tags"] = [] | ||||||
|             return |             return | ||||||
|         state["_prompt"] = '请输入要订阅的tag,订阅所有tag输入"全部标签"' |         state["_prompt"] = '请输入要订阅/屏蔽的tag(不含#号)\n多个tag请使用空格隔开\n具体规则回复"详情"' | ||||||
| 
 | 
 | ||||||
|     async def parser_tags(event: MessageEvent, state: T_State): |     async def parser_tags(event: MessageEvent, state: T_State): | ||||||
|         if not isinstance(state["tags"], Message): |         if not isinstance(state["tags"], Message): | ||||||
|             return |             return | ||||||
|         if str(event.get_message()).strip() == "取消":  # 一般不会有叫 取消 的tag吧 |         if str(event.get_message()).strip() == "取消":  # 一般不会有叫 取消 的tag吧 | ||||||
|             await add_sub.finish("已中止订阅") |             await add_sub.finish("已中止订阅") | ||||||
|  |         if str(event.get_message()).strip() == "详情": | ||||||
|  |             await add_sub.reject( | ||||||
|  |                 '订阅tag直接输入tag内容\n订阅所有tag输入"全部标签"\n屏蔽tag请在tag名称前添加~号\n详见https://nonebot-bison.netlify.app/usage/#平台订阅标签-tag' | ||||||
|  |             ) | ||||||
|         if str(event.get_message()).strip() == "全部标签": |         if str(event.get_message()).strip() == "全部标签": | ||||||
|             state["tags"] = [] |             state["tags"] = [] | ||||||
|         else: |         else: | ||||||
|  | |||||||
| @ -110,6 +110,43 @@ class Platform(metaclass=RegistryABCMeta, base=True): | |||||||
|     def set_stored_data(self, target: Target, data: Any): |     def set_stored_data(self, target: Target, data: Any): | ||||||
|         self.store[target] = data |         self.store[target] = data | ||||||
| 
 | 
 | ||||||
|  |     def tag_separator(self, stored_tags: list[Tag]) -> tuple[list[Tag], list[Tag]]: | ||||||
|  |         """返回分离好的正反tag元组""" | ||||||
|  |         subscribed_tags = [] | ||||||
|  |         banned_tags = [] | ||||||
|  |         for tag in stored_tags: | ||||||
|  |             if tag.startswith("~"): | ||||||
|  |                 banned_tags.append(tag.lstrip("~")) | ||||||
|  |             else: | ||||||
|  |                 subscribed_tags.append(tag) | ||||||
|  |         return subscribed_tags, banned_tags | ||||||
|  | 
 | ||||||
|  |     def is_banned_post( | ||||||
|  |         self, | ||||||
|  |         post_tags: Collection[Tag], | ||||||
|  |         subscribed_tags: list[Tag], | ||||||
|  |         banned_tags: list[Tag], | ||||||
|  |     ) -> bool: | ||||||
|  |         """只要存在任意屏蔽tag则返回真,此行为优先级最高。 | ||||||
|  |         存在任意被订阅tag则返回假,此行为优先级次之。 | ||||||
|  |         若被订阅tag为空,则返回假。 | ||||||
|  |         """ | ||||||
|  |         # 存在任意需要屏蔽的tag则为真 | ||||||
|  |         if banned_tags: | ||||||
|  |             for tag in post_tags or []: | ||||||
|  |                 if tag in banned_tags: | ||||||
|  |                     return True | ||||||
|  |         # 检测屏蔽tag后,再检测订阅tag | ||||||
|  |         # 存在任意需要订阅的tag则为假 | ||||||
|  |         if subscribed_tags: | ||||||
|  |             ban_it = True | ||||||
|  |             for tag in post_tags or []: | ||||||
|  |                 if tag in subscribed_tags: | ||||||
|  |                     ban_it = False | ||||||
|  |             return ban_it | ||||||
|  |         else: | ||||||
|  |             return False | ||||||
|  | 
 | ||||||
|     async def filter_user_custom( |     async def filter_user_custom( | ||||||
|         self, raw_post_list: list[RawPost], cats: list[Category], tags: list[Tag] |         self, raw_post_list: list[RawPost], cats: list[Category], tags: list[Tag] | ||||||
|     ) -> list[RawPost]: |     ) -> list[RawPost]: | ||||||
| @ -120,13 +157,9 @@ class Platform(metaclass=RegistryABCMeta, base=True): | |||||||
|                 if cats and cat not in cats: |                 if cats and cat not in cats: | ||||||
|                     continue |                     continue | ||||||
|             if self.enable_tag and tags: |             if self.enable_tag and tags: | ||||||
|                 flag = False |                 if self.is_banned_post( | ||||||
|                 post_tags = self.get_tags(raw_post) |                     self.get_tags(raw_post), *self.tag_separator(tags) | ||||||
|                 for tag in post_tags or []: |                 ): | ||||||
|                     if tag in tags: |  | ||||||
|                         flag = True |  | ||||||
|                         break |  | ||||||
|                 if not flag: |  | ||||||
|                     continue |                     continue | ||||||
|             res.append(raw_post) |             res.append(raw_post) | ||||||
|         return res |         return res | ||||||
|  | |||||||
							
								
								
									
										246
									
								
								tests/platforms/static/bilibili_fake_dy_list.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										246
									
								
								tests/platforms/static/bilibili_fake_dy_list.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,246 @@ | |||||||
|  | { | ||||||
|  |     "data": { | ||||||
|  |         "cards": [ | ||||||
|  |             { | ||||||
|  |                 "desc": { | ||||||
|  |                     "type": 2 | ||||||
|  |                 }, | ||||||
|  |                 "display": { | ||||||
|  |                     "topic_info": { | ||||||
|  |                         "topic_details": [ | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "" | ||||||
|  |                             } | ||||||
|  |                         ] | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "desc": { | ||||||
|  |                     "type": 1 | ||||||
|  |                 }, | ||||||
|  |                 "display": { | ||||||
|  |                     "topic_info": { | ||||||
|  |                         "topic_details": [ | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "" | ||||||
|  |                             } | ||||||
|  |                         ] | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "desc": { | ||||||
|  |                     "type": 8 | ||||||
|  |                 }, | ||||||
|  |                 "display": { | ||||||
|  |                     "topic_info": { | ||||||
|  |                         "topic_details": [ | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "明日方舟" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "风笛" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "琴柳" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "风暴瞭望" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "轮换池" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "打卡挑战" | ||||||
|  |                             } | ||||||
|  |                         ] | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "desc": { | ||||||
|  |                     "type": 2 | ||||||
|  |                 }, | ||||||
|  |                 "display": { | ||||||
|  |                     "topic_info": { | ||||||
|  |                         "topic_details": [ | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "" | ||||||
|  |                             } | ||||||
|  |                         ] | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "desc": { | ||||||
|  |                     "type": 1 | ||||||
|  |                 }, | ||||||
|  |                 "display": { | ||||||
|  |                     "topic_info": { | ||||||
|  |                         "topic_details": [ | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "明日方舟" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "饼学大厦" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "可露希尔的秘密档案" | ||||||
|  |                             } | ||||||
|  |                         ] | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "desc": { | ||||||
|  |                     "type": 1 | ||||||
|  |                 }, | ||||||
|  |                 "display": { | ||||||
|  |                     "topic_info": { | ||||||
|  |                         "topic_details": [ | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "罗德岛相簿" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "可露希尔的秘密档案" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "罗德岛闲逛部" | ||||||
|  |                             } | ||||||
|  |                         ] | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "desc": { | ||||||
|  |                     "type": 8 | ||||||
|  |                 }, | ||||||
|  |                 "display": { | ||||||
|  |                     "topic_info": { | ||||||
|  |                         "topic_details": [ | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "明日方舟" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "轮换学" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "常驻标准寻访" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "轮换池" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "打卡挑战" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "舟游" | ||||||
|  |                             } | ||||||
|  |                         ] | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "desc": { | ||||||
|  |                     "type": 2 | ||||||
|  |                 }, | ||||||
|  |                 "display": { | ||||||
|  |                     "topic_info": { | ||||||
|  |                         "topic_details": [ | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "明日方舟" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "饼学大厦" | ||||||
|  |                             } | ||||||
|  |                         ] | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "desc": { | ||||||
|  |                     "type": 4 | ||||||
|  |                 }, | ||||||
|  |                 "display": { | ||||||
|  |                     "topic_info": { | ||||||
|  |                         "topic_details": [ | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "" | ||||||
|  |                             } | ||||||
|  |                         ] | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "desc": { | ||||||
|  |                     "type": 1 | ||||||
|  |                 }, | ||||||
|  |                 "display": { | ||||||
|  |                     "topic_info": { | ||||||
|  |                         "topic_details": [ | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "明日方舟" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "饼学大厦" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "罗德岛相簿" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "可露希尔的秘密档案" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "罗德岛闲逛部" | ||||||
|  |                             } | ||||||
|  |                         ] | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "desc": { | ||||||
|  |                     "type": 1 | ||||||
|  |                 }, | ||||||
|  |                 "display": { | ||||||
|  |                     "topic_info": { | ||||||
|  |                         "topic_details": [ | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "明日方舟" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "饼学大厦" | ||||||
|  |                             } | ||||||
|  |                         ] | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "desc": { | ||||||
|  |                     "type": 1 | ||||||
|  |                 }, | ||||||
|  |                 "display": { | ||||||
|  |                     "topic_info": { | ||||||
|  |                         "topic_details": [ | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "明日方舟" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "饼学大厦" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "罗德岛相簿" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "可露希尔的秘密档案" | ||||||
|  |                             }, | ||||||
|  |                             { | ||||||
|  |                                 "topic_name": "罗德岛闲逛部" | ||||||
|  |                             } | ||||||
|  |                         ] | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										129
									
								
								tests/platforms/static/tag_cases.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								tests/platforms/static/tag_cases.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,129 @@ | |||||||
|  | [ | ||||||
|  |     { | ||||||
|  |         "case": { | ||||||
|  |             "post_tags": [ | ||||||
|  |                 "111", | ||||||
|  |                 "222", | ||||||
|  |                 "333", | ||||||
|  |                 "444" | ||||||
|  |             ], | ||||||
|  |             "subscribed_tags": [ | ||||||
|  |                 "222" | ||||||
|  |             ], | ||||||
|  |             "banned_tags": [ | ||||||
|  |                 "555" | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|  |         "result": false | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "case": { | ||||||
|  |             "post_tags": [ | ||||||
|  |                 "111", | ||||||
|  |                 "222", | ||||||
|  |                 "333", | ||||||
|  |                 "444" | ||||||
|  |             ], | ||||||
|  |             "subscribed_tags": [], | ||||||
|  |             "banned_tags": [ | ||||||
|  |                 "555" | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|  |         "result": false | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "case": { | ||||||
|  |             "post_tags": [ | ||||||
|  |                 "111", | ||||||
|  |                 "222", | ||||||
|  |                 "333", | ||||||
|  |                 "444" | ||||||
|  |             ], | ||||||
|  |             "subscribed_tags": [], | ||||||
|  |             "banned_tags": [ | ||||||
|  |                 "444" | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|  |         "result": true | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "case": { | ||||||
|  |             "post_tags": [ | ||||||
|  |                 "111", | ||||||
|  |                 "222", | ||||||
|  |                 "333", | ||||||
|  |                 "444" | ||||||
|  |             ], | ||||||
|  |             "subscribed_tags": [ | ||||||
|  |                 "222" | ||||||
|  |             ], | ||||||
|  |             "banned_tags": [] | ||||||
|  |         }, | ||||||
|  |         "result": false | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "case": { | ||||||
|  |             "post_tags": [ | ||||||
|  |                 "111", | ||||||
|  |                 "222", | ||||||
|  |                 "333", | ||||||
|  |                 "444" | ||||||
|  |             ], | ||||||
|  |             "subscribed_tags": [], | ||||||
|  |             "banned_tags": [] | ||||||
|  |         }, | ||||||
|  |         "result": false | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "case": { | ||||||
|  |             "post_tags": [ | ||||||
|  |                 "111", | ||||||
|  |                 "222", | ||||||
|  |                 "333", | ||||||
|  |                 "444" | ||||||
|  |             ], | ||||||
|  |             "subscribed_tags": ["111","555","666"], | ||||||
|  |             "banned_tags": [] | ||||||
|  |         }, | ||||||
|  |         "result": false | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "case": { | ||||||
|  |             "post_tags": [ | ||||||
|  |                 "111", | ||||||
|  |                 "222", | ||||||
|  |                 "333", | ||||||
|  |                 "444" | ||||||
|  |             ], | ||||||
|  |             "subscribed_tags": ["111","555"], | ||||||
|  |             "banned_tags": ["333"] | ||||||
|  |         }, | ||||||
|  |         "result": true | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "case": { | ||||||
|  |             "post_tags": [ | ||||||
|  |                 "111", | ||||||
|  |                 "222", | ||||||
|  |                 "333", | ||||||
|  |                 "444" | ||||||
|  |             ], | ||||||
|  |             "subscribed_tags": ["111","333"], | ||||||
|  |             "banned_tags": ["111"] | ||||||
|  |         }, | ||||||
|  |         "result": true | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "case": { | ||||||
|  |             "post_tags": [ | ||||||
|  |                 "111", | ||||||
|  |                 "222", | ||||||
|  |                 "333", | ||||||
|  |                 "444" | ||||||
|  |             ], | ||||||
|  |             "subscribed_tags": ["222"], | ||||||
|  |             "banned_tags": ["555","333"] | ||||||
|  |         }, | ||||||
|  |         "result": true | ||||||
|  |     } | ||||||
|  | ] | ||||||
| @ -98,3 +98,33 @@ async def test_parse_target(bilibili: "Bilibili"): | |||||||
|         await bilibili.parse_target( |         await bilibili.parse_target( | ||||||
|             "https://www.bilibili.com/video/BV1qP4y1g738?spm_id_from=333.999.0.0" |             "https://www.bilibili.com/video/BV1qP4y1g738?spm_id_from=333.999.0.0" | ||||||
|         ) |         ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.fixture(scope="module") | ||||||
|  | def post_list(): | ||||||
|  |     return get_json("bilibili_fake_dy_list.json")["data"]["cards"] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # 测试新tag机制的平台推送情况 | ||||||
|  | @pytest.mark.asyncio | ||||||
|  | async def test_filter_user_custom(bilibili, post_list): | ||||||
|  | 
 | ||||||
|  |     only_banned_tags = ["~可露希尔的秘密档案"] | ||||||
|  |     res0 = await bilibili.filter_user_custom(post_list, [], only_banned_tags) | ||||||
|  |     assert len(res0) == 8 | ||||||
|  | 
 | ||||||
|  |     only_subscribed_tags = ["可露希尔的秘密档案"] | ||||||
|  |     res1 = await bilibili.filter_user_custom(post_list, [], only_subscribed_tags) | ||||||
|  |     assert len(res1) == 4 | ||||||
|  | 
 | ||||||
|  |     multi_subs_tags_1 = ["可露希尔的秘密档案", "罗德岛相簿"] | ||||||
|  |     res2 = await bilibili.filter_user_custom(post_list, [], multi_subs_tags_1) | ||||||
|  |     assert len(res2) == 4 | ||||||
|  | 
 | ||||||
|  |     multi_subs_tags_2 = ["罗德岛相簿", "风暴瞭望"] | ||||||
|  |     res3 = await bilibili.filter_user_custom(post_list, [], multi_subs_tags_2) | ||||||
|  |     assert len(res3) == 4 | ||||||
|  | 
 | ||||||
|  |     multi_subs_tags_3 = ["明日方舟", "~饼学大厦"] | ||||||
|  |     res4 = await bilibili.filter_user_custom(post_list, [], multi_subs_tags_3) | ||||||
|  |     assert len(res4) == 2 | ||||||
|  | |||||||
							
								
								
									
										32
									
								
								tests/platforms/test_platform_tag_filter.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								tests/platforms/test_platform_tag_filter.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | |||||||
|  | import pytest | ||||||
|  | from nonebug.app import App | ||||||
|  | 
 | ||||||
|  | from .utils import get_json | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.fixture(scope="module") | ||||||
|  | def test_cases(): | ||||||
|  |     return get_json("tag_cases.json") | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # 测试正反tag的判断情况 | ||||||
|  | @pytest.mark.asyncio | ||||||
|  | async def test_filter_user_custom_tag(app: App, test_cases): | ||||||
|  |     from nonebot_bison.platform import platform_manager | ||||||
|  | 
 | ||||||
|  |     bilibili = platform_manager["bilibili"] | ||||||
|  |     for case in test_cases: | ||||||
|  |         res = bilibili.is_banned_post(**case["case"]) | ||||||
|  |         assert res == case["result"] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # 测试正反tag的分离情况 | ||||||
|  | @pytest.mark.asyncio | ||||||
|  | async def test_tag_separator(app: App): | ||||||
|  |     from nonebot_bison.platform import platform_manager | ||||||
|  | 
 | ||||||
|  |     bilibili = platform_manager["bilibili"] | ||||||
|  |     tags = ["~111", "222", "333", "~444", "555"] | ||||||
|  |     res = bilibili.tag_separator(tags) | ||||||
|  |     assert res[0] == ["222", "333", "555"] | ||||||
|  |     assert res[1] == ["111", "444"] | ||||||
| @ -1,3 +1,5 @@ | |||||||
|  | from email import message | ||||||
|  | 
 | ||||||
| import pytest | import pytest | ||||||
| import respx | import respx | ||||||
| from httpx import Response | from httpx import Response | ||||||
| @ -151,12 +153,20 @@ async def test_add_with_target(app: App, init_scheduler): | |||||||
|         ) |         ) | ||||||
|         ctx.receive_event(bot, event_5_ok) |         ctx.receive_event(bot, event_5_ok) | ||||||
|         ctx.should_call_send(event_5_ok, Message(BotReply.add_reply_on_tags), True) |         ctx.should_call_send(event_5_ok, Message(BotReply.add_reply_on_tags), True) | ||||||
|         event_6 = fake_group_message_event( |         event_6_more_info = fake_group_message_event( | ||||||
|  |             message=Message("详情"), sender=fake_admin_user | ||||||
|  |         ) | ||||||
|  |         ctx.receive_event(bot, event_6_more_info) | ||||||
|  |         ctx.should_call_send( | ||||||
|  |             event_6_more_info, BotReply.add_reply_on_tags_need_more_info, True | ||||||
|  |         ) | ||||||
|  |         ctx.should_rejected() | ||||||
|  |         event_6_ok = fake_group_message_event( | ||||||
|             message=Message("全部标签"), sender=fake_admin_user |             message=Message("全部标签"), sender=fake_admin_user | ||||||
|         ) |         ) | ||||||
|         ctx.receive_event(bot, event_6) |         ctx.receive_event(bot, event_6_ok) | ||||||
|         ctx.should_call_send( |         ctx.should_call_send( | ||||||
|             event_6, BotReply.add_reply_subscribe_success("明日方舟Arknights"), True |             event_6_ok, BotReply.add_reply_subscribe_success("明日方舟Arknights"), True | ||||||
|         ) |         ) | ||||||
|         ctx.should_finished() |         ctx.should_finished() | ||||||
|     subs = await config.list_subscribe(10000, "group") |     subs = await config.list_subscribe(10000, "group") | ||||||
|  | |||||||
| @ -99,7 +99,7 @@ class BotReply: | |||||||
| 
 | 
 | ||||||
|     @staticmethod |     @staticmethod | ||||||
|     def add_reply_on_id_input_search(): |     def add_reply_on_id_input_search(): | ||||||
|         search_url = "https://nonebot-bison.vercel.app/usage/#%E6%89%80%E6%94%AF%E6%8C%81%E5%B9%B3%E5%8F%B0%E7%9A%84-uid" |         search_url = "https://nonebot-bison.netlify.app/usage/#%E6%89%80%E6%94%AF%E6%8C%81%E5%B9%B3%E5%8F%B0%E7%9A%84-uid" | ||||||
|         search_title = "Bison所支持的平台UID" |         search_title = "Bison所支持的平台UID" | ||||||
|         search_content = "查询相关平台的uid格式或获取方式" |         search_content = "查询相关平台的uid格式或获取方式" | ||||||
|         search_image = "https://s3.bmp.ovh/imgs/2022/03/ab3cc45d83bd3dd3.jpg" |         search_image = "https://s3.bmp.ovh/imgs/2022/03/ab3cc45d83bd3dd3.jpg" | ||||||
| @ -144,5 +144,6 @@ class BotReply: | |||||||
|     add_reply_on_id_input_error = "id输入错误" |     add_reply_on_id_input_error = "id输入错误" | ||||||
|     add_reply_on_target_parse_input_error = "不能从你的输入中提取出id,请检查你输入的内容是否符合预期" |     add_reply_on_target_parse_input_error = "不能从你的输入中提取出id,请检查你输入的内容是否符合预期" | ||||||
|     add_reply_on_platform_input_error = "平台输入错误" |     add_reply_on_platform_input_error = "平台输入错误" | ||||||
|     add_reply_on_tags = '请输入要订阅的tag,订阅所有tag输入"全部标签"' |     add_reply_on_tags = '请输入要订阅/屏蔽的tag(不含#号)\n多个tag请使用空格隔开\n具体规则回复"详情"' | ||||||
|  |     add_reply_on_tags_need_more_info = '订阅tag直接输入tag内容\n订阅所有tag输入"全部标签"\n屏蔽tag请在tag名称前添加~号\n详见https://nonebot-bison.netlify.app/usage/#平台订阅标签-tag' | ||||||
|     add_reply_abort = "已中止订阅" |     add_reply_abort = "已中止订阅" | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user