Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

114 lignes
2.6KB

  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "io/ioutil"
  8. "log"
  9. "net/http"
  10. "net/url"
  11. "os"
  12. "strconv"
  13. "time"
  14. )
  15. func saveURL(url string) (tmpFile string, contentType string, err error) {
  16. log.Println("saveURL: " + url)
  17. var myClient = &http.Client{Timeout: 20 * time.Second}
  18. r, err := myClient.Get(url)
  19. if err != nil {
  20. log.Fatal("Fail to get URL:" + url)
  21. log.Fatal(err)
  22. return "", "", err
  23. }
  24. defer r.Body.Close()
  25. contentType = r.Header.Get("Content-Type")
  26. contentLen := r.Header.Get("Content-Length")
  27. len, _ := strconv.Atoi(contentLen)
  28. log.Println(r)
  29. file, err := ioutil.TempFile(os.TempDir(), "wechat_hitxy_")
  30. // Use io.Copy to just dump the response body to the file. This supports huge files
  31. _, err = io.Copy(file, r.Body)
  32. if err != nil {
  33. log.Println(err)
  34. return "", contentType, err
  35. }
  36. tmpFile = file.Name()
  37. file.Close()
  38. //see if its a video url
  39. if len < 4096 && contentType == "text/plain" {
  40. u := readVideoURL(tmpFile)
  41. if u != "" {
  42. fmt.Println("saveing video url: " + u)
  43. os.Remove(tmpFile) //remove json file
  44. tmpFile, contentType, err = saveURL(u)
  45. }
  46. }
  47. return
  48. }
  49. func contentType2MediaType(contentType string) (mediaType string) {
  50. switch contentType {
  51. case "image/jpeg":
  52. mediaType = "image"
  53. case "text/plain":
  54. mediaType = "json"
  55. }
  56. return
  57. }
  58. //{"video_url":"http://153.37.232.145/vweixinp.tc.qq.com/1007_6475d21fb443453b8adeac7e59cc0e1c.f10.mp4?vkey=E79C6B0DA06E7A434D15E24774F91412386D1956768C400AC93ECA5320ACAAAF050E1E1BA5C22DFD81B5EE3FBA97E928E0FC2DC597CF611B3E6641BC1AEE2892736FFE29E993F200AA4A0811FEB4E234C48516131207DDE4&sha=0&save=1"}
  59. type videoURL struct {
  60. VideoURL string `json:"video_url"`
  61. }
  62. //readVideoURL try to read a file into json structure
  63. //containing video_url
  64. //
  65. func readVideoURL(path string) (u string) {
  66. body, err := ioutil.ReadFile(path)
  67. if err == nil {
  68. var v = videoURL{}
  69. err = json.Unmarshal([]byte(body), &v)
  70. if err == nil {
  71. _, err = url.ParseRequestURI(v.VideoURL)
  72. if err == nil {
  73. return v.VideoURL
  74. }
  75. }
  76. }
  77. return ""
  78. }
  79. func getNewList() (jstr string) {
  80. var jsonStr = []byte(`{"type":"news", "offset":0, "count":20}`)
  81. u := url4NewsList()
  82. req, err := http.NewRequest("POST", u, bytes.NewBuffer(jsonStr))
  83. log.Println(u)
  84. if err != nil {
  85. return ""
  86. }
  87. client := &http.Client{}
  88. r, err := client.Do(req)
  89. if err != nil {
  90. return ""
  91. }
  92. defer r.Body.Close()
  93. b, _ := ioutil.ReadAll(r.Body)
  94. jstr = string(b)
  95. return
  96. }
  97. func url4NewsList() string {
  98. atk, _ := GetAccessToken()
  99. u := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=%s", atk)
  100. return u
  101. }