下面是用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代理进行拦截和过滤,从而达到广告拦截的效果

作为一个资深golang研发工程师用代码写一个广告拦截工具不用hosts方法不用web服务。代码内有详细的中文注释

原文地址: https://www.cveoy.top/t/topic/hEzq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录