get_image.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import os
  2. import time
  3. import requests
  4. import hashlib
  5. import datetime
  6. from dotenv import load_dotenv
  7. from urllib.parse import urlparse
  8. from utils.logger_config import setup_logger
  9. logger = setup_logger(__name__)
  10. load_dotenv()
  11. APP_KEY = os.getenv("IMAGE_GET_APP_KEY")
  12. APP_SECRET = os.getenv("IMAGE_GET_APP_SECRET")
  13. def get_product_image(part_number):
  14. # 基础参数设置
  15. base_url = "http://api01pim.gloria.com.cn"
  16. endpoint = "/pimImgApi/product/img/imgByPartNumber"
  17. # 1. 生成时间戳(格式:YYYY-MM-dd HH:mm:ss)
  18. timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  19. # 2. 生成签名(appKey + appSecret + timestamp 的 MD5)
  20. raw_sign = APP_KEY + APP_SECRET + timestamp
  21. sign = hashlib.md5(raw_sign.encode('utf-8')).hexdigest()
  22. # 3. 设置请求头
  23. headers = {
  24. "appKey": APP_KEY,
  25. "timestamp": timestamp,
  26. "sign": sign
  27. }
  28. # 4. 设置查询参数
  29. params = {"partNumber": part_number}
  30. try:
  31. # 5. 发送GET请求
  32. response = requests.get(
  33. url=f"{base_url}{endpoint}",
  34. headers=headers,
  35. params=params,
  36. timeout=10
  37. )
  38. # 6. 处理响应
  39. if response.status_code == 200:
  40. result = response.json()
  41. if result.get("code") == 200:
  42. return result.get("imgPath").replace("nullproductImg", "http://pim.gloria.com.cn/productImg")
  43. else:
  44. logger.info(f"接口返回错误: {result.get('msg')} (代码: {result.get('code')})")
  45. return None
  46. else:
  47. logger.info(f"HTTP错误: {response.status_code}")
  48. return None
  49. except Exception as e:
  50. logger.info(f"请求异常: {str(e)}")
  51. return None
  52. def download_image(image_url, filename, save_dir="./data/sku_image/"):
  53. """
  54. 根据图片 URL 下载图片到本地
  55. :param image_url: 图片的 URL
  56. :param save_dir: 保存图片的目录,默认为当前目录下的 "images" 文件夹
  57. :param filename: 自定义文件名(可选),如果不提供则从 URL 中提取
  58. :return: 下载图片的完整路径,如果失败返回 None
  59. """
  60. try:
  61. # 确保保存目录存在
  62. os.makedirs(save_dir, exist_ok=True)
  63. # 发送 HTTP 请求获取图片
  64. response = requests.get(image_url, stream=True, timeout=10)
  65. response.raise_for_status() # 检查请求是否成功
  66. # 确定文件名
  67. filename += '.png'
  68. # 构建完整保存路径
  69. save_path = os.path.join(save_dir, filename)
  70. # 保存图片
  71. with open(save_path, 'wb') as f:
  72. for chunk in response.iter_content(chunk_size=8192):
  73. f.write(chunk)
  74. logger.info(f"图片已保存至: {save_path}")
  75. return save_path
  76. except requests.exceptions.RequestException as e:
  77. logger.info(f"下载图片失败: {e}")
  78. return None
  79. except Exception as e:
  80. logger.info(f"发生错误: {e}")
  81. return None
  82. def get_sku_image(product_number):
  83. image_url = get_product_image(product_number)
  84. logger.info(f"获取到图片公链:{image_url}")
  85. save_path = download_image(image_url, product_number)
  86. return {
  87. "image_url": image_url,
  88. "image_path": save_path
  89. }
  90. if __name__ == "__main__":
  91. # 替换为您的实际款号
  92. PRODUCT_NUMBER = "195A9M05J06D"
  93. # # 调用接口获取图片路径
  94. # image_url = get_product_image(PRODUCT_NUMBER)
  95. # if image_url:
  96. # logger.info(f"✅ 商品图片获取成功: {image_url}")
  97. # else:
  98. # logger.info("❌ 获取商品图片失败")
  99. # print(download_image(image_url, "test.png"))
  100. print(get_sku_image(PRODUCT_NUMBER))