create-chuntianxiaozhu
Version:
春天小猪模板工具
209 lines (193 loc) • 5.74 kB
text/typescript
import { notifications } from "../../utils/chrome";
import { parseUri, queryCookies } from "../../utils/utils";
import { apiRequest } from "../../utils/api";
import { load } from "cheerio";
/**
* 搜索店铺
* 公共工具包与UI渲染和数据来源无关,供所有模块使用
* @param shopName
*/
export function searchTaobaoShop(shopName: string) {
chrome.tabs.query(
{ currentWindow: true, url: "https://shopsearch.taobao.com/*" },
function (tabs) {
if (tabs[0] && tabs[0].id) {
chrome.tabs.update(tabs[0].id, {
url: `https://shopsearch.taobao.com/search?q=${shopName}`,
active: true,
});
} else {
chrome.tabs.create({
url: `https://shopsearch.taobao.com/search?q=${shopName}`,
active: true,
});
}
}
);
}
export function generateSimilarShop() {
chrome.tabs.query({ active: true }, function (tabs) {
if (tabs[0]) {
if (tabs[0].url?.indexOf("shopsearch.taobao.com") == -1) {
notifications(
"notintaobao",
"当前页面不在淘宝店铺搜索页,无法获取相似店铺"
);
return;
}
if (tabs[0] && tabs[0].id) {
chrome.tabs.sendMessage(tabs[0].id, { type: "generateSimilarShop" });
}
}
});
}
/**
* 获取淘宝cookie
*/
function queryTaobaoCookies() {
return Promise.all([
queryCookies({ domain: "shopsearch.taobao.com" }),
queryCookies({ domain: "taobao.com" }),
])
.then((results) => {
const cookieResult = {
cookieMap: {} as any,
cookieStr: "",
};
results.forEach((item) => {
cookieResult.cookieMap = {
...cookieResult.cookieMap,
...item.cookieMap,
};
cookieResult.cookieStr = cookieResult.cookieStr
? [cookieResult.cookieStr, item.cookieStr].join("; ")
: item.cookieStr;
});
return cookieResult;
})
.catch((e) => {
notifications(
"apptip",
"获取淘宝凭证失败,请在当前浏览器登录淘宝后再重试"
);
throw new Error(e);
});
}
/**
* 获取天猫cookie
* @returns
*/
export function queryTianMaoCookies() {
return queryCookies({ domain: ".tmall.com" }).catch((e) => {
notifications("apptip", "获取天猫凭证失败,请在当前浏览器登录淘宝后再重试");
throw new Error(e);
});
}
export interface SearchShopParams {
shopName: string;
/**
* 店铺类型 1 淘宝 2 天猫 3 全球购
*/
type?: 1 | 2 | 3;
/**
* 店铺地址 多个地址逗号隔开,如北京,上海
*/
location?: string;
/**
* 名称搜索类型
* title 按照店铺名称搜索
* wangwang 按照旺旺名称搜素
*/
rele?: string;
/**
* 页数
*/
pageNum?: number;
/**
* 好评率, 90%以上 -> 9000%,
*/
goodrate?: string;
/**
* 淘宝店时区分
* jin 金冠店,huang 皇冠店,zhuan 钻级店,xin 心级店
*/
ratesum?: string;
/**
* 排序
* default 排序类型 按销量降序,由大到小 sale-desc 按信用降序,由大到小 credit-desc
*/
sort?: string;
}
export async function fetchShops(params: SearchShopParams) {
const {
shopName,
type = "",
location = "",
rele = "",
pageNum = 0,
goodrate = "",
ratesum = "",
sort = "",
} = params;
const url = `https://shopsearch.taobao.com/search?q=${shopName}&isb=${type}&loc=${location}&rele_field=${rele}&sort=${sort}&s=${
pageNum * 20
}&goodrate=${goodrate}&ratesum=${ratesum}`;
const result = await apiRequest({ url });
const $ = load(result);
const picsScript = $("script")[5];
const contentStr = $(picsScript).text();
// 去掉不需要的符号
const content = contentStr.replace(/\s/g, "");
const startIndex = content.indexOf("g_page_config");
const endIndex = content.indexOf("g_srp_loadCss");
const jsonStr = content.slice(
startIndex + "g_page_config".length + 1,
endIndex - 1
);
const pageConfigData = JSON.parse(jsonStr);
return pageConfigData;
}
export interface SearchSimilarShopParams {
similarUrl: string;
}
export async function fetchSimilarShop(params: SearchSimilarShopParams) {
const { similarUrl } = params;
const url = `https://shopsearch.taobao.com${similarUrl}`;
const result = await apiRequest({ url });
const $ = load(result);
const picsScript = $("script")[5];
const contentStr = $(picsScript).text();
// 去掉不需要的符号
const content = contentStr.replace(/\s/g, "");
const startIndex = content.indexOf("g_page_config");
const endIndex = content.indexOf("g_srp_loadCss");
const jsonStr = content.slice(
startIndex + "g_page_config".length + 1,
endIndex - 1
);
const pageConfigData = JSON.parse(jsonStr);
return pageConfigData;
}
export interface QueryWangLinkParams {
shopUrl: string;
shopName: string;
}
export async function fetchShopWangLink(params: QueryWangLinkParams) {
const { shopUrl, shopName } = params;
const cookieResult = await queryTaobaoCookies();
const { cookieMap } = cookieResult;
const { host, path } = parseUri(shopUrl);
const url = `https://dispatch.taobao.com/getRealCid.aw?fromurl=${
host + path
}&t=${
cookieMap.t
}&toId=cntaobao${shopName}&charset=utf-8&clientX=181&clientY=81&fromId=cntaobao${
cookieMap.lid
}&encryptToUid=&bizType=&bizDomain=&pageSource=&appKey=&sceneParam=`;
const result = await apiRequest<string>({ url });
const shopUserNameDe = result.split("=")[1];
const shopUserName = shopUserNameDe.slice(1, shopUserNameDe.length - 1);
return `https://market.m.taobao.com/app/im/chat/index.html?&uid=${encodeURIComponent(
shopUserName
)}&gid=&type=web`;
}