package main import ( "encoding/json" "fmt" "io" "io/ioutil" "log" "net/http" "net/url" "os" "strconv" "time" ) func saveURL(url string) (tmpFile string, contentType string, err error) { log.Println("saveURL: " + url) var myClient = &http.Client{Timeout: 20 * time.Second} r, err := myClient.Get(url) if err != nil { log.Fatal("Fail to get URL:" + url) log.Fatal(err) return "", "", err } defer r.Body.Close() contentType = r.Header.Get("Content-Type") contentLen := r.Header.Get("Content-Length") len, _ := strconv.Atoi(contentLen) log.Println(r) file, err := ioutil.TempFile(os.TempDir(), "wechat_hitxy_") // Use io.Copy to just dump the response body to the file. This supports huge files _, err = io.Copy(file, r.Body) if err != nil { log.Println(err) return "", contentType, err } tmpFile = file.Name() file.Close() //see if its a video url if len < 4096 && contentType == "text/plain" { u := readVideoURL(tmpFile) if u != "" { fmt.Println("saveing video url: " + u) os.Remove(tmpFile) //remove json file tmpFile, contentType, err = saveURL(u) } } return } func contentType2MediaType(contentType string) (mediaType string) { switch contentType { case "image/jpeg": mediaType = "image" case "text/plain": mediaType = "json" } return } //{"video_url":"http://153.37.232.145/vweixinp.tc.qq.com/1007_6475d21fb443453b8adeac7e59cc0e1c.f10.mp4?vkey=E79C6B0DA06E7A434D15E24774F91412386D1956768C400AC93ECA5320ACAAAF050E1E1BA5C22DFD81B5EE3FBA97E928E0FC2DC597CF611B3E6641BC1AEE2892736FFE29E993F200AA4A0811FEB4E234C48516131207DDE4&sha=0&save=1"} type videoURL struct { VideoURL string `json:"video_url"` } //readVideoURL try to read a file into json structure //containing video_url // func readVideoURL(path string) (u string) { body, err := ioutil.ReadFile(path) if err == nil { var v = videoURL{} err = json.Unmarshal([]byte(body), &v) if err == nil { _, err = url.ParseRequestURI(v.VideoURL) if err == nil { return v.VideoURL } } } return "" }