util.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package common
  2. import (
  3. "fmt"
  4. "github.com/go-resty/resty/v2"
  5. "net/http"
  6. "os"
  7. "path"
  8. "regexp"
  9. "strings"
  10. )
  11. // NewHttpClient 新建一个 resty 的对象
  12. func NewHttpClient(_reqParam ...ReqParam) *resty.Client {
  13. //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"
  14. 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"
  15. var reqParam ReqParam
  16. var HttpProxy, UserAgent, Referer string
  17. if len(_reqParam) > 0 {
  18. reqParam = _reqParam[0]
  19. }
  20. if len(reqParam.HttpProxy) > 0 {
  21. HttpProxy = reqParam.HttpProxy
  22. }
  23. if len(reqParam.UserAgent) > 0 {
  24. UserAgent = reqParam.UserAgent
  25. } else {
  26. UserAgent = defUserAgent
  27. }
  28. if len(reqParam.Referer) > 0 {
  29. Referer = reqParam.Referer
  30. }
  31. httpClient := resty.New()
  32. httpClient.SetTimeout(HTMLTimeOut)
  33. if HttpProxy != "" {
  34. httpClient.SetProxy(HttpProxy)
  35. }
  36. httpClient.SetHeaders(map[string]string{
  37. "Content-Type": "application/json",
  38. "User-Agent": UserAgent,
  39. })
  40. if len(Referer) > 0 {
  41. httpClient.SetHeader("Referer", Referer)
  42. }
  43. return httpClient
  44. }
  45. // DownFile 从指定的 url 下载文件
  46. func DownFile(urlStr string, _reqParam ...ReqParam) ([]byte, string, error) {
  47. var reqParam ReqParam
  48. if len(_reqParam) > 0 {
  49. reqParam = _reqParam[0]
  50. }
  51. httpClient := NewHttpClient(reqParam)
  52. resp, err := httpClient.R().Get(urlStr)
  53. if err != nil {
  54. return nil, "", err
  55. }
  56. filename := GetFileName(resp.RawResponse)
  57. return resp.Body(), filename, nil
  58. }
  59. // GetFileName 获取下载文件的文件名
  60. func GetFileName(resp *http.Response) string {
  61. contentDisposition := resp.Header.Get("Content-Disposition")
  62. if len(contentDisposition) == 0 {
  63. return ""
  64. }
  65. re := regexp.MustCompile(`filename=["]*([^"]+)["]*`)
  66. matched := re.FindStringSubmatch(contentDisposition)
  67. if matched == nil || len(matched) == 0 || len(matched[0]) == 0 {
  68. //fmt.Println("######")
  69. return ""
  70. }
  71. return matched[1]
  72. }
  73. // AddBaseUrl 判断驶入的 url 是否需要拼接 baseUrl
  74. func AddBaseUrl(baseUrl, url string) string {
  75. if strings.Contains(url, "://") {
  76. return url
  77. }
  78. return fmt.Sprintf("%s%s", baseUrl, url)
  79. }
  80. func GetDebugFolder() (string, error) {
  81. nowProcessRoot, _ := os.Getwd()
  82. nowProcessRoot = path.Join(nowProcessRoot, DebugFolder)
  83. err := os.MkdirAll(nowProcessRoot, os.ModePerm)
  84. if err != nil {
  85. return "", err
  86. }
  87. return nowProcessRoot, err
  88. }
  89. // ReqParam 可选择传入的参数
  90. type ReqParam struct {
  91. UserExtList []string // 用户确认的视频后缀名支持列表
  92. DebugMode bool // 调试标志位
  93. HttpProxy string // HttpClient 相关
  94. UserAgent string // HttpClient 相关
  95. Referer string // HttpClient 相关
  96. MediaType string // HttpClient 相关
  97. Charset string // HttpClient 相关
  98. Topic int // 搜索结果的时候,返回 Topic N 以内的
  99. }