作为一个资深golang研发工程师用代码写一个广告拦截工具不用hosts方法不用web服务。代码内有详细的中文注释
下面是用Golang编写的广告拦截工具,它使用了DNS解析和HTTP代理的方式来拦截广告请求。代码中包含了详细的中文注释,以便于理解和使用。
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请求通过本地的HTTP代理进行拦截和过滤,从而达到广告拦截的效果
原文地址: https://www.cveoy.top/t/topic/hEzq 著作权归作者所有。请勿转载和采集!