算法暴露接口(xhs、dy、ks、wx、hnw)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
4.1 KiB

7 months ago
7 months ago
7 months ago
  1. import json
  2. import random
  3. import aiohttp
  4. import requests
  5. from aiohttp import FormData
  6. from loguru import logger
  7. import functools, time
  8. def retry(exceptions: (BaseException, tuple, list)=BaseException,
  9. max_retries: int = 2,
  10. delay: int = 1,
  11. sleep=time.sleep,
  12. if_result=None):
  13. """
  14. :param exceptions:
  15. :param max_retries:
  16. :param delay:
  17. :param sleep: time.sleep
  18. :param if_result:
  19. :return:
  20. """
  21. if not isinstance(exceptions, (tuple, list)):
  22. new_exceptions = [exceptions]
  23. else:
  24. new_exceptions = exceptions
  25. def init_retry(func, count, *args, **kwargs):
  26. if count > max_retries:
  27. return
  28. try:
  29. if if_result:
  30. # print(f"重拾次数 is {count}")
  31. return call(func, if_result, *args, **kwargs)
  32. return func(*args, **kwargs)
  33. except tuple(new_exceptions) as e:
  34. # print("重试")
  35. # traceback.print_exc()
  36. if count < max_retries:
  37. sleep(delay)
  38. return init_retry(func, count+1, *args, **kwargs)
  39. else:
  40. raise e
  41. def call(func, if_result, *args, **kwargs):
  42. val = func(*args, **kwargs)
  43. if if_result(*val):
  44. return val
  45. raise Exception("The result is not as expected!")
  46. def decorator(func):
  47. @functools.wraps(func)
  48. def wrapped(*args, **kwargs):
  49. return init_retry(func, 0, *args, **kwargs)
  50. return wrapped
  51. return decorator
  52. def cost_time(func):
  53. """
  54. :param func:
  55. :return:
  56. """
  57. @functools.wraps(func)
  58. def wrapper(*args, **kwargs):
  59. start_time = time.time()
  60. result = func(*args, **kwargs)
  61. logger.info(f"{func.__name__} 请求耗时:{time.time() - start_time}")
  62. return result
  63. return wrapper
  64. def retry_if_result_none(status, content):
  65. if status == 200:
  66. return True
  67. return False
  68. @retry(max_retries=3, delay=1, if_result=retry_if_result_none)
  69. def download_q(url, headers, cookies, data=None, is_proxy=False, timeout=10):
  70. """
  71. :param url:
  72. :param headers:
  73. :param cookies:
  74. :param data:
  75. :param is_proxy:
  76. :param timeout:
  77. :return:
  78. """
  79. proxy = f"" # TOdO: 修改代理
  80. proxies = {'http': proxy, 'https': proxy} # 代理初始化
  81. try:
  82. if data:
  83. if is_proxy:
  84. response = requests.post(url, headers=headers, data=data, proxies=proxies, cookies=cookies, timeout=timeout)
  85. else:
  86. response = requests.post(url, headers=headers, data=data, cookies=cookies, timeout=timeout)
  87. else:
  88. if is_proxy:
  89. response = requests.get(url, headers=headers, proxies=proxies, cookies=cookies, timeout=timeout)
  90. else:
  91. response = requests.get(url, headers=headers, cookies=cookies, timeout=timeout)
  92. status = response.status_code
  93. except Exception as e:
  94. response = None
  95. status = 0
  96. logger.error(f"download {e}")
  97. # print(response)
  98. return status, response
  99. async def upload_file(file_path, content, url=""): # TODO:go-fast
  100. """
  101. :param file_path:
  102. :param url:
  103. :return:
  104. """
  105. if file_path:
  106. # timeout = aiohttp.ClientTimeout(total=30)
  107. async with aiohttp.ClientSession() as session:
  108. data = FormData()
  109. data.add_field("file", content, filename=file_path, content_type='multipart/form-data;charset=utf-8"')
  110. data.add_field("output", "json")
  111. async with session.post(url, data=data) as response:
  112. result = await response.text() # 返回结果为json字符串
  113. result = json.loads(result)
  114. logger.info(f"upload file {result}")
  115. if 'url' in result.keys():
  116. video_path = result['url']
  117. return video_path
  118. else:
  119. raise Exception
  120. else:
  121. raise Exception