package main

import ( "bufio" "flag" "fmt" "math/rand" "os" "strconv" "strings" "sync" "time"

"github.com/logrusorgru/aurora/v3"
log "github.com/projectdiscovery/gologger"
"github.com/projectdiscovery/gologger/levels"

)

var ( query string engine string page int headers headersFlag proxy string silent bool queries []string wg sync.WaitGroup proxies []string proxyMux sync.Mutex )

type headersFlag []string

func (h *headersFlag) String() string { return fmt.Sprintf("%+v", *h) }

func (h *headersFlag) Set(s string) error { *h = append(*h, s) return nil }

type options struct { Query string Engine string Page int Proxy string Headers headersFlag }

func init() { flag.StringVar(&query, "q", "", "") flag.StringVar(&query, "query", "", "")

flag.StringVar(&engine, "e", "", "")
flag.StringVar(&engine, "engine", "google", "")

flag.IntVar(&page, "p", 1, "")
flag.IntVar(&page, "page", 1, "")

flag.Var(&headers, "header", "")
flag.Var(&headers, "H", "")

flag.StringVar(&proxy, "x", "", "")
flag.StringVar(&proxy, "proxy", "", "")

flag.BoolVar(&silent, "s", false, "")
flag.BoolVar(&silent, "silent", false, "")

flag.Usage = func() {
	h := []string{
		"Options:",
		"  -q, --query <query>          Search query",
		"  -e, --engine <engine>        Provide search engine (default: Google)",
		"                               (options: Google, Shodan, Bing, Duck, Yahoo, Ask)",
		"  -p, --page <i>               Specify number of pages (default: 1)",
		"  -H, --header <header>        Pass custom header to search engine",
		"  -x, --proxy <proxy_url>      Use proxy to surfing (HTTP/SOCKSv5 proxy)",
		"  -s, --silent                 Silent mode",
		"\n",
	}
	showBanner()
	fmt.Fprintf(os.Stderr, "%s", aurora.Green(strings.Join(h, "\n")))
}
flag.Parse()

engine = strings.ToLower(engine)

maxLog := levels.LevelDebug
if silent {
	maxLog = levels.LevelSilent
}
log.DefaultLogger.SetMaxLevel(maxLog)

showBanner()

// Read proxies from file and store in memory
proxyFile, err := os.Open("proxy.txt")
if err != nil {
	log.Debug().Msgf("Error opening proxy file: %s", err)
	return
}
defer proxyFile.Close()

scanner := bufio.NewScanner(proxyFile)
for scanner.Scan() {
	proxyMux.Lock()
	proxies = append(proxies, scanner.Text())
	proxyMux.Unlock()
}

}

func main() { if isStdin() { sc := bufio.NewScanner(os.Stdin) for sc.Scan() { q := sc.Text() queries = append(queries, q) } } else { if query == "" { log.Fatal().Msgf("Missing required -q flag!") os.Exit(2) }

	queries = []string{query}
}

log.Info().Msgf("Query : %+v", queries)
log.Info().Msgf("Page  : %s", strconv.Itoa(page))
if len(proxies) > 0 {
	log.Info().Msgf("Proxy : %s", "pool")
}
if len(headers) > 0 {
	log.Info().Msgf("Header: [%+v]", headers)
}
log.Info().Msgf("Engine: %s", strings.Title(engine))
log.Warning().Msg("Use at your own risk! Developers assume no responsibility...")
log.Warning().Msg("If your IP address has been blocked by search engine providers or other reason.\n\n")

for _, q := range queries {
	wg.Add(1)
	go func(dork string) {
		defer wg.Done()

		var p string
		if len(proxies) > 0 {
			p = getRandomProxy()
		} else {
			p = proxy
		}

		opts := options{
			Query:   dork,
			Engine:  engine,
			Page:    page,
			Proxy:   p,
			Headers: headers,
		}

		fatal, err := opts.search()
		if err != nil {
			if fatal {
				isError(err)
			}
			log.Warning().Msgf("Something error %s.", err.Error())
		}
	}(q)
}
wg.Wait()

}

func getRandomProxy() string { proxyMux.Lock() defer proxyMux.Unlock() rand.Seed(time.Now().UnixNano()) return proxies[rand.Intn(len(proxies))]

现在想要-x参数只用一个代理改为代理池的形式代理池的地址保存在proxytxt文件中。可以通过读取proxytxt文件获取代理池中的代理地址然后每次查询从代理池中随机选择一个代理地址来进行查询操作其他功能和代码不需要改变给我最后修改后的代码package mainimport 	bufio	flag	fmt	os	strconv	strings	githubcomlogrusorgruaurora

原文地址: https://www.cveoy.top/t/topic/flOc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录