package main
import (
"encoding/csv"
"fmt"
"net"
"net/http"
"os"
"strconv"
"sync"
"time"
"github.com/360EntSecGroup-Skylar/excelize/v2"
"github.com/cheggaaa/pb/v3"
)
type Domain struct {
Name string
IP string
Status string
Timestamp string
title string
}
func main() {
domains, err := readDomains("domain.csv")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
bar := pb.StartNew(len(domains))
c := make(chan Domain)
var wg sync.WaitGroup
maxConcurrent := 10
f := excelize.NewFile()
f.SetCellValue("Sheet1", "A1", "域名")
f.SetCellValue("Sheet1", "B1", "IP地址")
f.SetCellValue("Sheet1", "C1", "状态")
f.SetCellValue("Sheet1", "D1", "标题")
f.SetCellValue("Sheet1", "E1", "时间")
var mu sync.Mutex
for i := 0; i < maxConcurrent; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for domain := range c {
ip, err := net.LookupHost(domain.Name)
if err != nil {
domain.IP = "无法解析"
domain.Status = "解析失败"
} else {
domain.IP = string(ip[0])
client := http.Client{Timeout: 3 * time.Second}
resp, err := client.Get("http://" + domain.Name)
if err != nil {
domain.Status = err.Error()
} else {
defer resp.Body.Close()
domain.Status = strconv.Itoa(resp.StatusCode)
}
}
domain.Timestamp = time.Now().Format("2006-01-02 15:04:05")
mu.Lock()
f.SetCellValue("Sheet1", "A"+strconv.Itoa(int(bar.Current()+1)), domain.Name)
f.SetCellValue("Sheet1", "B"+strconv.Itoa(int(bar.Current()+1)), domain.IP)
f.SetCellValue("Sheet1", "C"+strconv.Itoa(int(bar.Current()+1)), domain.Status)
f.SetCellValue("Sheet1", "D"+strconv.Itoa(int(bar.Current()+1)), domain.title)
f.SetCellValue("Sheet1", "E"+strconv.Itoa(int(bar.Current()+1)), domain.Timestamp)
bar.Increment()
mu.Unlock()
}
}()
}
for _, domain := range domains {
c <- domain
}
close(c)
wg.Wait()
if err := f.SaveAs("result.xlsx"); err != nil {
fmt.Println(err)
os.Exit(1)
}
bar.Finish()
}
func readDomains(filename string) ([]Domain, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
reader := csv.NewReader(file)
records, err := reader.ReadAll()
if err != nil {
return nil, err
}
var domains []Domain
for _, record := range records {
domains = append(domains, Domain{Name: record[0]})
}
return domains, nil
}