Go 批量下载微信文章中的图片

67 min read
package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/google/uuid"
	"io"
	"log"
	"net/http"
	"os"
	"regexp"
)

func getParams(regEx, url string) (paramsMap map[string]string) {

	var compRegEx = regexp.MustCompile(regEx)
	match := compRegEx.FindStringSubmatch(url)

	paramsMap = make(map[string]string)
	for i, name := range compRegEx.SubexpNames() {
		if i > 0 && i <= len(match) {
			paramsMap[name] = match[i]
		}
	}
	return paramsMap
}

func search(url string) map[string]string {
	r := "var msg_title = '(?P<title>.+)'.html\\(false\\);[\\s\\S]*var cdn_url_1_1 = \"(?P<cover>http.+)\""
	res, err := http.Get(url)
	if err != nil {
		log.Fatal(err)
	}
	defer func(Body io.ReadCloser) {
		err := Body.Close()
		if err != nil {

		}
	}(res.Body)
	if res.StatusCode != 200 {
		log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
	}

	bodyBytes, err := io.ReadAll(res.Body)

	html := string(bodyBytes)

	params := getParams(r, html)
	fmt.Println(params)
	return params

}

func saveImage(imgUrl string, key string) {

	// Get the data
	resp, err := http.Get(imgUrl)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	// 创建一个文件用于保存
	out, err := os.Create("image/" + key + ".jpg")
	if err != nil {
		panic(err)
	}
	defer out.Close()

	// 然后将响应流和文件流对接起来
	_, err = io.Copy(out, resp.Body)
	if err != nil {
		panic(err)
	}
}

func main() {

	r := gin.Default()
	r.Use(Cors())
	r.StaticFS("/image", http.Dir("image"))
	r.GET("/fuck", func(c *gin.Context) {
		url := c.DefaultQuery("url", "url")
		uid := uuid.New()
		key := uid.String()
		m := search(url)
		saveImage(m["cover"], key)
		m["cover"] = "https://fuckweixin.songya.xyz/image/" + key + ".jpg"
		c.JSON(200, gin.H{
			"message": "ok",
			"data":    m,
		})
	})

	err := r.Run(":52447")
	if err != nil {
		return
	}
}

// Cors 开启跨域函数
func Cors() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
		c.Writer.Header().Set("Access-Control-Expose-Headers", "Access-Control-Allow-Origin")
		c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT")

		if c.Request.Method == "OPTIONS" {
			c.AbortWithStatus(204)
			return
		}

		defer func() {
			if err := recover(); err != nil {

			}
		}()

		c.Next()
	}
}