api_service.py 9.4 KB

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