feat(api): 添加ShowApiSpider类用于查询商品信息
All checks were successful
continuous-integration/drone Build is passing

- 添加ShowApiSpider类,用于通过条形码查询商品信息
- 修改app.py,引入ShowApiSpider类
- 修改add_product函数,使用ShowApiSpider查询商品信息
- 修改add_product函数,处理ShowApiSpider返回的商品信息
This commit is contained in:
Ching 2025-02-07 21:57:38 +08:00
parent e8293c0a74
commit d7fe6ffb14
2 changed files with 85 additions and 9 deletions

34
app.py
View File

@ -14,7 +14,7 @@ import redis
import requests import requests
from barcode import BarcodeSpider from barcode import BarcodeSpider, ShowApiSpider
from recipe import get_recipe_from_xiachufang from recipe import get_recipe_from_xiachufang
logger = loguru.logger logger = loguru.logger
@ -38,6 +38,7 @@ GROCY_DEFAULT_QUANTITY_UNIT_ID_PURCHASE = os.environ.get("GROCY_DEFAULT_QUANTITY
GROCY_DEFAULT_QUANTITY_UNIT_ID_STOCK = os.environ.get("GROCY_DEFAULT_QUANTITY_UNIT_ID_STOCK") GROCY_DEFAULT_QUANTITY_UNIT_ID_STOCK = os.environ.get("GROCY_DEFAULT_QUANTITY_UNIT_ID_STOCK")
GROCY_DEFAULT_BEST_BEFORE_DAYS = os.environ.get("GROCY_DEFAULT_BEST_BEFORE_DAYS") GROCY_DEFAULT_BEST_BEFORE_DAYS = os.environ.get("GROCY_DEFAULT_BEST_BEFORE_DAYS")
X_RapidAPI_Key = os.environ.get("X_RapidAPI_Key") X_RapidAPI_Key = os.environ.get("X_RapidAPI_Key")
ShowApi_AppKey = os.environ.get("ShowApi_AppKey")
REDIS_HOST = os.environ.get("REDIS_HOST") REDIS_HOST = os.environ.get("REDIS_HOST")
REDIS_PORT = os.environ.get("REDIS_PORT") REDIS_PORT = os.environ.get("REDIS_PORT")
BARK_DEVICE_KEY = os.environ.get("BARK_DEVICE_KEY") BARK_DEVICE_KEY = os.environ.get("BARK_DEVICE_KEY")
@ -86,13 +87,17 @@ def bark_push(title, text):
def add_product(dict_good, location): def add_product(dict_good, location):
good_name = "" good_name = ""
if "description" in dict_good: if 'goodsName' in dict_good:
good_name = dict_good['goodsName']
elif "description" in dict_good:
good_name = dict_good["description"] good_name = dict_good["description"]
elif "description_cn" in dict_good: elif "description_cn" in dict_good:
good_name = dict_good["description_cn"] good_name = dict_good["description_cn"]
if not good_name: if not good_name:
return False, good_name return False, good_name
if 'specification' in dict_good: if 'spec' in dict_good:
good_name = good_name + " - " + dict_good['spec']
elif 'specification' in dict_good:
good_name = good_name + " - " + dict_good['specification'] good_name = good_name + " - " + dict_good['specification']
locations = get_locations() locations = get_locations()
@ -133,17 +138,22 @@ def add_product(dict_good, location):
) )
# add barcode, ex. 06921168593910 # add barcode, ex. 06921168593910
barcode = None
if 'gtin' in dict_good:
barcode = dict_good['gtin']
elif 'code' in dict_good:
barcode = dict_good['code']
data_barcode = { data_barcode = {
"product_id": int(response_grocy["created_object_id"]), "product_id": int(response_grocy["created_object_id"]),
"barcode": dict_good["gtin"], "barcode": barcode,
"amount": 1.0, "amount": 1.0,
} }
grocy.add_generic(EntityType.PRODUCT_BARCODES, data_barcode) grocy.add_generic(EntityType.PRODUCT_BARCODES, data_barcode)
# add barcode, EAN-13, ex. 6921168593910 # add barcode, EAN-13, ex. 6921168593910
if dict_good["gtin"].startswith("0"): if barcode.startswith("0"):
data_barcode = { data_barcode = {
"product_id": int(response_grocy["created_object_id"]), "product_id": int(response_grocy["created_object_id"]),
"barcode": dict_good["gtin"].lstrip("0"), "barcode": barcode.lstrip("0"),
"amount": 1.0, "amount": 1.0,
} }
grocy.add_generic(EntityType.PRODUCT_BARCODES, data_barcode) grocy.add_generic(EntityType.PRODUCT_BARCODES, data_barcode)
@ -154,6 +164,8 @@ def add_product(dict_good, location):
pic_url = dict_good["picfilename"] pic_url = dict_good["picfilename"]
elif ("picture_filename" in dict_good) and dict_good["picture_filename"]: elif ("picture_filename" in dict_good) and dict_good["picture_filename"]:
pic_url = dict_good["picture_filename"] pic_url = dict_good["picture_filename"]
elif 'img' in dict_good and dict_good['img']:
pic_url = dict_good['img']
if pic_url: if pic_url:
try: try:
@ -172,7 +184,7 @@ def add_product(dict_good, location):
except requests.exceptions.RequestException as err: except requests.exceptions.RequestException as err:
print("Request error:", err) print("Request error:", err)
grocy.add_product_by_barcode(dict_good["gtin"], 1.0, 0.0) grocy.add_product_by_barcode(barcode, 1.0, 0.0)
return True, good_name return True, good_name
@ -269,12 +281,18 @@ def handle_add_product(barcode, location):
response_data = {"message": "Item added successfully"} response_data = {"message": "Item added successfully"}
return response_data, 200, product.name return response_data, 200, product.name
except: except:
spider = BarcodeSpider(x_rapidapi_key=X_RapidAPI_Key) spiders = []
spiders.append(ShowApiSpider(ShowApi_AppKey.split(",")))
spiders.append(BarcodeSpider(x_rapidapi_key=X_RapidAPI_Key))
for spider in spiders:
good = spider.get_good(barcode) good = spider.get_good(barcode)
if good:
break
if not good: if not good:
response_data = {"message": "Item not found"} response_data = {"message": "Item not found"}
return response_data, 400, None return response_data, 400, None
try: try:
added, good_name = add_product(good, location) added, good_name = add_product(good, location)
if added: if added:

