util.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package common
  2. import (
  3. "fmt"
  4. "github.com/go-resty/resty/v2"
  5. "io"
  6. "io/ioutil"
  7. "net/http"
  8. "os"
  9. "path"
  10. "regexp"
  11. "strings"
  12. )
  13. // NewHttpClient 新建一个 resty 的对象
  14. func NewHttpClient(_reqParam ...ReqParam) *resty.Client {
  15. //const defUserAgent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
  16. const defUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.41"
  17. var reqParam ReqParam
  18. var HttpProxy, UserAgent, Referer string
  19. if len(_reqParam) > 0 {
  20. reqParam = _reqParam[0]
  21. }
  22. if len(reqParam.HttpProxy) > 0 {
  23. HttpProxy = reqParam.HttpProxy
  24. }
  25. if len(reqParam.UserAgent) > 0 {
  26. UserAgent = reqParam.UserAgent
  27. } else {
  28. UserAgent = defUserAgent
  29. }
  30. if len(reqParam.Referer) > 0 {
  31. Referer = reqParam.Referer
  32. }
  33. httpClient := resty.New()
  34. httpClient.SetTimeout(HTMLTimeOut)
  35. if HttpProxy != "" {
  36. httpClient.SetProxy(HttpProxy)
  37. }
  38. httpClient.SetHeaders(map[string]string{
  39. "Content-Type": "application/json",
  40. "User-Agent": UserAgent,
  41. })
  42. if len(Referer) > 0 {
  43. httpClient.SetHeader("Referer", Referer)
  44. }
  45. return httpClient
  46. }
  47. // DownFile 从指定的 url 下载文件
  48. func DownFile(urlStr string, _reqParam ...ReqParam) ([]byte, string, error) {
  49. var reqParam ReqParam
  50. if len(_reqParam) > 0 {
  51. reqParam = _reqParam[0]
  52. }
  53. httpClient := NewHttpClient(reqParam)
  54. resp, err := httpClient.R().Get(urlStr)
  55. if err != nil {
  56. return nil, "", err
  57. }
  58. filename := GetFileName(resp.RawResponse)
  59. return resp.Body(), filename, nil
  60. }
  61. // GetFileName 获取下载文件的文件名
  62. func GetFileName(resp *http.Response) string {
  63. contentDisposition := resp.Header.Get("Content-Disposition")
  64. if len(contentDisposition) == 0 {
  65. return ""
  66. }
  67. re := regexp.MustCompile(`filename=["]*([^"]+)["]*`)
  68. matched := re.FindStringSubmatch(contentDisposition)
  69. if matched == nil || len(matched) == 0 || len(matched[0]) == 0 {
  70. //fmt.Println("######")
  71. return ""
  72. }
  73. return matched[1]
  74. }
  75. // AddBaseUrl 判断驶入的 url 是否需要拼接 baseUrl
  76. func AddBaseUrl(baseUrl, url string) string {
  77. if strings.Contains(url, "://") {
  78. return url
  79. }
  80. return fmt.Sprintf("%s%s", baseUrl, url)
  81. }
  82. func GetDebugFolder() (string, error) {
  83. if defDebugFolder == "" {
  84. nowProcessRoot, _ := os.Getwd()
  85. nowProcessRoot = path.Join(nowProcessRoot, DebugFolder)
  86. err := os.MkdirAll(nowProcessRoot, os.ModePerm)
  87. if err != nil {
  88. return "", err
  89. }
  90. defDebugFolder = nowProcessRoot
  91. return nowProcessRoot, err
  92. }
  93. return defDebugFolder, nil
  94. }
  95. func GetTmpFolder() (string, error) {
  96. if defTmpFolder == "" {
  97. nowProcessRoot, _ := os.Getwd()
  98. nowProcessRoot = path.Join(nowProcessRoot, TmpFolder)
  99. err := os.MkdirAll(nowProcessRoot, os.ModePerm)
  100. if err != nil {
  101. return "", err
  102. }
  103. defTmpFolder = nowProcessRoot
  104. return nowProcessRoot, err
  105. }
  106. return defTmpFolder, nil
  107. }
  108. func ClearTmpFolder() error {
  109. nowTmpFolder, err := GetTmpFolder()
  110. if err != nil {
  111. return err
  112. }
  113. pathSep := string(os.PathSeparator)
  114. files, err := ioutil.ReadDir(nowTmpFolder)
  115. if err != nil {
  116. return err
  117. }
  118. for _, curFile := range files {
  119. fullPath := nowTmpFolder + pathSep + curFile.Name()
  120. if curFile.IsDir() {
  121. err = os.RemoveAll(fullPath)
  122. if err != nil {
  123. return err
  124. }
  125. } else {
  126. // 这里就是文件了
  127. err = os.Remove(fullPath)
  128. if err != nil {
  129. return err
  130. }
  131. }
  132. }
  133. return nil
  134. }
  135. func CopyFile(dstName, srcName string) (written int64, err error) {
  136. src, err := os.Open(srcName)
  137. if err != nil {
  138. return
  139. }
  140. defer src.Close()
  141. dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
  142. if err != nil {
  143. return
  144. }
  145. defer dst.Close()
  146. return io.Copy(dst, src)
  147. }
  148. var (
  149. defDebugFolder = ""
  150. defTmpFolder = ""
  151. )
  152. // ReqParam 可选择传入的参数
  153. type ReqParam struct {
  154. UserExtList []string // 用户确认的视频后缀名支持列表
  155. DebugMode bool // 调试标志位
  156. HttpProxy string // HttpClient 相关
  157. UserAgent string // HttpClient 相关
  158. Referer string // HttpClient 相关
  159. MediaType string // HttpClient 相关
  160. Charset string // HttpClient 相关
  161. Topic int // 搜索结果的时候,返回 Topic N 以内的
  162. }