UNPKG

@xw-tech/egg-xw-taobao

Version:

xw专用淘宝联盟cps接口二次业务封装

549 lines 40.3 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const constant_1 = require("./constant"); const tbk_sdk_1 = __importDefault(require("@xw-tech/tbk-sdk")); const util_1 = require("./util"); class TaobaoService { tbkService; constructor(appKey, secret, restUrl = 'https://gw.api.taobao.com/router/rest') { this.tbkService = new tbk_sdk_1.default(appKey, secret, restUrl); } parsePid(pid) { const pidArr = pid.split('_'); return { adzoneId: Number(pidArr[3]), siteId: Number(pidArr[2]), }; } // 万能解析 async linkParse(session, pwd, pid, relationId) { const { adzoneId } = this.parsePid(pid); const params = { adzone_id: adzoneId, material_dto: JSON.stringify([{ material_url: pwd }]), session, }; if (relationId) { params.relation_id = relationId; } const err = { code: 15, msg: 'Remote service error', sub_code: 'isv.parse-result-invalid', sub_msg: '淘口令解析结果无效,当前淘口令无效', }; const reg = /[\?&]id=([a-zA-Z0-9-]*)/; try { const response = await this.tbkService.request(constant_1.Api.万能解析, params); const dto = response?.data?.material_url_list?.material_url_list?.[0] .link_info_dto; if (dto && dto.material_id) { const res = { biz_scene_id: dto.tk_biz_type, url_type: dto.material_type, }; if (dto.material_id) { res.num_iid = dto.material_id; res.origin_url = dto.tpwd_origin_url || 'https://uland.taobao.com/item/edetail?id=' + dto.material_id; } else { res.origin_url = dto.tpwd_origin_url; const itemId = dto.tpwd_origin_url.match(reg)?.[1]; res.num_iid = itemId; } return res; } err.sub_msg = response.data.material_url_list.material_url_list[0] .msg; return Promise.reject(err); } catch (e) { console.log('错误', e); return Promise.reject(e); } } /** * * @param itemId 商品id * @param bizId 1-动态ID转链场景,2-消费者比价场景,3-商品库导购场景(不填默认为1) * @param promotionType 1-自购省,2-推广赚(代理模式专属ID,代理模式必填,非代理模式不用填写该字段) */ async itemInfoGet(itemId, bizId = 1, promotionType) { const params = { num_iids: itemId + '', platform: 2, }; if (bizId) { params.biz_scene_id = bizId; } if (promotionType) { params.promotion_type = promotionType; } try { const response = await this.tbkService.request(constant_1.Api.商品详情获取, params); const res = response.results.n_tbk_item?.[0] || {}; return res; } catch (e) { return Promise.reject(e); } } async pwdCreate(text, url) { const params = { text, url, }; try { const res = await this.tbkService.request(constant_1.Api.淘口令创建, params); return res; } catch (e) { return Promise.reject(e); } } async spreadGet(url) { const json = [ { url, }, ]; const urls = JSON.stringify(json); const data = { requests: urls, }; const res = await this.tbkService.request(constant_1.Api.长链转短链, data); return res; } async materialOptionalUpgrade(session, q, pid, relation_id = '', biz_scene_id = 1, promotion_type) { const { adzoneId, siteId } = this.parsePid(pid); const params = { q, adzone_id: adzoneId, site_id: siteId, session, }; if (relation_id) { params.relation_id = relation_id; } if (biz_scene_id) { params.biz_scene_id = biz_scene_id; } if (promotion_type) { params.promotion_type = promotion_type; } try { const res = await this.tbkService.request(constant_1.Api.物料搜索, params); return res.result_list.map_data; } catch (e) { return Promise.reject(e); } } async materialOptionalYh(session, q, pid, relation_id = '', biz_scene_id = 1, promotion_type) { try { const res = await this.materialOptionalUpgrade(session, q, pid, relation_id, biz_scene_id, promotion_type); return res.map((item) => (0, util_1.mapNewSearchToOld)(item)); } catch (e) { return Promise.reject(e); } } async prodRecommend(session, pid, material_id, page_no = 1, page_size = 20) { const { adzoneId, siteId } = this.parsePid(pid); const params = { page_size, page_no, adzone_id: adzoneId, site_id: siteId, material_id, session, }; try { const res = await this.tbkService.request(constant_1.Api.物料精选, params); return res.result_list.map_data; } catch (e) { return Promise.reject(e); } } async orderGet(session, start_time, end_time, page_no = 1, query_type = 1, order_scene = 1, position_index = '') { const params = { query_type, page_no, start_time, end_time, session, page_size: 100, order_scene, }; if (position_index) { params.position_index = position_index; } try { const res = await this.tbkService.request(constant_1.Api.订单获取, params); return res; } catch (e) { return Promise.reject(e); } } async punishOrderGet(params) { try { const res = await this.tbkService.request(constant_1.Api.处罚订单获取, params); return res; } catch (e) { return Promise.reject(e); } } async punishDgOrderGet(pageNo, pageSize, startTime, span, siteId) { try { const params = { page_no: pageNo, start_time: startTime, span, page_size: pageSize, site_id: siteId, }; const res = await this.tbkService.request(constant_1.Api.推广者处罚订单, { af_order_option: JSON.stringify(params), }); return res; } catch (e) { return Promise.reject(e); } } async refundOrderGet(session, searchType, refundType, pageNo = 1, pageSize = 100, bizType = 1, startTime) { try { const data = { search_type: searchType, refund_type: refundType, page_no: pageNo, start_time: startTime, page_size: pageSize, biz_type: bizType, }; const params = { session, search_option: JSON.stringify(data) }; const res = await this.tbkService.request(constant_1.Api.维权订单获取, params); return res; } catch (e) { return Promise.reject(e); } } async tbGoodsQuery(session, searchOption, suffix = false) { const { q, pid, pageNo, pageSize, startPrice, endPrice, platformSelf, sort, hasCoupon, relation_id, biz_scene_id, needSuffix, } = searchOption; const { adzoneId, siteId } = this.parsePid(pid); const params = { q, adzone_id: adzoneId, site_id: siteId, session, page_no: pageNo, page_size: pageSize, }; if (startPrice || startPrice === 0) { params.start_price = startPrice; } if (endPrice || endPrice === 0) { params.end_price = endPrice; } if (platformSelf) { params.is_tmall = true; } if (sort) { params.sort = sort; } if (hasCoupon) { params.has_coupon = true; } if (relation_id) { params.relation_id = relation_id; } if (biz_scene_id) { params.biz_scene_id = biz_scene_id; } try { const res = await this.tbkService.request(constant_1.Api.物料搜索, params); const list = res.result_list.map_data; if (list.length === 1 && !list[0].item_id) { const newSearchOption = { ...searchOption, biz_scene_id: 2, }; return this.tbGoodsQuery(session, newSearchOption, needSuffix); } const newList = list.map((item) => (0, util_1.mapNewSearchToOld)(item, suffix)); return newList; } catch (e) { return Promise.reject(e); } } async pwdParse(session, pwd, pid, relationId) { const { adzoneId, siteId } = this.parsePid(pid); const params = { adzone_id: adzoneId, site_id: siteId, session, material_list: pwd.replace(/,/g, ','), }; if (relationId) { params.relation_id = relationId; } try { const res = await this.tbkService.request(constant_1.Api.万能转链, params); const parsedRes = (0, util_1.handlePwd)(res); const { info } = parsedRes; const rParse = { biz_scene_id: info.tk_biz_type, click_url: info.click_url, model: info.model, num_iid: info.material_id, origin_url: info.originUrl, password: info.password, short_url: info.short_url, url_type: info.material_type, }; return rParse; } catch (e) { return Promise.reject(e); } } async getActivity(session, pid, pageId, relationId) { const { adzoneId, siteId } = this.parsePid(pid); const params = { adzone_id: adzoneId, site_id: siteId, session, page_id_list: pageId, }; if (relationId) { params.relation_id = relationId; } try { const res = await this.tbkService.request(constant_1.Api.万能转链, params); const parsedRes = (0, util_1.handlePage)(res); const finalRes = { data: { click_url: parsedRes.info.cps_long_url, terminal_type: parsedRes.info.material_type, }, }; return finalRes; } catch (e) { return Promise.reject(e); } } async privilegeType3(session, pwd, pid, relationId = '') { const { adzoneId, siteId } = this.parsePid(pid); const params = { platform: 2, adzone_id: adzoneId, site_id: siteId, session, material_list: pwd.replace(/,/g, ','), }; if (relationId) { params.relation_id = relationId; } try { const response = await this.tbkService.request(constant_1.Api.万能转链, params); const isValidInfo = response.data.material_url_list && response.data.material_url_list.material_url_list && response.data.material_url_list.material_url_list.length && Object.keys(response.data.material_url_list.material_url_list[0].link_info_dto).length; if (isValidInfo) { const item = response.data.material_url_list.material_url_list[0].link_info_dto; return item; } throw new Error(response.data.material_url_list.material_url_list[0].msg); } catch (e) { return Promise.reject(e); } } async privilegeNew(session, itemId, pid, relationId = '', bizId = 1, promotionType = 2) { const _itemId = itemId + ''; const { adzoneId, siteId } = this.parsePid(pid); const params = { platform: 2, adzone_id: adzoneId, site_id: siteId, session, biz_scene_id: bizId, item_id_list: _itemId, }; if (relationId) { params.relation_id = relationId; params.promotion_type = promotionType; } try { const res = await this.tbkService.request(constant_1.Api.万能转链, params); const parseRes = await (0, util_1.handleItemId)(res); const finalRes = { coupon_end_time: parseRes.coupon && parseRes.coupon.coupon_end_time, coupon_info: parseRes.coupon && parseRes.coupon.coupon_desc, coupon_remain_count: parseRes.coupon && parseRes.coupon.coupon_remain_count, coupon_start_time: parseRes.coupon && parseRes.coupon.coupon_start_time, coupon_total_count: parseRes.coupon && parseRes.coupon.coupon_remain_count, ...parseRes.info, }; return finalRes; } catch (e) { return Promise.reject(e); } } async getSimilar(session, pid, itemId, pageNo = 1, pageSize = 20, rate = 1) { const { adzoneId, siteId } = this.parsePid(pid); const params = { session, adzone_id: adzoneId, page_no: pageNo, site_id: siteId, page_size: pageSize, material_id: 13256, item_id: itemId, }; try { const res = await this.tbkService.request(constant_1.Api.猜你喜欢, params); const list = res.result_list.map_data.map((item) => (0, util_1.parseTbResult)(item, rate)); return list; } catch (e) { return Promise.reject(e); } } async getLike(session, pageNo = 1, pageSize = 20, deviceType, deviceValue, pid, rate = 1) { const { adzoneId, siteId } = this.parsePid(pid); const params = { session, adzone_id: adzoneId, page_no: pageNo, page_size: pageSize, site_id: siteId, material_id: 6708, }; if (deviceValue) { params.device_type = deviceType; params.device_value = deviceValue; params.device_encrypt = 'MD5'; } try { const res = await this.tbkService.request(constant_1.Api.猜你喜欢, params); const list = res.result_list.map_data.map((item) => (0, util_1.parseTbResult)(item, rate)); return list; } catch (e) { return Promise.reject(e); } } async getCouponInfo(itemId, couponId) { const params = { item_id: itemId, activity_id: couponId, }; try { const res = await this.tbkService.request(constant_1.Api.优惠券信息, params); return res.data; } catch (e) { console.log(e); return Promise.reject(e); } } async getTljReport(rightsId, pid) { const { adzoneId } = this.parsePid(pid); const params = { rights_id: rightsId, adzone_id: adzoneId, }; try { const res = await this.tbkService.request(constant_1.Api.淘礼金使用信息, params); return res.model; } catch (e) { console.log(e); return Promise.reject(e); } } async createTlj(pid, item_id, per_face, send_start_time, send_end_time, use_end_time, total_num = 1, name = '专享淘礼金福利', user_total_win_num_limit = 1, use_start_time, use_end_time_mode = 1, security_switch = true, campaign_type = '', use_threshold = 0) { const { adzoneId } = this.parsePid(pid); const params = { adzone_id: adzoneId, item_id, per_face, send_start_time, send_end_time, use_end_time, total_num, name, user_total_win_num_limit, use_start_time, use_end_time_mode, security_switch, }; if (use_end_time_mode === 1) { delete params.use_start_time; } if (campaign_type) { params.campaign_type = campaign_type; } if (use_threshold) { params.use_threshold = use_threshold; } try { const res = await this.tbkService.request(constant_1.Api.淘礼金生成, params); if (!res.result.success) { return Promise.reject(res.result.msg_info); } return res.result.model; } catch (e) { console.log(e); return Promise.reject(e); } } async stopTlj(rightsId, pid) { const { adzoneId } = this.parsePid(pid); const params = { rights_id: rightsId, adzone_id: adzoneId, }; try { const res = await this.tbkService.request(constant_1.Api.淘礼金停止, params); if (!res.result_success) { return Promise.reject(res.result_success); } return res.model; } catch (e) { console.log(e); return Promise.reject(e); } } async auth(code) { const params = { code, }; try { const res = await this.tbkService.request(constant_1.Api.授权, params); return JSON.parse(res.token_result); } catch (e) { console.log(e); return Promise.reject(e); } } } exports.default = TaobaoService; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5Q0FBaUM7QUFXakMsK0RBQTBDO0FBQzFDLGlDQU1nQjtBQWNoQixNQUFNLGFBQWE7SUFDQSxVQUFVLENBQWE7SUFDeEMsWUFDRSxNQUFjLEVBQ2QsTUFBYyxFQUNkLE9BQU8sR0FBRyx1Q0FBdUM7UUFFakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGlCQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsUUFBUSxDQUFDLEdBQVc7UUFDbEIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixPQUFPO1lBQ0wsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDMUIsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPO0lBQ1AsS0FBSyxDQUFDLFNBQVMsQ0FDYixPQUFlLEVBQ2YsR0FBVyxFQUNYLEdBQVcsRUFDWCxVQUFtQjtRQUVuQixNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBUTtZQUNsQixTQUFTLEVBQUUsUUFBUTtZQUNuQixZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDckQsT0FBTztTQUNSLENBQUM7UUFDRixJQUFJLFVBQVUsRUFBRTtZQUNkLE1BQU0sQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1NBQ2pDO1FBQ0QsTUFBTSxHQUFHLEdBQUc7WUFDVixJQUFJLEVBQUUsRUFBRTtZQUNSLEdB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