package server import ( "fmt" "log" "net/http" "regexp" "strings" "github.com/fengxxc/wechatmp2markdown/format" "github.com/fengxxc/wechatmp2markdown/parse" "github.com/fengxxc/wechatmp2markdown/util" ) func Start(addr string) { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { rawQuery := r.URL.RawQuery paramsMap := parseParams(rawQuery) // url param wechatmpURL := paramsMap["url"] fmt.Printf("accept url: %s\n", wechatmpURL) imageArgValue := paramsMap["image"] fmt.Printf(" image: %s\n", imageArgValue) imagePolicy := parse.ImageArgValue2ImagePolicy(imageArgValue) if wechatmpURL == "" { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(defHTML)) return } w.Header().Set("Content-Type", "application/octet-stream") var articleStruct parse.Article = parse.ParseFromURL(wechatmpURL, imagePolicy) title := articleStruct.Title.Val.(string) mdString, saveImageBytes := format.Format(articleStruct) if len(saveImageBytes) > 0 { w.Header().Set("Content-Disposition", "attachment; filename="+title+".zip") saveImageBytes[title] = []byte(mdString) util.HttpDownloadZip(w, saveImageBytes) } else { w.Header().Set("Content-Disposition", "attachment; filename="+title+".md") w.Write([]byte(mdString)) } }) fmt.Printf("wechatmp2markdown server listening on %s\n", addr) if err := http.ListenAndServe(addr, nil); err != nil { log.Fatal(err) } } var defHTML string = ` wechatmp2markdown

wechatmp2markdown

` func parseParams(rawQuery string) map[string]string { result := make(map[string]string) reg := regexp.MustCompile(`(&?image=)([a-z]+)`) matcheImage := reg.FindStringSubmatch(rawQuery) var urlParamFull string = rawQuery if len(matcheImage) > 1 { // 有image参数 imageParamFull := matcheImage[0] urlParamFull = strings.Replace(rawQuery, imageParamFull, "", 1) if len(matcheImage) > 2 { imageParamVal := matcheImage[2] result["image"] = imageParamVal } } regUrl := regexp.MustCompile(`(&?url=)(.+)`) matcheUrl := regUrl.FindStringSubmatch(urlParamFull) if len(matcheUrl) > 2 { urlParamVal := matcheUrl[2] result["url"] = urlParamVal } return result }