iplistget/sources/antizapret.go

61 lines
1.0 KiB
Go

package sources
import (
"bufio"
"bytes"
"io"
"git.veenee.ru/veenee/iplistget/common"
"net"
"strings"
)
func init() {
common.RegisterSource(Antizapret{URL: "https://api.antizapret.info/group.php?data=ip"})
}
type Antizapret struct {
URL string
}
func (s Antizapret) Get(url string) ([]net.IPNet, error) {
if url != "" {
s.URL = url
}
data, err := common.FetchURL(s.URL)
if err != nil {
return nil, err
}
ipmap := map[string]bool{}
br := bytes.NewReader(data)
reader := bufio.NewReader(br)
for {
line, err := reader.ReadString('\n')
ips := strings.Split(line, ",")
for ipk := range ips {
// Add /32 prefix if no exist, then add to the map
ip := strings.Trim(ips[ipk], "\n, ")
if !strings.Contains(ip, "/") {
ip += "/32"
}
ipmap[ip] = true
}
if err == io.EOF {
break
}
}
iplist := make([]net.IPNet, 0, len(ipmap))
for key, _ := range ipmap {
if _, ipnet, err := net.ParseCIDR(key); err == nil {
iplist = append(iplist, *ipnet)
}
}
return iplist, nil
}