我如何从wigle api按纬度和经度获取所有数据

问题描述 投票:0回答:1

我编写了简单的脚本来使用wigleapiv2从wigle api接收所有数据,绝对是这个端点/api/v2/network/search。但我遇到了问题,我只能收到 1000 个唯一的 ssid。我每次迭代都会更改 URL,并将 URL 放入上一页的 searchAfter 中。我该如何修复它并接收来自特定纬度和经度的所有数据?

这里是第一次迭代 Uri 的示例(https://api.wigle.net/api/v2/network/search?closestLat=12.9&closestLong=1.2&latrange1=1.9&latrange2=1.8&longrange1=1.2&longrange2=1.4

这里是剩余迭代uri的示例(https://api.wigle.net/api/v2/network/search?closestLat=12.9&closestLong=1.2&latrange1=1.9&latrange2=1.8&longrange1=1.2&longrange2=1.4&searchAfter=1976621348&first =1)。对于每次迭代,我都会更改 searchAfter 和first。 如果有人能告诉我哪里做错了,那就太好了:)

我尝试仅使用第一个或搜索后参数,但结果相同。我注意到的一个标记是,当我仅使用 searchAfter 参数时,我只能接收 100 个唯一的 ssid,但是当我同时使用(searchAfter 和第一个)时,我可以接收 1000 个唯一的 ssid。

这是我的 main.go 代码

var (
        wg          = sync.WaitGroup{}
    receiveResp = make(chan []*response.WiFiNetworkWithLocation, 100)

)

func main() {
    startTime := time.Now()

    viper.AddConfigPath(".")
    viper.SetConfigFile("config.json")
    if err := viper.ReadInConfig(); err != nil {
        log.Fatal("error trying read from config: %w", err)
    }

    u := user.NewUser(viper.GetString("users.user.username"),   viper.GetString("users.user.password"))

    db, err := postgres.NewPG()
    if err != nil {
        log.Fatalf("Cannot create postgres connection: %v", err)
    }

    postgres.WG.Add(1)
    go getResponse(u)

    go parseResponse(db)

    postgres.WG.Wait()

    fmt.Printf("Execution time: %v ", time.Since(startTime))
}

func getResponse(u *user.Creds) {
    url := fmt.Sprintf("%s?      closestLat=%s&closestLong=%s&latrange1=%s&latrange2=%s&longrange1=%s&longrange2=%s",
        viper.GetString("wigle.url"),
        viper.GetString("queries.closestLat"),
        viper.GetString("queries.closestLong"),
        viper.GetString("queries.latrange1"),
        viper.GetString("queries.latrange2"),
        viper.GetString("queries.longrange1"),
        viper.GetString("queries.longrange2"),
    )

    j := 0
    i := 0
    for {
         i++

    fmt.Println(url)

    req, err := http.NewRequest("GET", url, bytes.NewBuffer([]byte("")))
    if err != nil {
        log.Printf("Failed wraps request: %v", err)

        continue
    }
    req.SetBasicAuth(u.Username, u.Password)

    c := http.Client{}
    resp, err := c.Do(req)
    if err != nil {
        log.Printf("Failed send request: %v", err)

        continue
    }

    bytes, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Printf("Failed read response body: %v", err)

        continue
    }

    var r response.NetSearchResponse

    if err := json.Unmarshal(bytes, &r); err != nil {
        log.Printf("Failed unmarshal: %v", err)

        continue
    }

    receiveResp <- r.Results

    fmt.Println(r.TotalResults, r.SearchAfter)

    if r.SearchAfter == "" {
        postgres.WG.Done()
        return
    }

    url = fmt.Sprintf("%s?  closestLat=%s&closestLong=%s&latrange1=%s&latrange2=%s&longrange1=%s&longrange2=%s&searchAfter=%s&first=%v"  ,
            viper.GetString("wigle.url"),
        viper.GetString("queries.closestLat"),
        viper.GetString("queries.closestLong"),
        viper.GetString("queries.latrange1"),
        viper.GetString("queries.latrange2"),
        viper.GetString("queries.longrange1"),
        viper.GetString("queries.longrange2"),
        r.SearchAfter,
        i,
    )
    j++

    fmt.Println(j)
}
func parseResponse(db *sql.DB) {
    for {
        select {
        case responses := <-receiveResp:
            clearResponses := make([]response.WiFiNetworkWithLocation, 0, len(responses))

            for _, val := range responses {
                clearResponses = append(clearResponses, *val)
            }
            postgres.WG.Add(1)
            go postgres.SaveToDB(db, "test", clearResponses)
        }
    }
}
go wigle
1个回答
0
投票

“first”不是 WiGLE API 中的参数;没有办法以这种方式增加查询结果的大小。 https://api.wigle.net/swagger#/Network%20search%20and%20information%20tools/search_2是官方的交互式文档。

WiGLE 实施每个帐户的查询限制 - 如果您想增加每日限制,请通过 [email protected]

联系管理员
© www.soinside.com 2019 - 2024. All rights reserved.