手机使用时长智能监控系统 - 摸鱼预警系统一、实际应用场景描述场景背景小李是一名数字文化艺术创新创业课程的研究生同时也是一名全栈开发工程师。最近他发现自己在学习和创作过程中手机成为了最大的干扰源- 早上打开电脑准备写代码随手拿起手机看微信消息- 写代码遇到bug卡住习惯性刷抖音/小红书寻找灵感- 下午本该阅读学术论文结果在知乎上学习了2小时- 晚上想早点休息却不知不觉刷短视频到凌晨1点小李尝试过各种意志力戒手机法- 把手机放远一点 → 走过去拿手机的过程中顺便刷了一圈- 开启飞行模式 → 忘记关闭错过重要电话- 使用番茄钟 → 25分钟专注5分钟报复性刷手机- 卸载娱乐APP → 重新下载后发现使用时间翻倍痛点分析1. 意志力不可靠人类大脑对即时满足的渴望远超延迟奖励的理性规划2. 监控盲区不知道具体哪个时间段、哪个APP消耗了最多时间3. 预警滞后通常是刷完才发现时间过去了无法实时干预4. 缺乏个性化一刀切的限制策略不考虑不同场景的需求差异5. 反弹效应强制限制往往导致更强烈的报复性使用解决方案开发一个基于Python的手机使用时长智能监控系统结合数字文化艺术理念通过实时数据采集AI行为分析个性化预警颠覆传统的靠意志力戒手机模式实现从被动抵抗到主动管理的转变。二、核心逻辑讲解┌─────────────────────────────────────────────────────────────────────┐│ 手机使用时长智能监控系统 │├─────────────────────────────────────────────────────────────────────┤│ ││ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ││ │ 数据采集层 │───▶│ 行为分析层 │───▶│ 预警决策层 │ ││ │ │ │ │ │ │ ││ │ • 屏幕时间 │ │ • 模式识别 │ │ • 摸鱼判定 │ ││ │ • APP分类 │ │ • 注意力评估 │ │ • 个性化预警 │ ││ │ • 使用时段 │ │ • 趋势分析 │ │ • 干预策略 │ ││ │ • 设备状态 │ │ • 异常检测 │ │ • 反馈循环 │ ││ └─────────────┘ └─────────────┘ └─────────────┘ ││ │ │ │ ││ ▼ ▼ ▼ ││ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ││ │ 数字文化层 │ │ 艺术表达层 │ │ 用户交互层 │ ││ │ │ │ │ │ │ ││ │ • 使用美学 │ │ • 可视化 │ │ • 终端界面 │ ││ │ • 时间哲学 │ │ • 数据艺术 │ │ • 移动端 │ ││ │ • 行为诗学 │ │ • 生成艺术 │ │ • 通知系统 │ ││ │ • 数字断舍离 │ │ • 信息设计 │ │ • 习惯养成 │ ││ └─────────────┘ └─────────────┘ └─────────────┘ ││ │└─────────────────────────────────────────────────────────────────────┘核心工作流程1. 实时监控手机屏幕状态和APP使用情况2. 采集时间戳、使用时长、APP类别、设备姿态等多维数据3. 运用机器学习算法识别使用模式和注意力波动4. 基于个性化阈值和行为基线判定摸鱼状态5. 触发多层次的预警干预机制温和提醒→艺术唤醒→强制阻断6. 生成可视化的数字文化报告帮助用户理解使用习惯核心判定算法摸鱼指数 (娱乐时长权重 × 娱乐时长占比) (碎片化权重 × 单次使用时长标准差) (时段风险权重 × 高风险时段使用率) -(生产力权重 × 生产力APP使用时长)摸鱼判定- 指数 30: 专注模式- 指数 30-60: 轻度分散- 指数 60-80: 中度摸鱼- 指数 80: 重度摸鱼预警三、完整代码实现项目结构phone_guardian/├── main.py # 主程序入口├── data_collector.py # 数据采集模块├── behavior_analyzer.py # 行为分析模块├── fish_detector.py # 摸鱼检测模块├── alert_system.py # 预警系统模块├── digital_art.py # 数字艺术表达模块├── config.py # 配置文件├── models/ # 机器学习模型目录│ ├── usage_model.pkl│ └── attention_model.pkl├── data/ # 数据存储目录│ ├── raw_usage.csv│ ├── processed_data.json│ └── alerts_history.json├── visualizations/ # 可视化输出目录│ ├── daily_report.png│ └── attention_heatmap.png├── requirements.txt # 依赖清单└── README.md # 项目说明1. requirements.txtpandas2.0.3numpy1.24.3scikit-learn1.3.0matplotlib3.7.2seaborn0.12.2requests2.31.0Pillow10.0.0scipy1.11.1joblib1.3.22. config.py配置文件手机使用时长监控系统 - 配置文件作者AI助手用途统一管理系统配置参数数字文化艺术创新创业课程项目import osfrom dataclasses import dataclass, fieldfrom typing import List, Dict, Optionalfrom enum import Enumclass AppCategory(Enum):APP分类枚举PRODUCTIVITY productivity # 生产力工具COMMUNICATION communication # 通讯社交ENTERTAINMENT entertainment # 娱乐休闲LEARNING learning # 学习教育TOOLS tools # 系统工具UNKNOWN unknown # 未分类dataclassclass AppConfig:APP分类配置# 生产力类APPproductivity_apps: List[str] field(default_factorylambda: [vscode, pycharm, sublime, notion, obsidian,trello, jira, slack, zoom, teams,word, excel, powerpoint, pdf, drawio,terminal, iterm, cmd, powershell, git])# 通讯社交类APPcommunication_apps: List[str] field(default_factorylambda: [wechat, qq, telegram, whatsapp, signal,discord, skype, mail, outlook, gmail,messenger, instagram, facebook, twitter, x])# 娱乐休闲类APPentertainment_apps: List[str] field(default_factorylambda: [tiktok, douyin, bilibili, youtube, netflix,spotify, apple music, qq音乐, 网易云音乐,game, steam, epic, minecraft, 王者荣耀,和平精英, 抖音, 快手, 小红书, 微博])# 学习教育类APPlearning_apps: List[str] field(default_factorylambda: [coursera, udemy, edx, khan, wikipedia,duolingo, anki, memrise, 得到, 知乎,b站学习区, 慕课网, 极客时间, 掘金, csdn])dataclassclass TimeConfig:时间配置# 一天中的高风险时段摸鱼高发期high_risk_hours: List[int] field(default_factorylambda: [9, 10, 14, 15, 16, 20, 21, 22])# 低风险时段允许适度放松low_risk_hours: List[int] field(default_factorylambda: [12, 13, 18, 19])# 睡眠时间不记录为摸鱼sleep_start_hour: int 23sleep_end_hour: int 7# 工作时间定义work_start_hour: int 9work_end_hour: int 18dataclassclass AlertConfig:预警配置# 摸鱼指数阈值mild_distraction_threshold: float 30.0 # 轻度分散moderate_fish_threshold: float 60.0 # 中度摸鱼severe_fish_threshold: float 80.0 # 重度摸鱼# 预警冷却时间秒- 避免频繁打扰alert_cooldown_seconds: int 300# 连续摸鱼次数阈值consecutive_fish_threshold: int 3# 预警级别对应的干预强度alert_levels: Dict[str, Dict] field(default_factorylambda: {mild: {message: 思绪飘散了吗深呼吸回到当下任务~,intervention: gentle_reminder,frequency: low},moderate: {message: 检测到中度摸鱼看看窗外喝杯水吧,intervention: art_wake_up,frequency: medium},severe: {message: 重度摸鱼警报立即暂停完成当前番茄钟,intervention: force_block,frequency: high}})dataclassclass DigitalArtConfig:数字艺术配置# 可视化配色方案color_schemes: Dict[str, List[str]] field(default_factorylambda: {focus: [#2ECC71, #27AE60, #1ABC9C], # 专注绿distraction: [#F39C12, #E67E22, #D35400], # 分散橙fish: [#E74C3C, #C0392B, #922B21], # 摸鱼红neutral: [#3498DB, #2980B9, #1F618D] # 中性蓝})# 生成艺术参数generative_art_params: Dict field(default_factorylambda: {canvas_width: 800,canvas_height: 600,particle_count: 100,animation_speed: 0.02,color_blend_mode: multiply}))dataclassclass UserProfile:用户画像配置username: str default_userwork_style: str creative # creative, analytical, balancedpeak_productivity_hours: List[int] field(default_factorylambda: [10, 11, 14, 15])preferred_break_duration: int 15 # 分钟daily_screen_time_limit: int 480 # 分钟notification_enabled: bool Trueprivacy_level: str standard # minimal, standard, detailedclass SystemConfig:系统总配置def __init__(self):self.app_config AppConfig()self.time_config TimeConfig()self.alert_config AlertConfig()self.art_config DigitalArtConfig()self.user_profile UserProfile()# 数据文件路径self.data_dir os.path.join(os.path.dirname(__file__), data)self.models_dir os.path.join(os.path.dirname(__file__), models)self.viz_dir os.path.join(os.path.dirname(__file__), visualizations)# 创建必要的目录self._create_directories()def _create_directories(self):创建必要的目录for directory in [self.data_dir, self.models_dir, self.viz_dir]:if not os.path.exists(directory):os.makedirs(directory)def get_app_category(self, app_name: str) - AppCategory:根据APP名称获取分类app_lower app_name.lower()for app in self.app_config.productivity_apps:if app in app_lower:return AppCategory.PRODUCTIVITYfor app in self.app_config.communication_apps:if app in app_lower:return AppCategory.COMMUNICATIONfor app in self.app_config.entertainment_apps:if app in app_lower:return AppCategory.ENTERTAINMENTfor app in self.app_config.learning_apps:if app in app_lower:return AppCategory.LEARNINGreturn AppCategory.UNKNOWNdef is_high_risk_hour(self, hour: int) - bool:判断是否为高风险时段return hour in self.time_config.high_risk_hoursdef is_work_hour(self, hour: int) - bool:判断是否为工作时间return self.time_config.work_start_hour hour self.time_config.work_end_hour# 全局配置实例config SystemConfig()# 使用示例if __name__ __main__:print( 手机使用时长监控系统配置)print( * 50)print(f高风险时段: {config.time_config.high_risk_hours})print(fAPP分类示例:)print(f - VS Code: {config.get_app_category(VS Code)})print(f - TikTok: {config.get_app_category(TikTok)})print(f - WeChat: {config.get_app_category(WeChat)})print(f摸鱼阈值: {config.alert_config.mild_distraction_threshold}-{config.alert_config.severe_fish_threshold})3. data_collector.py数据采集模块数据采集模块 - 收集和预处理手机使用数据作者AI助手用途实时采集屏幕时间、APP使用、设备状态等数据数字文化艺术创新创业课程项目import timeimport jsonimport csvfrom datetime import datetime, timedeltafrom typing import Dict, List, Optional, Generatorfrom dataclasses import dataclass, asdictfrom enum import Enumimport threadingimport queuefrom abc import ABC, abstractmethodfrom config import config, AppCategorydataclassclass UsageRecord:使用记录数据结构timestamp: strapp_name: strapp_category: strduration_seconds: floatstart_time: strend_time: strscreen_on: boolbattery_level: Optional[int] Nonedevice_orientation: Optional[str] None # portrait, landscape, flatis_charging: Optional[bool] Nonenetwork_type: Optional[str] None # wifi, cellular, offlineattention_score: Optional[float] None # 注意力评分 0-100class DataCollectorBase(ABC):数据采集器基类abstractmethoddef collect(self) - UsageRecord:采集一条数据passabstractmethoddef start_collection(self):开始持续采集passabstractmethoddef stop_collection(self):停止采集passclass MockDataCollector(DataCollectorBase):模拟数据采集器用于开发和测试在实际部署中可以替换为真实的Android/iOS数据采集接口def __init__(self):self.is_running Falseself.collection_thread: Optional[threading.Thread] Noneself.data_queue queue.Queue(maxsize1000)self.current_app idleself.last_switch_time time.time()# 模拟的应用使用模式self.app_usage_patterns [(vscode, 1800, AppCategory.PRODUCTIVITY), # 编程30分钟(wechat, 300, AppCategory.COMMUNICATION), # 微信5分钟(tiktok, 900, AppCategory.ENTERTAINMENT), # 刷抖音15分钟(notion, 600, AppCategory.PRODUCTIVITY), # 笔记10分钟(bilibili, 1200, AppCategory.ENTERTAINMENT), # B站20分钟(terminal, 300, AppCategory.PRODUCTIVITY), # 终端5分钟(zhihu, 450, AppCategory.LEARNING), # 知乎7.5分钟]self.pattern_index 0self.pattern_position 0def collect(self) - UsageRecord:采集一条模拟数据current_time datetime.now()# 模拟应用切换if self.pattern_position self.app_usage_patterns[self.pattern_index][1]:self.pattern_index (self.pattern_index 1) % len(self.app_usage_patterns)self.pattern_position 0self.current_app self.app_usage_patterns[self.pattern_index][0]app_name, _, app_category self.app_usage_patterns[self.pattern_index]# 生成使用记录record UsageRecord(timestampcurrent_time.strftime(%Y-%m-%d %H:%M:%S),app_nameapp_name,app_categoryapp_category.value,duration_seconds5.0, # 每次采样间隔start_time(current_time - timedelta(seconds5)).strftime(%Y-%m-%d %H:%M:%S),end_timecurrent_time.strftime(%Y-%m-%d %H:%M:%S),screen_onTrue,battery_levelmax(20, 100 - int((self.pattern_index * 10 self.pattern_position / 60))),device_orientationportrait,is_chargingFalse,network_typewifi,attention_scoreself._calculate_attention_score(app_name, current_time.hour))self.pattern_position 5return recorddef _calculate_attention_score(self, app_name: str, hour: int) - float:计算注意力评分base_score 80 if config.get_app_category(app_name) AppCategory.PRODUCTIVITY else 40# 考虑时段影响if config.is_high_risk_hour(hour):base_score - 10if hour in config.user_profile.peak_productivity_hours:base_score 10return max(0, min(100, base_score))def start_collection(self):开始持续采集if self.is_running:returnself.is_running Trueself.collection_thread threading.Thread(targetself._collection_loop, daemonTrue)self.collection_thread.start()print( 数据采集已开始...)def stop_collection(self):停止采集self.is_running Falseif self.collection_thread:self.collection_thread.join(timeout5)print( 数据采集已停止)def _collection_loop(self):采集循环while self.is_running:try:record self.collect()self.data_queue.put(record, timeout1)except queue.Full:pass # 队列满时丢弃旧数据except Exception as e:print(f⚠️ 采集错误: {e})time.sleep(5) # 5秒采样一次def get_recent_records(self, count: int 10) - List[UsageRecord]:获取最近的记录records []while not self.data_queue.empty() and len(records) count:try:records.append(self.data_queue.get_nowait())except queue.Empty:breakreturn recordsclass RealDataCollector(DataCollectorBase):真实数据采集器需要移动端权限和设备API支持这里提供框架实际实现需要平台特定代码def __init__(self):self.is_running Falseself.collected_data: List[UsageRecord] []def collect(self) - UsageRecord:实际实现需要1. Android: UsageStatsManager API2. iOS: ScreenTime API (需要用户授权)3. 跨平台: 可能需要root权限或MDM解决方案raise NotImplementedError(真实数据采集需要平台特定实现。请参考Android UsageStatsManager或iOS ScreenTime文档。)def start_collection(self):开始采集self.is_running Trueprint( 真实数据采集模式启动需要实现平台特定代码)def stop_collection(self):停止采集self.is_running Falseprint( 真实数据采集已停止)class DataProcessor:数据处理器def __init__(self):self.raw_data_buffer: List[UsageRecord] []self.processed_data: List[Dict] []def add_record(self, record: UsageRecord):添加原始记录self.raw_data_buffer.append(record)# 缓冲区满时进行处理if len(self.raw_data_buffer) 12: # 1分钟的数据self._process_buffer()def _process_buffer(self):处理缓冲区数据if not self.raw_data_buffer:return# 合并同一应用的连续使用记录merged_records self._merge_consecutive_records()# 计算聚合统计aggregated self._aggregate_statistics(merged_records)self.processed_data.append(aggregated)self.raw_data_buffer.clear()def _merge_consecutive_records(self) - List[UsageRecord]:合并连续的使用记录if not self.raw_data_buffer:return []merged []current_group [self.raw_data_buffer[0]]for record in self.raw_data_buffer[1:]:last_record current_group[-1]# 如果是同一应用且时间间隔很短合并if (record.app_name last_record.app_name andrecord.screen_on last_record.screen_on):current_group.append(record)else:# 保存当前组并创建新组merged_record self._create_merged_record(current_group)merged.append(merged_record)current_group [record]# 处理最后一组if current_group:merged_record self._create_merged_record(current_group)merged.append(merged_record)return mergeddef _create_merged_record(self, group: List[UsageRecord]) - UsageRecord:创建合并后的记录first group[0]last group[-1]total_duration sum(r.duration_seconds for r in group)return UsageRecord(timestampfirst.timestamp,app_namefirst.app_name,app_categoryfirst.app_category,duration_secondstotal_duration,start_timefirst.start_time,end_timelast.end_time,screen_onfirst.screen_on,battery_levellast.battery_level,device_orientationlast.device_orientation,is_charginglast.is_charging,network_typelast.network_type,attention_scoresum(r.attention_score or 0 for r in group) / len(group))def _aggregate_statistics(self, records: List[UsageRecord]) - Dict:计算聚合统计if not records:return {}# 按应用分类统计app_stats {}for record in records:if record.app_name not in app_stats:app_stats[record.app_name] {category: record.app_category,total_duration: 0,usage_count: 0,avg_attention: 0,attention_sum: 0}app_stats[record.app_name][total_duration] record.duration_secondsapp_stats[record.app_name][usage_count] 1app_stats[record.app_name][attention_sum] record.attention_score or 0# 计算平均注意力for app_name, stats in app_stats.items():if stats[usage_count] 0:stats[avg_attention] stats[attention_sum] / stats[usage_count]del stats[attention_sum]# 计算总体统计total_duration sum(r.duration_seconds for r in records)productivity_duration sum(r.duration_seconds for r in recordsif r.app_category AppCategory.PRODUCTIVITY.value)entertainment_duration sum(r.duration_seconds for r in recordsif r.app_category AppCategory.ENTERTAINMENT.value)利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