Python实现Windows用户空闲时长统计及前后端对接求助
解决方案
一、统计总空闲时长
原代码仅能获取当前瞬时空闲时长,要统计累计总空闲时长,需要跟踪用户状态切换(活跃→空闲、空闲→活跃),并记录每段空闲的起始/结束时间来累加。
实现思路:
- 设定一个空闲判定阈值(比如5秒,避免短暂离开误统计)
- 维护两个状态变量:
is_idle(当前是否处于空闲状态)、total_idle(累计总空闲时长,单位秒) - 定时检查空闲时长,当连续空闲超过阈值且未处于空闲状态时,记录空闲开始时间;当用户回到活跃状态时,计算这段空闲时长并累加到总时长。
修改后的代码示例:
import sys import time if sys.platform == 'win32': from ctypes import * class LASTINPUTINFO(Structure): _fields_ = [ ('cbSize', c_uint), ('dwTime', c_int), ] def get_idle_duration(): lastInputInfo = LASTINPUTINFO() lastInputInfo.cbSize = sizeof(lastInputInfo) if windll.user32.GetLastInputInfo(byref(lastInputInfo)): millis = windll.kernel32.GetTickCount() - lastInputInfo.dwTime return millis / 1000.0 else: return 0 else: def get_idle_duration(): return 0 # 空闲统计核心逻辑 def track_idle_time(): total_idle = 0.0 # 累计总空闲时长(秒) is_idle = False idle_start_time = 0.0 IDLE_THRESHOLD = 5 # 连续空闲5秒才判定为空闲状态 while True: current_idle = get_idle_duration() if current_idle >= IDLE_THRESHOLD: if not is_idle: # 进入空闲状态,记录开始时间 is_idle = True idle_start_time = time.time() else: if is_idle: # 从空闲回到活跃,计算这段空闲时长并累加 is_idle = False idle_duration = time.time() - idle_start_time total_idle += idle_duration print(f"累计空闲时长:{total_idle/3600:.2f} 小时") time.sleep(1) # 每秒检查一次 if __name__ == '__main__': track_idle_time()
二、构建数据对象
需要将任务跟踪数据与空闲数据整合,设计统一的数据结构,方便存储和前端展示。
推荐数据结构(可扩展):
from dataclasses import dataclass from datetime import datetime from typing import List, Optional # 任务跟踪数据对象 @dataclass class TaskRecord: task_id: str task_name: str start_time: datetime end_time: Optional[datetime] duration: float # 任务耗时(秒) # 空闲时段数据对象 @dataclass class IdleRecord: idle_id: str start_time: datetime end_time: datetime duration: float # 单段空闲时长(秒) # 每日统计汇总 @dataclass class DailySummary: date: str total_task_duration: float total_idle_duration: float task_records: List[TaskRecord] idle_records: List[IdleRecord]
持久化存储:
- 用SQLite数据库创建对应表结构,关联任务和日期;
- 或用JSON文件定期存储记录,适合小型应用快速开发。
三、搭建API对接前端
用轻量的Flask/FastAPI搭建RESTful API,将统计数据暴露给前端。
Flask示例(简单易上手):
from flask import Flask, jsonify from datetime import datetime app = Flask(__name__) # 模拟存储的统计数据(实际从数据库/JSON读取) mock_summary = { "date": datetime.today().strftime("%Y-%m-%d"), "total_task_duration": 7200.0, # 2小时 "total_idle_duration": 3600.0, # 1小时 "task_records": [ {"task_id": "t1", "task_name": "代码开发", "start_time": "2024-05-20 09:00:00", "end_time": "2024-05-20 10:00:00", "duration": 3600.0} ], "idle_records": [ {"idle_id": "i1", "start_time": "2024-05-20 10:00:00", "end_time": "2024-05-20 11:00:00", "duration": 3600.0} ] } # 获取当日统计数据接口 @app.route('/api/daily-summary', methods=['GET']) def get_daily_summary(): return jsonify(mock_summary) # 获取累计总空闲时长接口 @app.route('/api/total-idle', methods=['GET']) def get_total_idle(): # 实际从汇总数据计算或读取 return jsonify({"total_idle_hours": mock_summary["total_idle_duration"]/3600}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
前端可以通过AJAX/Fetch调用这些接口,将数据渲染成图表或列表展示。
内容的提问来源于stack exchange,提问作者Rushi Pan
相关产品推荐
相关产品推荐

