编辑代码

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

	// 创建Excel文件
	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])

					// 尝试连接HTTP
					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")

				// 写入Excel
				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()

	// 保存Excel文件
	if err := f.SaveAs("result.xlsx"); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	// 完成进度条
	bar.Finish()
}

// 从CSV文件中读取域名列表
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
}