feat(maizone): 新增日程活动黑名单以防止自动发送

新增了一个配置项 `schedule.activity_blacklist`,允许用户定义一个包含特定关键字的列表。当定时任务检测到的当前日程活动包含这些关键字(如“睡觉”、“睡眠”)时,将跳过本次自动发送说说的流程。

此功能主要解决了在睡眠等不希望被打扰的活动期间,插件仍然会根据日程表自动发送说说的问题。通过引入黑名单机制,可以更智能地过滤掉不适合发布动态的活动,提升了用户体验和插件的实用性。

主要的逻辑变更在 `SchedulerService` 中:
- 在获取到当前活动后,会先检查活动名称是否包含黑名单中的任意关键字。
- 如果匹配成功,则记录日志并跳过本次发送,同时更新 `last_processed_activity` 状态,以避免在黑名单活动结束后立即错误地触发发送。
- 只有当活动不在黑名单中,且与上一次处理的活动不同时,才会触发发送流程。
This commit is contained in:
tt-P607
2025-08-23 17:20:20 +08:00
parent ab48324c6f
commit 88d56aab50
2 changed files with 26 additions and 13 deletions

View File

@@ -70,6 +70,7 @@ class MaiZoneRefactoredPlugin(BasePlugin):
"enable_schedule": ConfigField(type=bool, default=False, description="是否启用定时发送"),
"random_interval_min_minutes": ConfigField(type=int, default=5, description="随机间隔分钟数下限"),
"random_interval_max_minutes": ConfigField(type=int, default=15, description="随机间隔分钟数上限"),
"activity_blacklist": ConfigField(type=list, default=["睡觉", "睡眠", "梦乡"], description="不会触发自动说说的活动黑名单"),
},
"cookie": {
"http_fallback_host": ConfigField(type=str, default="172.20.130.55", description="备用Cookie获取服务的主机地址"),

View File

@@ -35,6 +35,7 @@ class SchedulerService:
self.qzone_service = qzone_service
self.is_running = False
self.task = None
self.last_processed_activity = None
async def start(self):
"""启动定时任务的主循环。"""
@@ -69,30 +70,41 @@ class SchedulerService:
if not self.get_config("schedule.enable_schedule", False):
await asyncio.sleep(60) # 如果被禁用,则每分钟检查一次状态
continue
# 2. 获取当前时间的日程活动
current_activity = schedule_manager.get_current_activity()
logger.info(current_activity)
logger.info(f"当前检测到的日程活动: {current_activity}")
if current_activity:
now = datetime.datetime.now()
hour_str = now.strftime("%Y-%m-%d %H")
# 3. 检查活动是否在黑名单中
activity_blacklist = self.get_config("schedule.activity_blacklist", ["睡觉", "睡眠"])
if any(keyword in current_activity for keyword in activity_blacklist):
logger.info(f"活动 '{current_activity}' 包含黑名单关键字,本次跳过。")
self.last_processed_activity = current_activity # 更新状态以防活动切换后立即触发
# 3. 检查这个小时的这个活动是否已经处理过,防止重复发送
if not await self._is_processed(hour_str, current_activity):
# 4. 检查活动是否是新的活动
elif current_activity != self.last_processed_activity:
logger.info(f"检测到新的日程活动: '{current_activity}',准备发送说说。")
# 4. 调用QZoneService执行完整的发送流程
# 5. 调用QZoneService执行完整的发送流程
result = await self.qzone_service.send_feed_from_activity(current_activity)
# 5. 将处理结果记录到数据库
# 6. 将处理结果记录到数据库
now = datetime.datetime.now()
hour_str = now.strftime("%Y-%m-%d %H")
await self._mark_as_processed(
hour_str,
current_activity,
result.get("success", False),
hour_str,
current_activity,
result.get("success", False),
result.get("message", "")
)
# 6. 计算并等待一个随机的时间间隔
# 7. 更新上一个处理的活动
self.last_processed_activity = current_activity
else:
logger.info(f"活动 '{current_activity}' 与上次相同,本次跳过。")
# 8. 计算并等待一个随机的时间间隔
min_minutes = self.get_config("schedule.random_interval_min_minutes", 5)
max_minutes = self.get_config("schedule.random_interval_max_minutes", 15)
wait_seconds = random.randint(min_minutes * 60, max_minutes * 60)