AdGuardHome时间规则设置:分时段过滤广告
你是否遇到过这样的困扰:工作时间需要屏蔽所有广告保持专注,而休闲时段又希望适当放宽过滤规则?AdGuardHome的时间规则功能可以帮你实现分时段精准控制广告过滤策略。本文将详细介绍如何通过配置文件设置基于时间的过滤规则,让网络防护更智能、更贴合你的使用习惯。
时间规则功能概述
AdGuardHome的时间规则功能基于内部的Weekly调度模块实现,允许用户为每周的不同日期设置独立的过滤时间段。核心实现代码位于internal/schedule/schedule.go,该模块提供了时间区间校验、时区转换和时间段包含判断等关键功能。
时间规则的工作原理是通过定义每周循环的时间区间,在指定时段内自动启用或禁用特定的过滤规则。系统会根据配置的时区(如"Asia/Shanghai")判断当前时间是否落在设定的区间内,从而动态调整过滤策略。
时间规则配置文件结构
AdGuardHome的时间规则配置采用YAML格式,主要包含时区设置和每周各天的时间段定义两部分。典型的配置结构如下:
time_zone: "Asia/Shanghai"
sun:
start: 0h
end: 24h
mon:
start: 9h
end: 18h
tue:
start: 9h
end: 18h
# ...其他日期配置
上述配置表示:周日全天启用过滤,周一至周二的9:00-18:00启用过滤。配置文件中的时间值支持h(小时)、m(分钟)等单位,如30m表示30分钟,1h30m表示1小时30分钟。
详细配置步骤
1. 准备配置文件
AdGuardHome的主配置文件通常名为AdGuardHome.yaml,你可以在项目根目录找到示例配置next/AdGuardHome.example.yaml。时间规则配置需要添加在过滤规则定义部分。
2. 设置时区
首先需要在配置文件中指定时区,确保时间判断准确。中国用户可设置为:
time_zone: "Asia/Shanghai"
支持的时区列表可参考系统的/usr/share/zoneinfo目录或IANA时区数据库。
3. 定义每日时间段
为每周的不同日期设置过滤时间段。以下是一个完整的示例配置,实现工作日(周一至周五)9:00-18:00严格过滤,周末放宽过滤的策略:
schedule:
time_zone: "Asia/Shanghai"
mon:
start: 9h
end: 18h
tue:
start: 9h
end: 18h
wed:
start: 9h
end: 18h
thu:
start: 9h
end: 18h
fri:
start: 9h
end: 18h
sat:
start: 10h
end: 16h
sun:
start: 0h
end: 0h # 表示全天不启用
注意:如果某个日期没有配置时间段,默认全天不启用该规则;
start和end都为0h表示全天不启用。
4. 应用配置
配置完成后,需要重启AdGuardHome服务使配置生效。可以通过以下命令重启服务:
sudo systemctl restart AdGuardHome
或使用项目提供的控制脚本:
./scripts/install.sh -r
时间规则实现原理
AdGuardHome的时间规则功能核心实现位于internal/schedule/schedule.go文件中,主要通过Weekly结构体和相关方法实现。
时间段包含判断
Weekly结构体的Contains方法用于判断当前时间是否在设定的时间段内:
func (w *Weekly) Contains(t time.Time) (ok bool) {
t = t.In(w.location)
wd := t.Weekday()
dr := w.days[wd]
y, m, d := t.Date()
day := time.Date(y, m, d, 0, 0, 0, 0, w.location)
offset := t.Sub(day)
return dr.contains(offset)
}
这段代码首先将当前时间转换到配置的时区,然后计算当天的偏移量,最后判断该偏移量是否在当天的时间区间内。
时间区间校验
为确保配置的时间区间有效,系统会对配置进行校验:
func (r dayRange) validate() (err error) {
switch {
case r.start < 0:
return fmt.Errorf("start %s is negative", r.start)
case r.end < 0:
return fmt.Errorf("end %s is negative", r.end)
case r.start >= r.end:
return fmt.Errorf("start %s is greater or equal to end %s", r.start, r.end)
// ...其他校验
}
}
这段代码确保开始时间不为负、结束时间大于开始时间、时间值不超过24小时等。
高级应用场景
场景1:工作日与周末不同策略
time_zone: "Asia/Shanghai"
mon:
start: 8h
end: 18h
tue:
start: 8h
end: 18h
wed:
start: 8h
end: 18h
thu:
start: 8h
end: 18h
fri:
start: 8h
end: 20h
sat:
start: 10h
end: 16h
sun:
start: 0h
end: 0h
此配置适合周一至周五8:00-18:00(周五延长至20:00)启用过滤,周六10:00-16:00启用过滤,周日完全关闭过滤。
场景2:午休时段暂停过滤
time_zone: "Asia/Shanghai"
mon:
start: 9h
end: 12h
tue:
start: 9h
end: 12h
# ...其他工作日配置
只在上午9:00-12:00启用过滤,午休和下午时段暂停过滤。
注意事项与故障排除
时间配置不生效
如果设置的时间规则没有按预期生效,请检查:
- 时区设置是否正确,确保与当前所在时区一致
- 时间格式是否正确,避免使用如
9:00这样的格式,应使用9h - 时间段是否合理,开始时间必须小于结束时间
- 配置文件是否被正确加载,可查看AdGuardHome的日志文件确认
配置文件格式错误
YAML格式对缩进和特殊字符敏感,如遇格式错误,可使用在线YAML验证工具检查。项目中提供的配置迁移工具configmigrate/configmigrate.go也可帮助验证和转换配置文件。
总结
AdGuardHome的时间规则功能通过internal/schedule/schedule.go模块提供了灵活的分时段过滤能力,让广告过滤可以根据你的日常习惯自动调整。通过合理配置,可以在工作时段保持专注,在休闲时段享受更自由的网络体验。
要了解更多高级功能,可参考项目文档:
- 官方文档:README.md
- 开发指南:HACKING.md
- 贡献指南:CONTRIBUTING.md
如果你有其他时间规则的使用场景或配置技巧,欢迎在项目的Issue区分享交流!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



