ESO32C3项目C3-AdBlock 编译与配置

  • 克隆地址:https://github.com/M-Abozaid/esp32-c3-adblock

  • 默认的编译环境:VSCode PlatformIO Arduino项目

    编译工程,需要安装VSCode软件,然后安装PlatformIO IDE,在PlatformIO IDE中,安装Espressif 32。

  • esp32c3板子带USB转串口芯片的platformio.ini配置:

    \esp32-c3-adblock\platformio.ini

c 复制代码
[platformio]
default_envs = c3

[env]
platform = espressif32
framework = arduino
board_build.filesystem = littlefs
board_build.partitions = partitions.csv
monitor_speed = 115200

[env:esp32dev]
board = esp32dev

[env:c3]
board = esp32-c3-devkitm-1
; build_flags =
;     -DARDUINO_USB_MODE=0
;     -DARDUINO_USB_CDC_ON_BOOT=0
; 核心配置:将 Flash 模式设置为 DIO
board_build.flash_mode = dio

不添加flash_mode=dio选项,默认的flash mode应该是qio,烧录后,没有反应。

  • ESP32C3板子不带USB转串口芯片的板子
c 复制代码
[platformio]
default_envs = c3

[env]
platform = espressif32
framework = arduino
board_build.filesystem = littlefs
board_build.partitions = partitions.csv

[env:esp32dev]
board = esp32dev

[env:c3]
board = esp32-c3-devkitm-1
; build_flags =
;     -DARDUINO_USB_MODE=1
;     -DARDUINO_USB_CDC_ON_BOOT=1
  • 其它需要自己配置内容:
    esp32-c3-adblock\src\secrets.h(src/secrets.example.h文件重命名而来)
c 复制代码
#pragma once
// Copy this file to secrets.h and fill in your WiFi credentials.
// secrets.h is gitignored so your credentials never get committed.
static const char* WIFI_SSID = "YOUR_WIFI_SSID";
static const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";

// Auth for the dashboard's state-changing endpoints (/ban, /addblock, /upload,
// /update, /setupdate, /forgetwifi) and for network OTA (ArduinoOTA). These used
// to be wide open to anyone who could reach the device on the LAN --- pick real
// values here, ideally not the same as your WiFi password.
static const char* WEB_USER = "admin";
static const char* WEB_PASS = "CHANGE_ME_WEB_PASSWORD";
static const char* OTA_PASS = "CHANGE_ME_OTA_PASSWORD";

推荐修改

src/main.cpp:25 的 Quad9 9.9.9.9(跨境),改为国内的,减少延时。

c 复制代码
#ifndef UPSTREAM_IP
// Tencent DNSPod (~28-31 ms measured from this network).
// Previous default was Quad9 9,9,9,9: 190-260 ms here with peaks near 700 ms, which
// busted UPSTREAM_WAIT_MS on any WiFi hiccup and made forwarded lookups fail.
// Other mainland options measured: 223.5.5.5 32-58 ms, 114.114.114.114 30-32 ms.
#define UPSTREAM_IP 119, 29, 29, 29
#endif
上游 平均 峰值
9.9.9.9(原来) 190~260 ms bilibili 695 / jd 468
腾讯 119.29.29.29 28~31 ms 34
114DNS 30~32 ms 35
阿里 223.5.5.5 32~58 ms 63
  • 后台:http://c3adblock.local/

    可以上传编译好的DNS广告域名列表固件("blocklist.bin")

  • 连接和更新拦截域名固件信息:

📚过滤表获取源

  • https://github.com/privacy-protection-tools/anti-AD/tree/master
  • https://anti-ad.net/

blocklist.bin编译

  • 编译工具在工程目录下的"tools"文件夹。
  • Python命令:
c 复制代码
 python tools/build_blocklist.py data/blocklist.bin tools/domains.txt

surge2.txt需要补充的过滤源。

✅ C3-AdBlock 能生效的广告/网站场景

核心:只拦截【第三方独立域名】的广告、统计、追踪域名(和Pi-hole原理完全一样)

  1. 网页里的第三方横幅广告、弹窗广告
    网页正文加载完成后,额外去广告服务器拉取图片、JS脚本的广告:
  • 例:新闻网站、资讯站、下载站侧边广告、弹窗广告
  • 广告域名:doubleclick.net、googleadservices.com、各类广告联盟域名

你刚才测试的 doubleclick.net 就属于这类,可以被拦截。

  1. 网站、APP的统计/追踪埋点(最稳的效果)
    Google Analytics、各类网站访问统计、用户行为追踪像素、埋点脚本:
  • 作用:不仅去广告,还能阻止网站收集你的浏览行为
  • 常见:google-analytics.com、各类第三方打点域名
  1. 手机APP内广告(游戏、工具类APP)
    很多免费安卓APP、小游戏的开屏广告、插屏广告、横幅广告,广告SDK请求独立广告域名,可以拦截。

比如工具APP启动弹出广告,原理是APP去拉取广告SDK域名,命中黑名单直接返回0.0.0.0,广告加载失败。

4. 恶意域名、挖矿域名、钓鱼站点

如果你的blocklist加入了恶意域名列表,也可以一并拦截。

❌ 无法拦截的广告(重点!很多广告拦不掉)

根本原因:广告和网页主体内容,共用同一个域名(第一方广告),DNS无法区分同域名下哪些资源是广告。

  1. YouTube视频内贴片广告(最典型)
    视频、广告全部来自 youtube.com 同一个域名。
  • 如果把 youtube.com 加入黑名单,视频本身也打不开;
  • DNS层面无法区分这个域名下哪个请求是视频、哪个是广告。
  1. 社交媒体信息流原生广告(朋友圈、小红书、抖音信息流广告)

    广告内容直接由平台自身服务器返回,域名不变。DNS拦截无效。

  2. 网站内置广告(同域名内嵌广告)

    网站自己服务器投放广告(广告和网页是同一个域名),无法拦截。

  3. 使用加密DNS(DoH/DoT)的设备

    手机开启私有DNS、浏览器DoH,查询不走UDP 53,直接绕过C3-AdBlock,广告拦截失效。

  4. 直接IP访问资源

    不走域名解析的请求,DNS系统完全看不到,无法拦截。

📌 视觉上的小缺陷

DNS拦截不会自动清除网页上广告占位框 。

浏览器仍然会预留广告位置,只是广告图片/脚本加载失败,页面会留下空白框。

浏览器插件uBlock Origin可以做页面元素隐藏(CSS过滤),C3-AdBlock做不到。

  • 简单总结
    ✅ 适合:新闻站、论坛、下载站的第三方横幅/弹窗广告;APP开屏插屏广告;网页统计追踪脚本。
    ❌ 不适合:YouTube视频广告、抖音/小红书信息流原生广告、网站同域名内置广告。