# 请求vc店铺的所有接口 import json import time import pymysql import redis from common import request_to_jd_vc from common import request_to_jd_vc_dev config_dev = { "mysql": { "host": "192.168.1.238", "port": 3306, "user": "liexin_data_distribution", "password": "liexin_data_distribution#zsyM", "database": "liexin_data_distribution" }, "redis": { "host": "192.168.1.235", "port": 6379, "password": "icDb29mLy2s" } } config_prod = { "mysql": { "host": "bigdata2.ichunt.db", "port": 3306, "user": "DsbuUx", "password": "sfj09JjsfpQx0", "database": "liexin_data_distribution" }, "redis": { "host": "172.18.137.38", "port": 6379, "password": "icDb29mLy2s" } } def get_vc_audit(applyId: str): """根据应用id 查找审核状态(若审核成功可以获得京东sku_id)""" method_name = "jingdong.vc.item.product.apply.get" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" param = { "applyId": applyId, } ans = request_to_jd_vc(method_name, token, app_key, app_secret, param) print(json.dumps(ans, ensure_ascii=False)) return ans def insert_vc_class(conf: dict): method_name = "jingdong.vc.item.categories.find" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" param = {} ans = request_to_jd_vc(method_name, token, app_key, app_secret, param) results = ans["jingdong_vc_item_categories_find_responce"]["jos_result_dto"]["result"] host = conf["mysql"]["host"] port = conf["mysql"]["port"] user = conf["mysql"]["user"] password = conf["mysql"]["password"] database = conf["mysql"]["database"] db = pymysql.connect(host=host, port=port, user=user, password=password, database=database) cursor = db.cursor() for i in range(len(results)): parent_id = results[i]["cid3"] class_id = results[i]["id"] class_name = results[i]["name"] depth = results[i]["depth"] status = 1 platform = 1 create_time = int(time.time()) # check if already exist. check_sql = "select class_id from lie_shop_class where class_id = %s" cursor.execute(query=check_sql, args=(class_id,)) check_result = cursor.fetchall() if len(check_result) > 0: continue insert_sql = "insert into lie_shop_class (parent_id, class_id, class_name, depth, status, platform, create_time) values (%s, %s, %s, %s, %s, %s, %s)" cursor.execute(query=insert_sql, args=(parent_id, class_id, class_name, depth, status, platform, create_time,)) db.commit() print(insert_sql % (parent_id, class_id, class_name, depth, status, platform, create_time)) def insert_vc_attr(conf: dict): """lie_shop_class中拿vc class_id 插入属性""" select_sql = "select class_id from lie_shop_class where platform = 1" host = conf["mysql"]["host"] port = conf["mysql"]["port"] user = conf["mysql"]["user"] password = conf["mysql"]["password"] database = conf["mysql"]["database"] method_name = "jingdong.vc.item.props.find" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" db = pymysql.connect(host=host, port=port, user=user, password=password, database=database) cursor = db.cursor() cursor.execute(query=select_sql) db_results = cursor.fetchall() for i in range(len(db_results)): class_id = db_results[i][0] param = { "category_leaf_id": class_id } ans = request_to_jd_vc(method_name=method_name, token=token, app_key=app_key, app_secret=app_secret, param=param) print(json.dumps(ans, ensure_ascii=False)) if "result" not in ans["jingdong_vc_item_props_find_responce"]["jos_result_dto"]: continue jd_results = ans["jingdong_vc_item_props_find_responce"]["jos_result_dto"]["result"] for j in range(len(jd_results)): result = jd_results[j] props = result["props"] for k in range(len(props)): prop = props[k] attr_id = prop["id"] attr_name = prop["name"] unit = prop["val_unit"] input_type = prop["input_type"] platform = 1 status = 1 if not prop["required"]: is_required = 0 else: is_required = 1 enum_value = "[]" if input_type == 1 or input_type == 2: # 单选或者多选 把选项取出来 tmp_value_list = [] values = prop["values"] for index in range(len(values)): attr_value_id = values[index]["id"] attr_value_name = values[index]["name"] item_map = { "attr_value_id": attr_value_id, "attr_value_name": attr_value_name, } tmp_value_list.append(item_map) enum_value = json.dumps(tmp_value_list, ensure_ascii=False) elif input_type == 3: # 文本类型 # 文本类型没有可选值 pass elif input_type == 7: # 数值类型 # 数值类型没有可选值 pass elif input_type == 10: # 多单位多解析的方式 # 多单位多解析 需要特殊处理单位字段 tmp_unit_list = [] values = prop["values"] for index in range(len(values)): if "units" in values[index]: unit_list = values[index]["units"] for x in range(len(unit_list)): tmp_unit_list.append(unit_list[x]) unit = json.dumps(tmp_unit_list, ensure_ascii=False) else: print("此input_type类型暂未兼容处理!请单独处理!") create_time = int(time.time()) insert_sql = "insert into lie_shop_attr (class_id, attr_id, attr_name, unit, enum_value, input_type, is_required, status, platform, create_time) values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" cursor.execute(query=insert_sql, args=( class_id, attr_id, attr_name, unit, enum_value, input_type, is_required, status, platform, create_time,)) db.commit() print(insert_sql % ( class_id, attr_id, attr_name, unit, enum_value, input_type, is_required, status, platform, create_time)) def insert_vc_ext_attr(conf: dict): """ 基于lie_shop_attr中的class_id来更新 “拓展” 属性 """ host = conf["mysql"]["host"] port = conf["mysql"]["port"] user = conf["mysql"]["user"] password = conf["mysql"]["password"] database = conf["mysql"]["database"] method_name = "jingdong.vc.item.extProps.find" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" select_sql = "select class_id from lie_shop_class where platform = 1" db = pymysql.connect(host=host, port=port, user=user, password=password, database=database) cursor = db.cursor() cursor.execute(query=select_sql) db_results = cursor.fetchall() for i in range(len(db_results)): class_id = db_results[i][0] param = { "category_leaf_id": class_id, } ans = request_to_jd_vc(method_name=method_name, token=token, app_key=app_key, app_secret=app_secret, param=param) if "result" not in ans["jingdong_vc_item_extProps_find_responce"]["jos_result_dto"]: continue jd_results = ans["jingdong_vc_item_extProps_find_responce"]["jos_result_dto"]["result"] for j in range(len(jd_results)): result = jd_results[j] flag = result["is_required"] is_required = flag attr_id = result["att_id"] attr_name = result["name"] unit = result["val_unit"] status = 1 platform = 1 create_time = int(time.time()) input_type = result["input_type"] enum_value = "[]" # 根据 input_type 不同类型分别处理 if input_type == 1 or input_type == 2: # 单选或者多选,获取选项值 ext_prop_value = result["ext_prop_value"] tmp_list_value = [] for k in range(len(ext_prop_value)): value = ext_prop_value[k] attr_value_id = value["value_id"] attr_value_name = value["value_name"] item = { "attr_value_id": attr_value_id, "attr_value_name": attr_value_name } tmp_list_value.append(item) enum_value = json.dumps(tmp_list_value, ensure_ascii=False) elif input_type == 3: # 文本类型,无选项值 pass else: print("暂时未兼容此种类型的拓展属性 input_type: " + str(input_type)) insert_sql = "insert into lie_shop_attr (class_id, attr_id, attr_name, unit, enum_value, input_type, is_required, status, platform, create_time) values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" cursor.execute(query=insert_sql, args=( class_id, attr_id, attr_name, unit, enum_value, input_type, is_required, status, platform, create_time,)) db.commit() print(insert_sql % ( class_id, attr_id, attr_name, unit, enum_value, input_type, is_required, status, platform, create_time)) def insert_ext_attr_to_redis(conf: dict): host = conf["mysql"]["host"] port = conf["mysql"]["port"] user = conf["mysql"]["user"] password = conf["mysql"]["password"] database = conf["mysql"]["database"] method_name = "jingdong.vc.item.extProps.find" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" select_sql = "select class_id from lie_shop_class where platform = 1" db = pymysql.connect(host=host, port=port, user=user, password=password, database=database) cursor = db.cursor() cursor.execute(query=select_sql) db_results = cursor.fetchall() class_attr_mapping = {} for i in range(len(db_results)): class_id = db_results[i][0] class_attr_mapping[class_id] = [] param = { "category_leaf_id": class_id, } ans = request_to_jd_vc(method_name=method_name, token=token, app_key=app_key, app_secret=app_secret, param=param) print("request to jd ....") if "result" not in ans["jingdong_vc_item_extProps_find_responce"]["jos_result_dto"]: continue jd_results = ans["jingdong_vc_item_extProps_find_responce"]["jos_result_dto"]["result"] for j in range(len(jd_results)): result = jd_results[j] attr_id = result["att_id"] class_attr_mapping[class_id].append(attr_id) redis_host = conf["redis"]["host"] redis_port = conf["redis"]["port"] redis_password = conf["redis"]["password"] redis_db = redis.Redis(host=redis_host, port=redis_port, password=redis_password) for class_id in class_attr_mapping: key = str(class_id) attr_ids = class_attr_mapping[class_id] if len(attr_ids) == 0: continue value = json.dumps(attr_ids, ensure_ascii=False) redis_db.hset(name="jd_ext_attr", key=key, value=value) print("jd_ext_attr", key, value) # 此方法危险 不建议使用 # def delete_redis_key(key: str, conf: dict): # redis_host = conf["redis"]["host"] # redis_port = conf["redis"]["port"] # redis_password = conf["redis"]["password"] # redis_db = redis.Redis(host=redis_host, port=redis_port, password=redis_password) # redis_db.delete(key) def update_vc_goods_attr(): """ vc店铺更新商品属性 """ method_name = "jingdong.vc.item.oldProduct.updateV2" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" param = { "ware_id": "100124079781", "en_brand": "Kingbright", "zh_brand": "Kingbright", "pkg_info": "商品主体 * 1", "original_place": "中国大陆", "warranty": "无质保", "cid1": 33834, "brand_id": 823924, "name": "Kingbright LED点阵 TA12-11EWA 起订数1个", "item_num": "1151033371062413398", "saler_code": "maojingtao1", "purchaser_code": "maojingtao1", "prop_id": "274243,266140,275609,234941,270354", "prop_remark": "散装,9,9,tast,", "prop_vid": ",,,,1639267", "ext_id": "235849", "ext_values": "1336374", "main_path": "jfs/t1/232493/18/26763/19756/670d354fFa5efdaae/c3fe357ecb152ae7.jpg", "main_isPrimary": "1", "intro_html": "<img src=https://img30.360buyimg.com/sku/jfs/t1/133800/28/25551/94742/62fef403E1a77f3a2/9b92597c0c26d1c8.jpg' /><br>", "intro_mobile": "<img src=https://img30.360buyimg.com/sku/jfs/t1/133800/28/25551/94742/62fef403E1a77f3a2/9b92597c0c26d1c8.jpg' /><br>", } ans = request_to_jd_vc(method_name, token, app_key, app_secret, param) print(json.dumps(ans, ensure_ascii=False)) def set_vc_init_stock_and_delivery(stock_num, delivery_day, ware_id): method_name = "jingdong.productConfigSdkService.setProductConfig" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" param = { "productConfigReq": { "productConfigInfoDtoList": [ { "@type": "com.jd.jdi.ivc.product.publish.sdk.dto.product.ProductConfigInfoDto", "skuStockNum": stock_num, "promiseDays": delivery_day, "czFlag": 0, "skuId": ware_id, } ] } } ans = request_to_jd_vc(method_name, token, app_key, app_secret, param) print(json.dumps(ans, ensure_ascii=False)) def modify_vc_stock_num(stock_num, ware_id): """ 修改vc商品库存 """ method_name = "jingdong.dropship.dps.modifyStockInfo" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" param = { "sku": ware_id, "stockNum": stock_num } ans = request_to_jd_vc(method_name, token, app_key, app_secret, param) print(json.dumps(ans, ensure_ascii=False)) def get_vc_goods_info(ware_id: str): method_name = "jingdong.vc.item.product.get" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" param = { "wareId": ware_id } ans = request_to_jd_vc(method_name, token, app_key, app_secret, param) print(json.dumps(ans, ensure_ascii=False)) def modify_jd_vc_market_price(): """ 修改vc市场价,京东价 """ method_name = "jingdong.promotion.adjust.price.updatePrice" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" param = { "operateRequest": { "skuPriceInfo": { "site": 301, "marketPrice": 199.30, "salePrice": 188.18, "skuId": 100151433074, }, "venderInfo": { "supplierCode": "ichunt", }, "applicant": "ichunt", "appReason": "调整价格测试", } } ans = request_to_jd_vc(method_name, token, app_key, app_secret, param) print(json.dumps(ans, ensure_ascii=False)) def modify_vc_purchase_price(): method_name = "jingdong.pps.pub.api.PpsPriceChangePublicJosService" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" param = { "basePriceChanges": [ { "@type": "com.jd.pps.pub.dto.PpsBasePriceChangeDto", "lineKey": "1", "changeReason": "修改采购价格内部测试", # "discount": 13, 这个参数在文档中是必填,但是实际不用传。 "orgId": -1, "vendorCode": "ichunt", "price": 100, "currency": "RMB", "sku": 100151433074, } ], "clientInfo": { } } ans = request_to_jd_vc(method_name, token, app_key, app_secret, param) print(json.dumps(ans, ensure_ascii=False)) """ 创建促销活动接口 """ def create_vc_promotion(): method_name = "jingdong.promo.activity.create" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" param = { "request": { "baseRequest": { "@type": "com.jd.promo.activity.sdk.model.request.BaseRequest", }, "activityDTO": { "@type": "com.jd.promo.activity.sdk.model.ActivityDTO", "activityBaseDTO": { "@type": "com.jd.promo.activity.sdk.model.ActivityBaseDTO", "name": "内部促销活动测试", "type": 26, "beginTime": "2024-11-05 00:14:00", "endTime": "2024-11-05 06:14:00", "bound": 1, "venderType": 1, "venderId": 10457263 }, "activityScopeDTO": { "@type": "com.jd.promo.activity.sdk.model.ActivityScopeDTO", "channelList": [ "1", ], } } } } ans = request_to_jd_vc_dev(method_name, token, app_key, app_secret, param) print(json.dumps(ans, ensure_ascii=False)) """ 促销活动加品 """ def vc_promotion_add_sku(): method_name = "jingdong.promo.activity.addSkus" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" param = { "request": { "baseRequest": { "@type": "com.jd.promo.activity.sdk.model.request.BaseRequest", }, "activityParticipantDTO": { "@type": "com.jd.promo.activity.sdk.model.ActivityParticipantDTO", "bound": 1, "bindType": 1, "activityId": 3000001, "activitySkuDTOList": [ { "@type": "com.jd.promo.activity.sdk.model.ActivitySkuDTO", "skuId": 100124748677, "skuName": "TAMURA 音频变压器 MET-46 起订数1个", "skuBound": 1, "skuBindType": 1, "spuId": 101, "originPrice": "100.18", } ], } } } ans = request_to_jd_vc(method_name, token, app_key, app_secret, param) print(json.dumps(ans, ensure_ascii=False)) """ 提交促销活动接口 """ def commit_vc_activity(): method_name = "jingdong.promo.activity.commit" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" param = { "activityId": 3000001 } ans = request_to_jd_vc(method_name, token, app_key, app_secret, param) print(json.dumps(ans, ensure_ascii=False)) def delete_vc_activity(): method_name = "jingdong.promo.activity.remove" token = "845ce8478b074103b9e78a769d5fa4831y2u" app_key = "CA52430E90209F51D8F5D7B615DDE9AD" app_secret = "c92691b2379c48de87e699c4c2f7fb32" param = { "activityId": 3000001 } ans = request_to_jd_vc(method_name, token, app_key, app_secret, param) print(json.dumps(ans, ensure_ascii=False)) if __name__ == '__main__': set_vc_init_stock_and_delivery(stock_num=11, delivery_day=11, ware_id=100153434044)