View File

@ -185,6 +185,64 @@ class BarcodeSpider:
return self.get_imported_good(barcode) return self.get_imported_good(barcode)
class ShowApiSpider:
"""
{
"spec": "300毫升",
"sptmImg": "",
"remark": "查询成功!",
"img": "http://hj2.co/barcode/img/36be2cb461d5aa0e213755368be93af3",
"ycg": "",
"nw": "",
"ret_code": "0",
"description": "",
"qs": "",
"manuAddress": "",
"note": "checkResult1备注logout_flag0login_dateJul 28 1993 12:00:00:000AMvalid_dateJul 28 2023 12:00:00:000AM7.8单位CM16.13.7英文名称Johnson's milk+rice bath 300ml关键字沐浴露销售单位BX形态描述个人护理用品毛重339上市时间2018-08-01产地上海",
"goodsType": "服装、箱包、个人护理用品>>个人护理用品>>洗浴、身体护理品>>皮肤护理品",
"gpcType": "身体清洁/洗涤/香皂用品",
"gw": "",
"keyword": "沐浴露",
"width": "",
"gpc": "10000330",
"code": "6907376500056",
"hight": "",
"depth": "",
"manuName": "强生(中国)有限公司",
"price": "",
"flag": true,
"imgList": [],
"trademark": "强生婴儿",
"goodsName": "强生婴儿牛奶沐浴露300毫升"
}"""
def __init__(self, app_keys):
self.app_keys = app_keys
self.base_url = "https://route.showapi.com/66-22"
def get_good(self, barcode):
if barcode.startswith('069') or barcode.startswith('69'):
# lstrip去掉左边的0
barcode = barcode.lstrip('0')
else:
return None
for app_key in self.app_keys:
url = self.base_url + "?appKey=%s" % app_key
payload = {
"code": str(barcode),
}
response = requests.get(url, params=payload)
resp_data = response.json()
if resp_data["showapi_res_code"] == 0 and resp_data['showapi_res_body']['ret_code'] == '0':
good = resp_data["showapi_res_body"]
del good["ret_code"]
del good["remark"]
del good["flag"]
return good
#TODO: raise exception and log
return None
def main(): def main():
# 国产商品 # 国产商品
# good = BarCodeSpider.get_good('06917878036526') # good = BarCodeSpider.get_good('06917878036526')