netflix.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package cmd
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "net/http/cookiejar"
  7. "net/url"
  8. "strings"
  9. "time"
  10. )
  11. // CheckAvailableCountry 判断当前区域能否播放指定的netflix url
  12. func CheckAvailableCountry(cookies []*http.Cookie, netflixUrl, ProxyOnOff, proxyUrl string) (bool, error) {
  13. var err error
  14. transport := &http.Transport{}
  15. //是否使用代码的开关
  16. if ProxyOnOff == "on" {
  17. //根据参数判断是否需要设置proxy
  18. proxy, err := url.Parse(proxyUrl)
  19. if err != nil {
  20. log.Printf("proxy url parse error : %v \n", err)
  21. return false, err
  22. }
  23. transport.Proxy = http.ProxyURL(proxy)
  24. }
  25. //new个cookiejar罐子
  26. jar, err := cookiejar.New(nil)
  27. if err != nil {
  28. log.Printf("cookiejar New error : %v\n", err)
  29. return false, err
  30. }
  31. //原生的url,orz
  32. parseUrl, err := url.Parse(netflixUrl)
  33. if err != nil {
  34. log.Printf("netflixUrl Parse error : %v\n", err)
  35. }
  36. //fmt.Printf("parseUrl===>%v\n", parseUrl)
  37. //把传入的cookies装入罐
  38. jar.SetCookies(parseUrl, cookies)
  39. //初始化请求
  40. client := &http.Client{Jar: jar, Transport: transport, Timeout: 15 * time.Second}
  41. req, _ := http.NewRequest("GET", netflixUrl, nil)
  42. //请求加入头部
  43. req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36")
  44. // todo 检测跳转
  45. //client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
  46. // println(len(via))
  47. // return http.ErrUseLastResponse
  48. //}
  49. //发出请求
  50. resp, err := client.Do(req)
  51. defer func() {
  52. if err1 := recover(); err1 != nil {
  53. XWarning(fmt.Sprintf("connect to the netflix faild %v\n", err1))
  54. err = fmt.Errorf("connect to the netflix faild %v\n", err1)
  55. }
  56. }()
  57. if err != nil {
  58. XWarning(fmt.Sprintf("client.Do error : %v\n", err))
  59. return false, err
  60. }
  61. //根据response的url是否包含某些字符串,判断是否跳转
  62. if strings.Contains(resp.Request.URL.RequestURI(), "/watch/0") == true {
  63. return false, nil
  64. }
  65. defer resp.Body.Close()
  66. return true, nil
  67. }