调整自动回复逻辑

This commit is contained in:
liuwei
2025-05-21 16:24:49 +08:00
parent 4bdc04d2da
commit 95db155077
3 changed files with 89 additions and 25 deletions
+65 -17
View File
@@ -1,5 +1,5 @@
import re
from datetime import datetime, time
from datetime import datetime, time, timedelta
import toml
import os
@@ -10,31 +10,40 @@ class InterventionBot:
self.config = {}
if config_path and os.path.exists(config_path):
self.config = toml.load(config_path)
# 从配置中获取关键词
# 从配置中获取关键词和阈值
keywords = self.config.get("Keywords", {})
time_window = self.config.get("TimeWindow", {})
reply_threshold = self.config.get("ReplyThreshold", {})
# 表情符号库
self.emojis = keywords.get("emojis", ["[捂脸]", "[奸笑]", "[可怜]", "[擦汗]", "[发呆]", "[抠鼻]", "[破涕为笑]", "[旺柴]"])
self.emojis = keywords.get("emojis",
["[捂脸]", "[奸笑]", "[可怜]", "[擦汗]", "[发呆]", "[抠鼻]", "[破涕为笑]", "[旺柴]"])
# 话题关键词
self.hot_topics = keywords.get("hot_topics", ["咖啡", "手机", "小米", "华为", "苹果", "价格", "流畅", "螺蛳粉", "外卖"])
self.fish_keywords = keywords.get("fish_keywords", ["鱼缸", "鱼便", "红边", "造浪", "养鱼", "进货", "鳑鲏", "吸鳅"])
self.tech_keywords = keywords.get("tech_keywords", ["MIUI", "鸿蒙", "iPhone", "安卓", "推送", "充电", "屏幕", "电池"])
self.mechanism_keywords = keywords.get("mechanism_keywords", ["积分", "AI ", "功能列表", "黑丝", "打劫", "指令"])
self.hot_topics = keywords.get("hot_topics",
["咖啡", "手机", "小米", "华为", "苹果", "价格", "流畅", "螺蛳粉", "外卖"])
self.fish_keywords = keywords.get("fish_keywords",
["鱼缸", "鱼便", "红边", "造浪", "养鱼", "进货", "鳑鲏", "吸鳅"])
self.tech_keywords = keywords.get("tech_keywords",
["MIUI", "鸿蒙", "iPhone", "安卓", "推送", "充电", "屏幕", "电池"])
self.mechanism_keywords = keywords.get("mechanism_keywords",
["积分", "AI ", "功能列表", "黑丝", "打劫", "指令"])
self.news_keywords = keywords.get("news_keywords", ["新闻", "骨灰房", "法院", "判决", "住建局"])
# 早晨签到时间窗口
morning_start_hour = time_window.get("morning_start_hour", 8)
morning_start_minute = time_window.get("morning_start_minute", 0)
morning_end_hour = time_window.get("morning_end_hour", 8)
morning_end_minute = time_window.get("morning_end_minute", 30)
self.morning_window = (
time(morning_start_hour, morning_start_minute),
time(morning_start_hour, morning_start_minute),
time(morning_end_hour, morning_end_minute)
)
# 回复阈值配置
self.messages_per_minute_threshold = reply_threshold.get("messages_per_minute_threshold", 3)
self.analysis_window_minutes = reply_threshold.get("analysis_window_minutes", 5)
def is_morning_window(self, timestamp):
"""检查是否在早晨签到时间窗口"""
try:
@@ -45,6 +54,8 @@ class InterventionBot:
def detect_topic(self, message):
"""检测消息所属话题类型"""
if not isinstance(message, str):
return None
message_lower = message.lower()
if any(keyword in message_lower for keyword in self.fish_keywords):
return "fish"
@@ -88,7 +99,40 @@ class InterventionBot:
"""规则7:猎奇或社会新闻反应"""
return self.detect_topic(message) == "news"
def should_intervene(self, timestamp, message, messages):
def rule_high_reply_rate(self, timestamp, chat_log):
"""规则8:高回复频率(每分钟消息数超过阈值)"""
try:
# 解析当前时间
current_time = datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S")
window_start = current_time - timedelta(minutes=self.analysis_window_minutes)
# 计算时间窗口内的消息数
recent_messages = []
for msg in chat_log:
try:
msg_time = datetime.strptime(msg["timestamp"], "%Y-%m-%d %H:%M:%S")
if window_start <= msg_time <= current_time:
recent_messages.append(msg)
except (ValueError, KeyError, TypeError):
continue
# 如果消息太少,不触发
if len(recent_messages) < self.messages_per_minute_threshold:
return False
# 计算消息频率
messages_per_minute = len(recent_messages) / self.analysis_window_minutes
# 记录日志,便于调试
if messages_per_minute >= self.messages_per_minute_threshold:
print(f"[高频率检测] 当前消息频率: {messages_per_minute:.2f}/分钟,阈值: {self.messages_per_minute_threshold}/分钟")
return messages_per_minute >= self.messages_per_minute_threshold
except Exception as e:
print(f"[高频率检测] 错误: {e}")
return False
def should_intervene(self, timestamp, message, messages, chat_log):
"""判断是否需要介入"""
rules = [
self.rule_morning_signin,
@@ -97,20 +141,24 @@ class InterventionBot:
self.rule_fish_discussion,
self.rule_mechanism_interaction,
self.rule_humor_tease,
self.rule_news_reaction
self.rule_news_reaction,
self.rule_high_reply_rate
]
for rule in rules:
if rule == self.rule_morning_signin:
if rule(timestamp, messages):
return True
elif rule == self.rule_high_reply_rate:
if rule(timestamp, chat_log):
return True
elif rule(message, messages):
return True
return False
def process_message(self, timestamp, message, messages):
def process_message(self, timestamp, message, messages, chat_log):
"""处理单条消息,返回介入状态"""
if self.should_intervene(timestamp, message, messages):
if self.should_intervene(timestamp, message, messages, chat_log):
return True
return False
@@ -122,7 +170,7 @@ class InterventionBot:
for i, line in enumerate(chat_log):
timestamp = line["timestamp"]
message = line["message"]
intervention = self.process_message(timestamp, message, messages[:i + 1])
intervention = self.process_message(timestamp, message, messages[:i + 1], chat_log)
results.append({
"timestamp": timestamp,
"message": message,