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请求通过本地代理进行拦截和过滤,实现广告拦截效果。

使用方法:

  1. 将代码保存为 adblock.go 文件并编译运行。
  2. 修改 blockedDomains 数组,添加需要拦截的广告域名。
  3. 将系统的代理设置指向 127.0.0.1:8080

注意事项:

  • 需要确保系统 DNS 解析器设置指向 127.0.0.1,或将本地 DNS 服务器地址添加到系统 DNS 配置中。
  • 本代码仅供学习参考,实际应用中可能需要根据自身需求进行调整。

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

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