show sku id for shopee
// ==UserScript==
// @name GetSKUID
// @namespace supermeatboy@getskuid
// @version 0.4
// @description show sku id for shopee
// @author supermeatboy
// @match https://shopee.co.id/*
// @match https://shopee.co.th/*
// @match https://shopee.com.my/*
// @match https://shopee.sg/*
// @match https://shopee.ph/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=shopee.co.id
// @grant none
// @run-at document-start
// @license MIT
// ==/UserScript==
(function() {
'use strict';
let oldfetch = fetch;
let skuNameToID = {}
let maxRetry = 20
let retryCount = 1
var selectSkuList = {}
function fuckfetch() {
return new Promise((resolve, reject) => {
oldfetch.apply(this, arguments).then(response => {
const oldJson = response.json;
response.json = function() {
return new Promise((resolve, reject) => {
oldJson.apply(this, arguments).then(result => {
// 命中sku 请求,解析出skuNameToID
if(result.data && result.data.item && result.data.item.models) {
console.info("hook", result.data.item.models)
for(let item of result.data.item.models) {
let skuName = item.name
if(!skuName) {
skuName = 'default sku'
}
skuNameToID[skuName]=item.model_id
}
// 延迟触发显示id
console.info("skuNameToID", skuNameToID)
if(Object.keys(skuNameToID).length > 1) {
setTimeout(updateSkuId, 1000)
} else {
setTimeout(updateSkuIdForOneSku, 1000)
}
}
resolve(result);
});
});
};
resolve(response);
});
});
}
window.fetch = fuckfetch;
function getSkuInfo() {
if(retryCount > maxRetry) {
return
}
var dom = document.querySelector('script[type="text/mfe-initial-data"]')
if(!dom) {
retryCount += 1
setTimeout(getSkuInfo, 1000)
return
}
let data = JSON.parse(dom.innerText);
let result = Object.entries(data.initialState.item.items)[0][1]
if(result.models) {
console.info("hook", result.models)
for(let item of result.models) {
let skuName = item.name
if(!skuName) {
skuName = 'default sku'
}
skuNameToID[skuName]=item.model_id
}
// 延迟触发显示id
console.info("skuNameToID", skuNameToID)
if(Object.keys(skuNameToID).length > 1) {
setTimeout(updateSkuId, 1000)
} else {
setTimeout(updateSkuIdForOneSku, 1000)
}
}
}
getSkuInfo()
// Your code here...
function buildShowNode() {
let newDiv = document.createElement("div");
newDiv.style.width = "100%"
let newPre = document.createElement("pre");
newPre.id = "supermeatboy_sku_map"
var jsonText = JSON.stringify(skuNameToID, Object.keys(skuNameToID).sort(), " ")
newPre.innerText = jsonText.substring(1, jsonText.length -2);
newDiv.appendChild(newPre);
return newDiv
}
function updateSkuIdForOneSku() {
if(retryCount > maxRetry) {
return
}
let doms = document.querySelectorAll(".shopee-input-quantity")
// 伺机重试
if(!doms || doms.length == 0) {
setTimeout(updateSkuIdForOneSku, 1000)
return
}
let lastSku = doms[doms.length - 1]
let parentNode = lastSku.parentNode.parentNode.parentNode.parentNode.parentNode
parentNode.parentNode.insertBefore(buildShowNode(), parentNode);
}
function updateSkuId() {
if(retryCount > maxRetry) {
return
}
let doms = document.querySelectorAll(".sApkZm")
// 伺机重试
if(!doms || doms.length == 0) {
setTimeout(updateSkuId, 1000)
return
}
let lastSku = doms[doms.length - 1]
lastSku.parentNode.appendChild(buildShowNode());
let skuLevelCount = 0
let skuParentNode = null;
for(let d of doms) {
if(skuParentNode == null || d.parentNode != skuParentNode) {
skuParentNode = d.parentNode
skuLevelCount += 1
}
d.setAttribute("sku_level", skuLevelCount)
d.addEventListener("click", (e) => {
let skuDom = e.target
var skuName = skuDom.innerText
var skuLevel = skuDom.getAttribute("sku_level")
if(selectSkuList[skuLevel] == skuName) {
selectSkuList[skuLevel] = null
} else {
selectSkuList[skuLevel] = skuName
}
console.info("click", skuDom.innerText, selectSkuList)
var skuMapNode = document.getElementById("supermeatboy_sku_map")
var filterSkuMap = {}
for(let key in skuNameToID) {
let skuNames = key.split(",")
let isAllSkuExist = true
for(let skuLevel in selectSkuList) {
if(!selectSkuList[skuLevel]) {
continue
}
if(skuNames.indexOf(selectSkuList[skuLevel]) < 0) {
isAllSkuExist = false
}
}
if(isAllSkuExist) {
filterSkuMap[key] = skuNameToID[key]
}
}
var jsonText = JSON.stringify(filterSkuMap, Object.keys(filterSkuMap).sort(), " ")
// 去掉首尾的 花括号
skuMapNode.innerText = jsonText.substring(1, jsonText.length -2);
});
}
}
//
})();