Golang广告拦截工具:无需Hosts和Web服务,高效拦截广告
Golang广告拦截工具:无需Hosts和Web服务,高效拦截广告
本代码示例演示了如何使用Golang编写一个广告拦截工具,无需修改hosts文件或搭建Web服务。它通过自定义HTTP代理和DNS解析来拦截广告请求。代码包含详细的中文注释,方便理解和使用。
package main
import (
"fmt"
"net"
"net/http"
"net/http/httputil"
"strings"
)
// 拦截广告的域名列表
var blockedDomains = []string{
'ad.doubleclick.net',
'googleads.g.doubleclick.net',
'pagead2.googlesyndication.com',
}
// 自定义的HTTP代理
type adblockProxy struct {
transport http.RoundTripper
}
// 实现http.RoundTripper接口的RoundTrip方法
func (p *adblockProxy) RoundTrip(req *http.Request) (*http.Response, error) {
// 检查请求的域名是否在拦截列表中
for _, domain := range blockedDomains {
if strings.Contains(req.URL.Host, domain) {
// 拦截广告请求,返回一个自定义的响应
resp := &http.Response{
StatusCode: http.StatusOK,
Body: nil,
Header: make(http.Header),
}
return resp, nil
}
}
// 如果不是广告请求,继续正常处理请求
return p.transport.RoundTrip(req)
}
func main() {
// 创建一个自定义的HTTP客户端
client := &http.Client{
Transport: &adblockProxy{
transport: http.DefaultTransport,
},
}
// 设置全局默认的HTTP客户端
http.DefaultClient = client
// 启动一个本地DNS服务器,用于解析广告域名
dnsHandler := func(w dns.ResponseWriter, r *dns.Msg) {
m := new(dns.Msg)
m.SetReply(r)
for _, q := range r.Question {
// 检查请求的域名是否在拦截列表中
for _, domain := range blockedDomains {
if strings.Contains(q.Name, domain) {
// 拦截广告请求,返回一个空的A记录
rr := new(dns.A)
rr.Hdr = dns.RR_Header{Name: q.Name, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 0}
rr.A = net.ParseIP('0.0.0.0')
m.Answer = append(m.Answer, rr)
break
}
}
}
w.WriteMsg(m)
}
// 启动DNS服务器并监听在本地地址
go func() {
err := dns.ListenAndServe(':53', 'udp', dnsHandler)
if err != nil {
fmt.Println('DNS服务器启动失败:', err)
}
}()
// 启动一个本地HTTP代理服务器,用于拦截广告请求
proxy := &httputil.ReverseProxy{Director: func(req *http.Request) {
// 修改请求的目标地址为本地地址
req.URL.Scheme = 'http'
req.URL.Host = '127.0.0.1:8080'
}}
http.ListenAndServe(':8080', proxy)
}
该工具使用自定义的HTTP代理拦截广告请求,并启动本地DNS服务器解析广告域名,返回空的A记录。通过将系统的HTTP请求通过本地代理进行拦截和过滤,实现广告拦截效果。
使用方法:
- 将代码保存为
adblock.go文件并编译运行。 - 修改
blockedDomains数组,添加需要拦截的广告域名。 - 将系统的代理设置指向
127.0.0.1:8080。
注意事项:
- 需要确保系统 DNS 解析器设置指向
127.0.0.1,或将本地 DNS 服务器地址添加到系统 DNS 配置中。 - 本代码仅供学习参考,实际应用中可能需要根据自身需求进行调整。
原文地址: https://www.cveoy.top/t/topic/pnDG 著作权归作者所有。请勿转载和采集!