电脑生活派
柔彩主题三 · 更轻盈的阅读体验

用数据库思路搭建家庭上网控制小系统

发布时间:2025-12-13 00:49:08 阅读:254 次

家里孩子最近迷上了刷短视频,一坐就是两小时,作业也不写。老婆让我想办法管管,又不想直接断网伤感情。我就琢磨着,能不能用点技术手段,既让孩子正常查资料,又能限制娱乐网站和使用时长?

从“手动拦”到“自动控”

最开始我试过在路由器后台把抖音、快手这些域名手动拉黑。可没两天,孩子就学会了用网页版的替代入口,或者换设备连手机热点。这招太容易绕过去。

后来想到,其实这种需求本质上是个数据匹配问题:当某个设备(比如孩子的iPad)在特定时间(比如晚上8点后)尝试访问某些网址(比如游戏或视频站)时,系统应该自动拦截。这不就是一条条规则记录吗?跟数据里的条件查询很像。

控制策略存进表格

我用SQLite搭了个简单的本地数据库,建了两张表:

CREATE TABLE devices (
id INTEGER PRIMARY KEY,
mac_address TEXT NOT NULL,
nickname TEXT
);

CREATE TABLE rules (
id INTEGER PRIMARY KEY,
device_id INTEGER,
blocked_domain TEXT,
start_hour INTEGER,
end_hour INTEGER,
FOREIGN KEY(device_id) REFERENCES devices(id)
);

比如给孩子的设备分配一个nickname叫‘儿子iPad’,MAC地址记下来。然后在rules表里加一条:device_id对应这条设备,blocked_domain是‘*.douyin.com’,start_hour是20,end_hour是22。意思是每晚8点到10点禁止刷抖音。

定时扫描+动态生效

再写个Python脚本,每隔5分钟跑一次。它会查当前时间属于哪个规则区间,然后把需要拦截的域名汇总出来,生成一份hosts文件或者调用路由器API更新过滤列表。

import sqlite3
from datetime import datetime

conn = sqlite3.connect('parental_control.db')
cursor = conn.cursor()

now_hour = datetime.now().hour

cursor.execute('''
SELECT DISTINCT blocked_domain FROM rules
WHERE ? BETWEEN start_hour AND end_hour
''', (now_hour,))

blocked_list = [row[0] for row in cursor.fetchall()]

# 输出到系统hosts或发送到网络网关
with open('/tmp/blocked_hosts', 'w') as f:
for domain in blocked_list:
f.write('127.0.0.1 ' + domain + '\n')

实际效果怎么样?

上周试运行几天,效果比预期好。孩子周中晚上想打开抖音,页面直接打不开,但查百度资料、上学校网课都没影响。我还加了个白名单表,允许访问‘baidu.com’、‘zhihu.com’这类学习站点。

有次他拿同学送的加速器App翻出去,我也很快发现流量异常,去数据库里把那个IP段加进黑名单就解决了。关键是有记录可查,不是瞎猜。

为什么不用现成软件?

市面上确实有不少家长控制软件,但要么要订阅费,要么绑定云服务,隐私有点担心。自己搭的好处是数据全在本地,改规则也灵活。比如周末可以临时放宽两小时,直接改数据库就行,不用研究复杂界面。

而且这套逻辑不依赖特定品牌路由器,只要能自定义DNS或支持API调用,基本都能接上。我现在用的OpenWRT固件,配合这个小系统挺稳的。

说到底,技术不能代替陪伴,但合理利用工具,能让管理更轻松一点。至少现在晚饭后,孩子不会再抱着平板不撒手了。