UNPKG

create-chuntianxiaozhu

Version:

春天小猪模板工具

209 lines (193 loc) 5.74 kB
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`; }