util.go 4.2 KB

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