package util import ( "fmt" "io" "net/http" "net/url" "os" "strings" ) // isEquivalentURL 判断两个 URL 是否在规范化后相同 func IsEquivalentURL(url1, url2 string) bool { norm1 := normalizeURL(url1) norm2 := normalizeURL(url2) return norm1 == norm2 } // normalizeURL 规范化 URL:移除末尾斜杠、协议标准化、移除 index.html func normalizeURL(rawURL string) string { u, err := url.Parse(rawURL) if err != nil { return rawURL } // 将 http 和 https 视为同一种协议 u.Scheme = "https" // 移除尾部的 /index.html 或 .html u.Path = strings.TrimSuffix(u.Path, "/index.html") u.Path = strings.TrimSuffix(u.Path, ".html") // 移除末尾的 / u.Path = strings.TrimRight(u.Path, "/") return u.String() } func DownloadFile(url string, filepath string) error { // 发送 HTTP GET 请求 resp, err := http.Get(url) if err != nil { return fmt.Errorf("下载失败: %v", err) } defer resp.Body.Close() // 检查 HTTP 响应状态码 if resp.StatusCode != http.StatusOK { return fmt.Errorf("请求失败,状态码: %d", resp.StatusCode) } // 创建文件 out, err := os.Create(filepath) if err != nil { return fmt.Errorf("创建文件失败: %v", err) } defer out.Close() // 将响应的内容复制到文件 _, err = io.Copy(out, resp.Body) if err != nil { return fmt.Errorf("保存失败: %v", err) } return nil }