diff --git a/src/bot_commands.py b/src/bot_commands.py index 377b8a8..e52af40 100644 --- a/src/bot_commands.py +++ b/src/bot_commands.py @@ -7,6 +7,7 @@ async def register_commands(client, admin_id): BotCommand('add', '添加新的关键词'), BotCommand('delete', '删除现有的关键词'), BotCommand('list', '列出所有当前的关键词'), + BotCommand('deletecontaining', '删除所有包含指定词语的关键词'), BotCommand('addwhite', '添加域名到白名单'), BotCommand('delwhite', '从白名单移除域名'), BotCommand('listwhite', '列出白名单域名'), diff --git a/src/guard.py b/src/guard.py index d56fbd9..c523eed 100644 --- a/src/guard.py +++ b/src/guard.py @@ -67,7 +67,7 @@ async def process_message(event, client): logger.info(f"Message should be filtered: {event.message.text}") if event.sender_id != ADMIN_ID: await event.delete() - notification = await event.respond("已撤回该消息。注:已置顶项目分享链接, 二次分享链接, 都会被撤回.") + notification = await event.respond("已撤回该消息。注:一个链接不能发两次.") asyncio.create_task(delete_message_after_delay(client, event.chat_id, notification, 3 * 60)) return if new_links: @@ -87,12 +87,12 @@ async def command_handler(event, link_filter): command, *args = event.message.text.split() command = command.lower() - if command in ['/add', '/delete', '/list']: + if command in ['/add', '/delete', '/list', '/deletecontaining']: await link_filter.handle_keyword_command(event, command, args) elif command in ['/addwhite', '/delwhite', '/listwhite']: await link_filter.handle_whitelist_command(event, command, args) - if event.raw_text.startswith(('/add', '/delete', '/list', '/addwhite', '/delwhite', '/listwhite')): + if event.raw_text.startswith(('/add', '/delete', '/deletecontaining','/list', '/addwhite', '/delwhite', '/listwhite')): link_filter.load_data_from_file() async def start_bot(): async with TelegramClient('bot', api_id=6, api_hash='eb06d4abfb49dc3eeb1aeb98ae0f581e') as client: diff --git a/src/link_filter.py b/src/link_filter.py index 0ddb84e..2be2b8c 100644 --- a/src/link_filter.py +++ b/src/link_filter.py @@ -95,6 +95,25 @@ class LinkFilter: self.load_data_from_file() # 重新加载以确保数据同步 return True return False + + def remove_keywords_containing(self, substring): + # 记录原始关键词列表的长度 + original_count = len(self.keywords) + + # 创建一个列表,包含所有需要移除的关键词 + removed_keywords = [kw for kw in self.keywords if substring.lower() in kw.lower()] + + # 修改关键词列表,仅保留不包含指定子字符串的关键词 + self.keywords = [kw for kw in self.keywords if substring.lower() not in kw.lower()] + + # 如果有关键词被移除,则保存关键词列表并重新加载数据 + if removed_keywords: + self.save_keywords() + self.load_data_from_file() + + # 返回被移除的关键词列表 + return removed_keywords + def should_filter(self, text): @@ -145,6 +164,13 @@ class LinkFilter: await event.reply(f"未找到精确匹配的关键词 '{keyword}'。\n\n以下是相似的关键词:\n" + "\n".join(similar_keywords)) else: await event.reply(f"关键词 '{keyword}' 不存在。") + elif command == '/deletecontaining' and args: + substring = ' '.join(args) + removed_keywords = self.remove_keywords_containing(substring) + if removed_keywords: + await event.reply(f"已删除包含 '{substring}' 的以下关键词:\n" + "\n".join(removed_keywords)) + else: + await event.reply(f"没有找到包含 '{substring}' 的关键词。") else: await event.reply("无效的命令或参数。")