├── README.md └── main.go /README.md: -------------------------------------------------------------------------------- 1 | #### Golang爬取妹子图 自拍系列(颜值高) 2 | *** 3 | ##### 编译源码 4 | 5 | > 1. 下载Go语言安装包并安装 6 | > 7 | > https://go.dev/ (官网) 8 | > 9 | > https://studygolang.com/dl (镜像站) 10 | > 11 | > 2. 配置Go语言环境 12 | > 13 | > * cmd执行命令 14 | > 15 | > ```bash 16 | > go env -w GO111MODULE=on 17 | > go env -w GOPROXY=https://goproxy.cn,direct 18 | > ``` 19 | > 20 | > 3. 编译 21 | > 22 | > * 打开cmd进入源码目录(也可以直接在源码所在目录的地址栏,输入cmd) 23 | > 24 | > * cmd执行命令 25 | > 26 | > ```bash 27 | > go build main.go 28 | > ``` 29 | > 30 | > 31 | 32 | 33 |  34 |  35 |  36 |  37 | 38 |  39 |  40 |  41 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "io/ioutil" 6 | "net/http" 7 | "os" 8 | "path/filepath" 9 | "regexp" 10 | "strings" 11 | "time" 12 | ) 13 | 14 | var client = &http.Client{} 15 | var referer string 16 | 17 | func getData(url string) (*[]byte, string) { 18 | req, _ := http.NewRequest("GET", url, nil) 19 | req.Header.Set("user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Mobile Safari/537.36") 20 | req.Header.Set("referer", referer) 21 | resp, err := client.Do(req) 22 | if err != nil { 23 | fmt.Println("404 请求失败!") 24 | return nil, "404" 25 | } 26 | defer resp.Body.Close() 27 | body, _ := ioutil.ReadAll(resp.Body) 28 | return &body, resp.Status[:3] 29 | } 30 | 31 | // 下载计数 32 | var count int 33 | 34 | func saveImage(urlList *[]string, dir string) { 35 | for i, v := range *urlList { 36 | path := dir + fmt.Sprintf("%03d.jpg ", i + 1) 37 | count++ 38 | fmt.Printf("%d %s", count, path) 39 | if _, err := os.Stat(path); err == nil { 40 | fmt.Printf("已下载\n") 41 | continue 42 | } 43 | resp, _ := getData(v) 44 | // 空数据就不写入 45 | if *resp == nil { 46 | continue 47 | } 48 | f, err := os.Create(path) 49 | if err != nil { 50 | fmt.Println("图片保存失败!") 51 | continue 52 | } 53 | defer f.Close() 54 | f.Write(*resp) 55 | fmt.Println("下载成功") 56 | } 57 | } 58 | 59 | // 检测版本 60 | func init() { 61 | const version = "v1.0.2" 62 | url := "https://docs.qq.com/dop-api/opendoc?id=DT3F6UmhxS3VaQXZ1&normal=1" 63 | resp, err := http.Get(url) 64 | if err != nil { 65 | fmt.Println("版本检测错误!") 66 | time.Sleep(5 * time.Second) 67 | os.Exit(1) 68 | } 69 | defer resp.Body.Close() 70 | body, _ := ioutil.ReadAll(resp.Body) 71 | re := regexp.MustCompile("loli{(.+?),(.+?),(.+?)}loli") 72 | res := re.FindAllSubmatch(body, -1) 73 | ver := string(res[0][1]) 74 | updateContent := string(res[0][2]) 75 | link := string(res[0][3]) 76 | if ver != version { 77 | fmt.Printf("当前版本:%s\n最新版本:%s\n更新内容:%s\n%s\n", version, ver, updateContent, link) 78 | time.Sleep(5 * time.Second) 79 | os.Exit(1) 80 | } 81 | } 82 | 83 | func main() { 84 | var url string 85 | // 匹配分类 标题 图集链接数据 86 | re := regexp.MustCompile(`rel="category">#(.+?)#[\s\S]+?_blank">(.+?)[\s\S]+?