AdGuardHome时间规则设置:分时段过滤广告

AdGuardHome时间规则设置:分时段过滤广告

【免费下载链接】AdGuardHome Network-wide ads & trackers blocking DNS server 【免费下载链接】AdGuardHome 项目地址: https://gitcode.com/gh_mirrors/ad/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  # 表示全天不启用

注意:如果某个日期没有配置时间段,默认全天不启用该规则;startend都为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启用过滤,午休和下午时段暂停过滤。

注意事项与故障排除

时间配置不生效

如果设置的时间规则没有按预期生效,请检查:

  1. 时区设置是否正确,确保与当前所在时区一致
  2. 时间格式是否正确,避免使用如9:00这样的格式,应使用9h
  3. 时间段是否合理,开始时间必须小于结束时间
  4. 配置文件是否被正确加载,可查看AdGuardHome的日志文件确认

配置文件格式错误

YAML格式对缩进和特殊字符敏感,如遇格式错误,可使用在线YAML验证工具检查。项目中提供的配置迁移工具configmigrate/configmigrate.go也可帮助验证和转换配置文件。

总结

AdGuardHome的时间规则功能通过internal/schedule/schedule.go模块提供了灵活的分时段过滤能力,让广告过滤可以根据你的日常习惯自动调整。通过合理配置,可以在工作时段保持专注,在休闲时段享受更自由的网络体验。

要了解更多高级功能,可参考项目文档:

如果你有其他时间规则的使用场景或配置技巧,欢迎在项目的Issue区分享交流!

【免费下载链接】AdGuardHome Network-wide ads & trackers blocking DNS server 【免费下载链接】AdGuardHome 项目地址: https://gitcode.com/gh_mirrors/ad/AdGuardHome

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值