package main import ( "flag" "fmt" "log" "net/url" "os" "strings" "time" ) func main() { url := flag.String("url", "", "URL to check for broken links") flag.Parse() if *url == "" { log.Fatal("Please provide a URL using the -url flag") } checker := NewLinkChecker() brokenLinks, err := checker.CheckLinks(*url) if err != nil { log.Fatal(err) } // Extract domain from URL parsedURL, err := url.Parse(*url) if err != nil { log.Fatal(err) } domain := strings.TrimPrefix(parsedURL.Hostname(), "www.") // Create results file with domain and timestamp filename := fmt.Sprintf("%s-%s.txt", domain, time.Now().Format("2006-01-02-150405")) f, err := os.Create(filename) if err != nil { log.Fatal(err) } defer f.Close() fmt.Fprintf(f, "\nTotal pages checked: %d\n\n", checker.pagesChecked) if len(brokenLinks) == 0 { fmt.Fprintf(f, "No issues found!\n") fmt.Printf("Results written to %s\n", filename) return } // First list redirects var redirectCount int for _, link := range brokenLinks { if link.Redirect != nil { if redirectCount == 0 { fmt.Fprintf(f, "Redirects found:\n") } fmt.Fprintf(f, "- %s (Redirect %d -> %s)\n", link.URL, link.StatusCode, link.Redirect.ToURL) redirectCount++ } } if redirectCount > 0 { fmt.Fprintf(f, "\n") } // Then list broken links var brokenCount int for _, link := range brokenLinks { if link.Redirect == nil { if brokenCount == 0 { fmt.Fprintf(f, "Broken links found:\n") } if link.Error != "" { fmt.Fprintf(f, "- %s (Error: %s)\n", link.URL, link.Error) } else { fmt.Fprintf(f, "- %s (Status: %d)\n", link.URL, link.StatusCode) } brokenCount++ } } fmt.Fprintf(f, "\nTotal issues: %d (%d redirects, %d broken)\n", len(brokenLinks), redirectCount, brokenCount) fmt.Printf("Results written to %s\n", filename) }