api_service.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. from agent.agent import Agent
  2. from db import MongoDao
  3. import json5
  4. from model import ClipModelInference, ClipCompareModelInference
  5. from utils.utils import load_image_from_url, load_image_from_cos
  6. import pandas as pd
  7. license_dao = MongoDao("ProductStandard")
  8. # license_infernece = ClipModelInference('全棉时代')
  9. license_infernece = ClipCompareModelInference()
  10. class ApiService:
  11. agent = Agent()
  12. @staticmethod
  13. def keyword_judgement(url_data, basic_data):
  14. """关键词引流判断"""
  15. if url_data['title'] == None or url_data['brand_name'] == None or basic_data['brand_name'] == None or len(url_data['product_images']) == 0:
  16. return '信息不全,无法判定'
  17. # 标题判定
  18. if basic_data['brand_name'] in url_data['title'] and url_data['brand_name'] != basic_data['brand_name']:
  19. # 当产品名称中包含与判定商标一致的品牌名称,且详情页中的品牌名称与判定的品牌名称不一致时判定为关键词引流
  20. return True
  21. if url_data['brand_name'] == basic_data['brand_name'] and basic_data['brand_name'] in url_data['title']:
  22. """商品信息中的商品名称、品牌名称于基础数据中的商标名称完全一致时,使用图像判定"""
  23. # 判断商标
  24. logos_info = json5.loads(ApiService.agent.get_log_from_product_images(url_data['product_images']))
  25. if logos_info['is_contained_logo']:
  26. for log_name in logos_info['logo_infos']:
  27. # if log_name.strip() != basic_data['brand_name'] and log_name.strip() != 'LI-NING':
  28. # return True
  29. if log_name.strip() != basic_data['brand_name'] and log_name.strip() != 'Purcotton':
  30. print(f"brand_name:{basic_data['brand_name']}")
  31. print(f"log_name:{log_name}")
  32. return True
  33. # 与授权商品对比
  34. # similarity_judgement = json5.loads(ApiService.agent.multi_products_images_similarity_judgement(url_data['product_images'], basic_data['product_images']))
  35. # if similarity_judgement['is_similarity_product']:
  36. # return False
  37. # else:
  38. # return True
  39. if len(url_data['product_images']) != 0:
  40. for image_url in url_data['product_images']:
  41. # product_image = load_image_from_cos(image_url).resize((512, 512))
  42. product_image = load_image_from_url(image_url).resize((512, 512))
  43. similarity_map = license_infernece.calculate_similarity(product_image, basic_data['product_images'])
  44. if similarity_map[0]['similarity'] >= 90.0:
  45. return False
  46. return True
  47. # 图像判定
  48. return "无法判定"
  49. @staticmethod
  50. def similarity_logo_judgement(url_data, basic_data):
  51. """近似商标侵权判定"""
  52. if basic_data['similarity_logos'] == None or len(basic_data['similarity_logos']) == 0:
  53. return '信息不全,无法判断'
  54. if url_data['title'] == None:
  55. url_data['title'] = ''
  56. if url_data['brand_name'] == None:
  57. url_data['brand_name'] = ''
  58. for similarity_logo in basic_data['similarity_logos']:
  59. if similarity_logo in url_data['title'] or similarity_logo in url_data['brand_name']:
  60. return True
  61. # 判断基础数据中的名称是否包含在标题或者详情品牌名称中
  62. if basic_data['brand_name'] in url_data['title'] or basic_data['brand_name'] in url_data['brand_name']:
  63. return False
  64. else:
  65. return '无法判定'
  66. @staticmethod
  67. def logo_1to1_judgement(url_data, basic_data):
  68. """商标一比一侵权"""
  69. if basic_data['base_price'] == None or basic_data['price_percent'] == None or url_data['title'] == None or basic_data['product_name'] == None:
  70. return '信息不全,无法判定'
  71. # 首先计算基础价格百分比
  72. base_price = basic_data['base_price'] * basic_data['price_percent']
  73. if url_data['title'].strip() == basic_data['product_name'].strip():
  74. # 当商品名称与提供的产品名称完全一致时,进行判定
  75. if url_data['price'] < base_price:
  76. return True
  77. else:
  78. return False
  79. else:
  80. if url_data['product_images'] == None or len(url_data['product_images']) == 0 or basic_data['product_images'] == None or len(basic_data['product_images']) == 0:
  81. return '信息不全,无法判定'
  82. for image_url1 in url_data['product_images']:
  83. for image_url2 in basic_data['product_images']:
  84. similarity_product_judgement = json5.loads(ApiService.agent.product_image_similarity_judgement(image_url1, image_url2))
  85. if similarity_product_judgement['is_similarity_product']:
  86. if url_data['price'] < base_price:
  87. return True
  88. else:
  89. return False
  90. return False
  91. @staticmethod
  92. def low_price_judgement(url_data, basic_data):
  93. """低价判断"""
  94. if url_data['price'] == None or basic_data['base_price'] == None:
  95. return '价格信息缺失,无法判定'
  96. if url_data['title'] == basic_data['product_name']:
  97. if url_data['price'] < basic_data['base_price']:
  98. return True
  99. else:
  100. return False
  101. else:
  102. # 进行图像判定
  103. if url_data['product_images'] == None or len(url_data['product_images']) == 0 or basic_data['product_images'] == None or len(basic_data['product_images']) == 0:
  104. return '信息不全,无法判定'
  105. for image_url1 in url_data['product_images']:
  106. for image_url2 in basic_data['product_images']:
  107. similarity_product_judgement = json5.loads(ApiService.agent.product_image_similarity_judgement(image_url1, image_url2))
  108. if similarity_product_judgement['is_similarity_product']:
  109. if url_data['price'] < basic_data['base_price']:
  110. return True
  111. else:
  112. return False
  113. @staticmethod
  114. def get_license_list(brand_name):
  115. """获取品牌方授权生成的商品列表"""
  116. license_list = []
  117. records = license_dao.get_records_by_query({"brand_name": brand_name})
  118. for record in records:
  119. license_list.append(record['product_name'].strip())
  120. return license_list
  121. @staticmethod
  122. def license_judgement(url_data, basic_data):
  123. """未生产产品判断"""
  124. if basic_data['brand_name'] == None:
  125. return '信息不全,无法判定'
  126. license_list = ApiService.get_license_list(basic_data['brand_name'])
  127. if len(license_list) == 0:
  128. return '授权列表空,无法判定'
  129. result = json5.loads(ApiService.agent.license_product_judgement(url_data['title'], license_list))
  130. return result['in_list']
  131. if __name__ == '__main__':
  132. url_data = {
  133. 'title': '休闲短裤女士运动潮流系列夏季女装裤子梭织运动裤',
  134. 'brand_name': '李宁',
  135. 'product_images': [
  136. 'http://h2.appsimg.com/a.appsimg.com/upload/merchandise/pdcvis/613214/2024/0902/118/27466cf6-fb28-4580-9009-95a3763e06bf.jpg',
  137. 'http://h2.appsimg.com/a.appsimg.com/upload/merchandise/pdcvis/613214/2024/1120/169/8ca15632-9cb9-40e7-8915-e6773e17a05e.jpg'
  138. ],
  139. 'price': 199
  140. }
  141. basic_data = {
  142. 'product_name': '休闲短裤女士运动潮流系列夏季女装裤子梭织运动裤',
  143. 'brand_name': '李宁',
  144. 'similarity_logos': ['李宇', '李柠'],
  145. 'product_images': [
  146. 'http://h2.appsimg.com/a.appsimg.com/upload/merchandise/pdcvis/613214/2024/1120/169/8ca15632-9cb9-40e7-8915-e6773e17a05e.jpg',
  147. 'http://h2.appsimg.com/a.appsimg.com/upload/merchandise/pdcvis/613214/2024/1120/169/8ca15632-9cb9-40e7-8915-e6773e17a05e.jpg'
  148. ],
  149. 'base_price': 200,
  150. 'price_percent': 0.9
  151. }
  152. result = ApiService.low_price_judgement(url_data, basic_data)
  153. print(result)
  154. product_list = [
  155. "https://gw.alicdn.com/imgextra/O1CN01SRLgJ11JdrhxIPXGd_!!3378851052.jpg_q95.jpg_.webp",
  156. "https://img.alicdn.com/imgextra/i2/3378851052/O1CN01UpWwyY1JdrUq6MJvu_!!3378851052.jpg_q75.jpg_.webp",
  157. "https://img.alicdn.com/imgextra/i2/3378851052/O1CN01qRzu8W1JdraPoEnyK_!!3378851052.jpg_q75.jpg_.webp",
  158. "https://img.alicdn.com/imgextra/i2/3378851052/O1CN0150gjbG1JdrUplO3bP_!!3378851052.jpg_q75.jpg_.webp",
  159. "https://img.alicdn.com/imgextra/i4/3378851052/O1CN01Cw6aaG1Jdra8AwqW7_!!3378851052.jpg_q75.jpg_.webp",
  160. "https://img.alicdn.com/imgextra/i1/3378851052/O1CN01PMPzQN1JdrUoKrsqo_!!3378851052.jpg_q75.jpg_.webp"
  161. ]
  162. basic_product_list = [
  163. "https://gw.alicdn.com/imgextra/O1CN01EFpxoy1JdrhyyD8Gp_!!3378851052.jpg_q95.jpg_.webp",
  164. "https://img.alicdn.com/imgextra/i2/3378851052/O1CN01N1VBKz1JdriDQ7v3s_!!3378851052.jpg_q75.jpg_.webp",
  165. "https://img.alicdn.com/imgextra/i4/3378851052/O1CN01d1T16h1JdriBxQW8j_!!3378851052.jpg_q75.jpg_.webp",
  166. "https://img.alicdn.com/imgextra/i4/3378851052/O1CN01O5Gb861JdriAyGLo0_!!3378851052.jpg_q75.jpg_.webp",
  167. "https://img.alicdn.com/imgextra/i1/3378851052/O1CN01WT8Kg81JdriDTZ4lq_!!3378851052.jpg_q75.jpg_.webp",
  168. "https://img.alicdn.com/imgextra/i2/3378851052/O1CN01v4KL0D1JdriCrG3SH_!!3378851052.jpg_q75.jpg_.webp"
  169. ]
  170. response = ApiService.agent.multi_products_images_similarity_judgement(product_list, basic_product_list)
  171. print(response)