linkchecker/main.go

86 lines
1.8 KiB
Go

package main
import (
"fmt"
"log"
"net/url"
"os"
"strings"
"time"
)
func main() {
if len(os.Args) < 2 {
log.Fatal("Please provide a URL as an argument")
}
targetURL := os.Args[1]
// Start time for the filename
startTime := time.Now()
checker := NewLinkChecker()
brokenLinks, err := checker.CheckLinks(targetURL)
if err != nil {
log.Fatal(err)
}
// Extract domain from URL
parsedURL, err := url.Parse(targetURL)
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, startTime.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)
}