You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wigle API按经纬度获取全量数据遇分页限制,如何解决?

问题:Wigle API v2分页获取全量Wi-Fi数据失败,仅能拿到1000条唯一SSID

问题详情

我用Go编写脚本调用Wigle API v2的/api/v2/network/search端点,想要按指定经纬度范围获取全量Wi-Fi数据,但目前最多只能获取1000个唯一SSID。当前尝试通过迭代更新URL中的searchAfter参数(搭配first参数)实现分页,但单独使用searchAfter只能拿到100条数据,单独用first参数最多拿到1000条,两种方式组合也无法获取全量结果。

请求URL示例

  • 首次请求:
    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
    
  • 后续分页请求:
    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
    

我的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)
        }
    }
}

内容的提问来源于stack exchange,提问作者alemax1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:50:16