//go:build manual // 手动验证:连真实站点抓一个真画廊并下载前若干张图。 // // 不进常规测试(依赖网络 + 会拖慢 CI),用下面这条命令跑: // // $env:PATH = "$env:USERPROFILE\.local\go\bin;$env:PATH" // go test -tags manual -run TestRealSiteDownload -timeout 300s -v ./internal/hd4k/ // // 参数用环境变量: // // HD4K_URL=https://migmg.ssuu.uk/content/09/xxx.html // HD4K_N=5 // HD4K_OUT=<临时目录> package hd4k import ( "context" "os" "path/filepath" "strings" "testing" "time" ) func TestRealSiteDownload(t *testing.T) { raw := os.Getenv("HD4K_URL") if raw == "" { t.Skip("设 HD4K_URL 指向一个真画廊页再跑") } n := 3 if v := os.Getenv("HD4K_N"); v != "" { n = atoiSafe(v) } out := os.Getenv("HD4K_OUT") if out == "" { out = t.TempDir() } sites := DefaultSites() ref, err := ParseGalleryURL(raw, sites) if err != nil { t.Fatal(err) } t.Logf("归一后 URL = %s", ref.URL) if ref.URL != raw { t.Logf("(输入域名与主域名不同,已归一;ID=%s)", ref.ID) } c := NewClient(30*time.Second, "", "off", sites) ctx, cancel := context.WithTimeout(context.Background(), 4*time.Minute) defer cancel() g, err := c.FetchGallery(ctx, ref, nil) if err != nil { t.Fatal(err) } t.Logf("标题 = %s", g.Title) t.Logf("总页数 = %d", g.TotalPages) t.Logf("图片数 = %d", len(g.Images)) if len(g.Images) == 0 { t.Fatal("一张图都没解析到") } if n > len(g.Images) { n = len(g.Images) } referer := OriginOf(g.URL) + "/" // 目录名复用 core 层的清洗规则,这里只做最小可用处理 dir := filepath.Join(out, sanitizeForManual(g.Title)) if err := os.MkdirAll(dir, 0o755); err != nil { t.Fatal(err) } for i := 0; i < n; i++ { im := g.Images[i] dst := filepath.Join(dir, im.Filename) start := time.Now() if _, err := c.DownloadImage(ctx, im.URL, dst, referer, nil); err != nil { t.Errorf("[%d/%d] %s 下载失败: %v", i+1, n, im.Filename, err) continue } st, err := os.Stat(dst) if err != nil { t.Errorf("[%d/%d] 文件没落盘: %v", i+1, n, err) continue } t.Logf("[%d/%d] %-40s %8d 字节 %v", i+1, n, im.Filename, st.Size(), time.Since(start).Round(time.Millisecond)) } t.Logf("下载目录: %s", dir) } func atoiSafe(s string) int { n := 0 for _, c := range s { if c < '0' || c > '9' { return n } n = n*10 + int(c-'0') } return n } // sanitizeForManual 把标题变成一个能落盘的目录名(仅手动验证用) func sanitizeForManual(s string) string { repl := strings.NewReplacer( "/", "-", `\`, "-", ":", "-", "*", "-", "?", "-", `"`, "", "<", "-", ">", "-", "|", "-") s = repl.Replace(s) s = strings.Trim(strings.Join(strings.Fields(s), " "), " .") if s == "" { return "gallery" } return s }