package main import ( "encoding/base64" "encoding/json" "fmt" "io/ioutil" "net" "net/http" "time" ) const ( watchInterval = 10 base64Table = "ABNOPqrceQRSTklmUDEFGXYZabnopfghHVWdijstuvwCIJKLMxyz0123456789+/" ) var ( coder = base64.NewEncoding(base64Table) ) // reloadProxies 重新加载代理池 func reloadProxies() { fmt.Print("请求远程proxy service") resp, err := http.Get("http://proxy.spdata.jianyu360.com/proxy/getallip") if err != nil { fmt.Print(err.Error()) return } bs, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Print(err.Error()) return } resp.Body.Close() data := make([]*IpItem, 0, 0) newPool := make([]*IpItem, 0, 0) err = json.Unmarshal(bs, &data) if err != nil { fmt.Print(err.Error()) return } index := 0 //5分钟以内过期的都不要 lifeTimieout := time.Now().Unix() + 5*60 for _, v := range data { fmt.Print(">") if v.LifeTime <= lifeTimieout { fmt.Print("O") continue } rawIp, err := coder.DecodeString(v.Ip) if err != nil { continue } ipStr := string(rawIp) v.Ip = ipStr for _, p := range v.Ports { addr := ipStr + ":" + p if checkDial(addr) { fmt.Print("+") v.Raw = addr break } else { fmt.Print("?") } } if v.Raw != "" { v.Index = index index += 1 newPool = append(newPool, v) } } if len(newPool) > 0 { roulette.Init(newPool) fmt.Printf("--{proxy size %d}--", roulette.Length) } else { fmt.Print("远程服务没有返回有效proxy") } } // checkDial 检查是否能tcp连接通 func checkDial(addr string) bool { conn, err := net.DialTimeout("tcp", addr, 1*time.Second) if err == nil { conn.Close() } return err == nil } func watch() { for { time.Sleep(time.Duration(int64(watchInterval)) * time.Minute) reloadProxies() } }