@xw-tech/egg-xw-taobao
Version:
xw专用淘宝联盟cps接口二次业务封装
549 lines • 40.3 kB
JavaScript
"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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