123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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()
- }
- }
|