对电脑当日联接外网时间进行管理,超过设定时间进行关机
思路
“”"
引言:怎么防止系统时间被修改后依然能正确计算联网时间
怎么读取电脑关机时间?
如何判断超时上网,并进行超时关机
怎么区分"当日"上网时间?
需求升级: 网络不稳、中途断网怎么办?
“”"
时间戳获取: http://www.beijing-time.org/shijianchuo/
以下为主程序(文件名: OOC.py)
# *_* coding:utf8 *_*
from write_json_data import read_json_data, update_json_data
from datetime import datetime
import ctypes
import time
import os
import json
import requests
# 刷新频率(单位s)
REFRESH_RATE = 10
# 网络异常时间阈值(单位s),用于判断异常断网检测
MAX_NETWORK_EXCEPT_TIME = 3
# 最大允许每日联网时长(单位s)
MAX_NETWORKING_TIME = 2 * 60 * 60
url = "http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp"
while True:
# 开始联网
# 这里也可以使用函数递归调用的方式处理网络不稳或等待联网
while True:
# noinspection PyBroadException
try:
startup_dt = json.loads(requests.get(url, timeout=1).text)["data"]
current_date = datetime.fromtimestamp(int(startup_dt["t"])//1000).date()
except:
time.sleep(30)
continue
else:
break
# 写入联网开始时间
update_json_data("startup", startup_dt)
while True:
# 更新联网结束时间,超过最大联网次数退出本次联网时间计时,重新开始新的联网计时
# noinspection PyBroadException
try:
shutdown_dt = json.loads(requests.get(url, timeout=MAX_NETWORK_EXCEPT_TIME).text)["data"]
except:
break
update_json_data("shutdown", shutdown_dt)
ooc_data = read_json_data()
ooc_list = ooc_data["ooc"]
interval_seconds = 0
for ooc in ooc_list:
# 转换为UTC标准时间戳
start_stamp = int(ooc["startup_dt_str"]["t"])//1000
end_stamp = int(ooc["shutdown_dt_str"]["t"])//1000
network_start = datetime.fromtimestamp(start_stamp)
network_end = datetime.fromtimestamp(end_stamp)
if ooc == ooc_list[0]:
print("最后联网起始时间: {}\n最后联网终止时间: {}".format(network_start, network_end))
if network_start.date() == current_date and network_end.date() == current_date:
interval_seconds += (end_stamp - start_stamp)
elif network_end.date() == current_date:
# 东八区天数start_stamp// 86400 * 86400
interval_seconds += (end_stamp + 8*3600 - (end_stamp + 8*3600) // 86400 * 86400)
break
else:
break
print("当日联网时长: {}s \n".format(interval_seconds))
if interval_seconds > MAX_NETWORKING_TIME:
os.system("shutdown -s -t 120")
ctypes.windll.user32.MessageBoxW(0, '当日连续上网{}min,已超过限制的上网时长[{}min]\n你的电脑将于2min后关机'
.format(interval_seconds//60, MAX_NETWORKING_TIME//60), '关机', 0)
time.sleep(REFRESH_RATE)
以下为数据写入包(文件名名: write_json_data)
# *_* coding:utf8 *_*
# json读
import json
import os
json_path = os.path.join(os.path.dirname(__file__), "ooc.json")
def read_json_data():
with open(json_path, "r", encoding="utf8") as f:
return json.load(f)
# json写
def update_json_data(status, dt_str):
if status == "startup":
ooc_data = read_json_data()
ooc_data["ooc"].insert(0, {
"startup_dt_str": dt_str,
"shutdown_dt_str": dt_str
})
elif status == "shutdown":
ooc_data = read_json_data()
ooc_data["ooc"][0]["shutdown_dt_str"] = dt_str
else:
return
with open(json_path, "w", encoding="utf8") as f:
json.dump(ooc_data, f, ensure_ascii=False)
以下为程序运行的数据(文件名: ooc.json)
{“ooc”: [{“startup_dt_str”: {“t”: “1557208691196”}, “shutdown_dt_str”: {“t”: “1557209284186”}},]}