在戈兰对多个返回进行迭代



我试图从一个包含域(数量未知(的文本文件中获取输入,然后将每个域用作参数并获取它们的服务器类型。正如预期的那样,这只返回最后一个域。如何迭代多个返回值?下面是代码。//测试包装主

import (
    "bufio"
    "time"
    "os"
    "fmt"
    "net/http"
    //"github.com/gocolly/colly"
)
var Domain string
var Target string
func main() {
    Domain := DomainGrab()
    Target := BannerGrab(Domain)
    //CheckDB if not listed then add else skip
    //RiskDB
    //Email
    fmt.Println(Domain)
    fmt.Println(Target)
}
func BannerGrab(s string) string {
    client := &http.Client{}
    req, err := http.NewRequest("GET", s, nil)
    if err != nil {
    log.Fatalln(err)
    }
    req.Header.Set("User-Agent", "Authac/0.1")
    resp, _ := client.Do(req)
    serverEntry := resp.Header.Get("Server")
    return serverEntry
}
func DomainGrab() string {
    //c := colly.NewCollector()
// Open the file.
    f, _ := os.Open("domains.txt")
    defer f.Close()
    // Create a new Scanner for the file.
    scanner := bufio.NewScanner(f)
    // Loop over all lines in the file and print them.
    for scanner.Scan() {
        line := scanner.Text()
        time.Sleep(2 * time.Second)
        //fmt.Println(line)
        return line
    }
    return Domain
}

如果您想"并发"进行,您将返回一个通道,通过该通道发送您想要返回的多个内容:

https://play.golang.org/p/iYBGPwfYLYR

func DomainGrab() <-chan string {
    ch := make(chan string, 1)
    f, _ := os.Open("domains.txt")
    defer f.Close()
    scanner := bufio.NewScanner(f)
    go func() {
    // Loop over all lines in the file and print them.
        for scanner.Scan() {
            line := scanner.Text()
            time.Sleep(2 * time.Second)
            ch <- line
        }
        close(ch)
    }()
    return ch
}

如果我理解你的问题,你想读取该文件,以某种方式检测该文件被修改,并有一个方法将这些修改发送到客户端代码。

文件不是这样工作的。

你有两个选择:

  1. 使用某些特定于操作系统的API来侦听文件更改-https://www.linuxjournal.com/content/linux-filesystem-events-inotify

  2. 使用无限循环读取文件。读取该文件一次。将副本保存到内存中。在循环中反复读取同一个文件,直到新文件与副本不同,并计算增量。

检查是否可以使用push而不是pull来获取新域。控制文件中域名的系统会直接向您推送数据吗?

如果loop是唯一可能的选项,请在文件读取之间设置一些暂停时间,以减少系统负载。

当您设法获得新域并需要同时处理它们时,请按照@dave的建议使用通道。

可能不是最佳解决方案。但是,我决定去掉一个单独的功能,把它们放在一起,只覆盖更多的领域。我将在下面发布我所期望的代码。现在,我需要解析域,以便根URL和子域只扫描一次。

// Main
package main
import (
    "log"
    "fmt"
    "time"
    "net/http"
    "github.com/gocolly/colly"
)
//var Domain string
var Target string

func main() {
    c := colly.NewCollector()
    c.OnError(func(r *colly.Response, err error) {
        fmt.Println("Request URL:", r.Request.URL, "n Failed with response:", r.StatusCode)
    })
    // Find and visit all links
    c.OnHTML("a", func(e *colly.HTMLElement) {
        e.Request.Visit(e.Attr("href"))
    })
    c.OnRequest(func(r *colly.Request) {
        Domain := r.URL.String()
        Target := BannerGrab(Domain)
        fmt.Println(Domain)
        fmt.Println(Target)
        fmt.Println("Dropping By.. ", r.URL)
        time.Sleep(1000 * time.Millisecond)
    })
    c.Visit("http://www.milliondollarhomepage.com/")
    }
    //CheckDB if not listed else add
    //RiskDB
    //Email

func BannerGrab(s string) string {
    client := &http.Client{}
    req, err := http.NewRequest("GET", s, nil)
        if err != nil {
        log.Fatalln(err)
    }
    req.Header.Set("User-Agent", "Authac/0.1")
    resp, _ := client.Do(req)
    serverEntry := resp.Header.Get("Server")
    return serverEntry
}

相关内容

  • 没有找到相关文章

最新更新