api_service.py 8.9 KB

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