添加新命令并优化关键词过滤机制

- 在bot_commands.py中添加新的'/deletecontaining'命令,允许用户删除所有包含指定词语的关键词。
- 更新guard.py以处理新命令,并微调消息过滤逻辑,限制重复链接的分享。
- 在link_filter.py中实现关键词的子字符串删除功能,并优化匹配和删除逻辑。
This commit is contained in:
wood 2024-09-05 22:40:43 +08:00
parent c1be5d9e0f
commit 1dd2c3a57c
3 changed files with 30 additions and 3 deletions

View File

@ -7,6 +7,7 @@ async def register_commands(client, admin_id):
BotCommand('add', '添加新的关键词'), BotCommand('add', '添加新的关键词'),
BotCommand('delete', '删除现有的关键词'), BotCommand('delete', '删除现有的关键词'),
BotCommand('list', '列出所有当前的关键词'), BotCommand('list', '列出所有当前的关键词'),
BotCommand('deletecontaining', '删除所有包含指定词语的关键词'),
BotCommand('addwhite', '添加域名到白名单'), BotCommand('addwhite', '添加域名到白名单'),
BotCommand('delwhite', '从白名单移除域名'), BotCommand('delwhite', '从白名单移除域名'),
BotCommand('listwhite', '列出白名单域名'), BotCommand('listwhite', '列出白名单域名'),

View File

@ -67,7 +67,7 @@ async def process_message(event, client):
logger.info(f"Message should be filtered: {event.message.text}") logger.info(f"Message should be filtered: {event.message.text}")
if event.sender_id != ADMIN_ID: if event.sender_id != ADMIN_ID:
await event.delete() 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)) asyncio.create_task(delete_message_after_delay(client, event.chat_id, notification, 3 * 60))
return return
if new_links: if new_links:
@ -87,12 +87,12 @@ async def command_handler(event, link_filter):
command, *args = event.message.text.split() command, *args = event.message.text.split()
command = command.lower() 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) await link_filter.handle_keyword_command(event, command, args)
elif command in ['/addwhite', '/delwhite', '/listwhite']: elif command in ['/addwhite', '/delwhite', '/listwhite']:
await link_filter.handle_whitelist_command(event, command, args) 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() link_filter.load_data_from_file()
async def start_bot(): async def start_bot():
async with TelegramClient('bot', api_id=6, api_hash='eb06d4abfb49dc3eeb1aeb98ae0f581e') as client: async with TelegramClient('bot', api_id=6, api_hash='eb06d4abfb49dc3eeb1aeb98ae0f581e') as client:

View File

@ -96,6 +96,25 @@ class LinkFilter:
return True return True
return False 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): def should_filter(self, text):
logger.debug(f"Checking text: {text}") logger.debug(f"Checking text: {text}")
@ -145,6 +164,13 @@ class LinkFilter:
await event.reply(f"未找到精确匹配的关键词 '{keyword}'\n\n以下是相似的关键词:\n" + "\n".join(similar_keywords)) await event.reply(f"未找到精确匹配的关键词 '{keyword}'\n\n以下是相似的关键词:\n" + "\n".join(similar_keywords))
else: else:
await event.reply(f"关键词 '{keyword}' 不存在。") 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: else:
await event.reply("无效的命令或参数。") await event.reply("无效的命令或参数。")