settings.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. # -*- coding: utf-8 -*-
  2. # Author : Charley
  3. # Python : 3.8.10
  4. # Date : 2025/4/14 11:58
  5. import inspect
  6. import requests
  7. from loguru import logger
  8. from tenacity import retry, stop_after_attempt, wait_fixed
  9. logger.remove()
  10. logger.add("./logs/{time:YYYYMMDD}.log", encoding='utf-8', rotation="00:00",
  11. format="[{time:YYYY-MM-DD HH:mm:ss.SSS}] {level} {message}",
  12. level="DEBUG", retention="7 day")
  13. HEADERS = {
  14. "User-Agent": "Dart/3.6 (dart:io)"
  15. }
  16. def after_log(retry_state):
  17. """
  18. retry 回调
  19. :param retry_state: RetryCallState 对象
  20. """
  21. # 检查 args 是否存在且不为空
  22. if retry_state.args and len(retry_state.args) > 0:
  23. log = retry_state.args[0] # 获取传入的 logger
  24. else:
  25. log = logger # 使用全局 logger
  26. if retry_state.outcome.failed:
  27. log.warning(
  28. f"Function '{retry_state.fn.__name__}', Attempt {retry_state.attempt_number} Times")
  29. else:
  30. log.info(f"Function '{retry_state.fn.__name__}', Attempt {retry_state.attempt_number} succeeded")
  31. @retry(stop=stop_after_attempt(5), wait=wait_fixed(1), after=after_log)
  32. def get_proxys(log):
  33. """
  34. 获取代理
  35. :return: 代理
  36. """
  37. tunnel = "x371.kdltps.com:15818"
  38. kdl_username = "t13753103189895"
  39. kdl_password = "o0yefv6z"
  40. try:
  41. proxies = {
  42. "http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": kdl_username, "pwd": kdl_password, "proxy": tunnel},
  43. "https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": kdl_username, "pwd": kdl_password, "proxy": tunnel}
  44. }
  45. return proxies
  46. except Exception as e:
  47. log.error(f"Error getting proxy: {e}")
  48. raise e
  49. @retry(stop=stop_after_attempt(5), wait=wait_fixed(1), after=after_log)
  50. def make_request(log, method, url, params=None, data=None, headers=None, proxies=None, timeout=22, token=None):
  51. """
  52. 通用请求函数
  53. :param log: logger对象
  54. :param method: 请求方法 ('GET' 或 'POST')
  55. :param url: 请求的URL
  56. :param params: GET请求的查询参数
  57. :param data: POST请求的数据
  58. :param headers: 请求头
  59. :param proxies: 代理
  60. :param timeout: 请求超时时间
  61. :param token: token
  62. :return: 响应的JSON数据
  63. """
  64. if not log:
  65. log = logger
  66. if headers is None:
  67. headers = HEADERS
  68. if not token:
  69. token = "a-2df1084f01cb48f2ab67806867fea37f"
  70. headers["authorization"] = token
  71. if proxies is None:
  72. proxies = get_proxys(log)
  73. try:
  74. with requests.Session() as session:
  75. if method.upper() == 'GET':
  76. response = session.get(url, headers=headers, params=params, proxies=proxies, timeout=timeout)
  77. elif method.upper() == 'POST':
  78. response = session.post(url, headers=headers, json=data, proxies=proxies, timeout=timeout)
  79. else:
  80. log.error(f"Unsupported request method: {method}")
  81. return {}
  82. response.raise_for_status()
  83. data = response.json()
  84. if data["code"] == 200:
  85. log.info(f"Successfully fetched {method} request to {url}")
  86. return data
  87. else:
  88. log.warning(f"Warning {inspect.currentframe().f_code.co_name}: {data['msg']}")
  89. return {}
  90. except requests.exceptions.RequestException as e:
  91. log.error(f"Error making {method} request to {url}: {e}")
  92. raise e
  93. except ValueError as e:
  94. log.error(f"Error parsing JSON for {method} request to {url}: {e}")
  95. raise e
  96. except Exception as e:
  97. log.error(f"Error making {method} request to {url}: {e}")
  98. raise e