下载地址:https://www.pan38.com/yun/share.php?code=JCnzE 提取密码:8897
以下是淘宝店铺阿里旺旺采集工具的JS实现代码,包含批量获取店铺旺旺ID功能,当然仅供学习测试用途哈,因为是给人家开发的,但是现在功能还是很正常能使用,就干脆分享。
/**
- 淘宝店铺旺旺采集工具
- 功能:批量获取淘宝店铺旺旺ID
*/
class WangWangCrawler {
constructor() {
this.API_ENDPOINT = "https://api.taobao.com/router/rest";
this.APP_KEY = "YOUR_APP_KEY"; // 替换为你的淘宝开放平台AppKey
this.APP_SECRET = "YOUR_APP_SECRET"; // 替换为你的AppSecret
this.shopList = [];
this.wangwangMap = new Map();
}
// 初始化方法
async init() {
console.log("旺旺采集工具初始化...");
await this.loadShops();
await this.processShops();
this.exportResults();
}
// 加载店铺列表
async loadShops() {
// 这里可以从文件或API加载店铺列表
this.shopList = [
"https://shop123.taobao.com",
"https://shop456.taobao.com",
// 更多店铺...
];
console.log(已加载 ${this.shopList.length} 个店铺
);
}
// 处理店铺列表
async processShops() {
for (const shopUrl of this.shopList) {
try {
const shopId = this.extractShopId(shopUrl);
const wangwangId = await this.getWangWangId(shopId);
if (wangwangId) {
this.wangwangMap.set(shopUrl, wangwangId);
console.log(`成功获取: ${shopUrl} -> ${wangwangId}`);
} else {
console.warn(`无法获取旺旺ID: ${shopUrl}`);
}
// 防止请求过于频繁
await this.sleep(1000);
} catch (error) {
console.error(`处理店铺出错: ${shopUrl}`, error);
}
}
AI 代码解读
}
// 从URL提取店铺ID
extractShopId(url) {
const match = url.match(/shop(\d+).taobao/);
return match ? match[1] : null;
}
// 调用淘宝API获取旺旺ID
async getWangWangId(shopId) {
if (!shopId) return null;
const params = {
method: "taobao.shop.get",
app_key: this.APP_KEY,
session: "YOUR_SESSION_KEY",
timestamp: new Date().toISOString(),
format: "json",
v: "2.0",
sign_method: "md5",
fields: "sid,cid,title,nick,desc",
sid: shopId
};
// 生成签名
params.sign = this.generateSign(params);
try {
const response = await fetch(this.buildRequestUrl(params));
const data = await response.json();
if (data.error_response) {
console.error("API错误:", data.error_response);
return null;
}
return data.shop_get_response?.shop?.nick || null;
} catch (error) {
console.error("API请求失败:", error);
return null;
}
AI 代码解读
}
// 生成API签名
generateSign(params) {
const sortedKeys = Object.keys(params).sort();
let signStr = this.APP_SECRET;
for (const key of sortedKeys) {
signStr += key + params[key];
}
signStr += this.APP_SECRET;
return md5(signStr).toUpperCase(); // 需要引入MD5库
AI 代码解读
}
// 构建请求URL
buildRequestUrl(params) {
const queryString = Object.entries(params)
.map(([key, value]) => ${key}=${encodeURIComponent(value)}
)
.join("&");
return ${this.API_ENDPOINT}?${queryString}
;
}
// 导出结果
exportResults() {
const results = [];
for (const [shopUrl, wangwangId] of this.wangwangMap) {
results.push(${shopUrl},${wangwangId}
);
}
const blob = new Blob([results.join("\n")], { type: "text/csv" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "wangwang_ids.csv";
a.click();
console.log("结果已导出为CSV文件");
AI 代码解读
}
// 延时函数
sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
}
// 使用示例
const crawler = new WangWangCrawler();
crawler.init();
- MD5加密函数
- 用于生成API签名
*/
function md5(string) {
function rotateLeft(lValue, iShiftBits) {
return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
}
function addUnsigned(lX, lY) {
const lX8 = lX & 0x80000000;
const lY8 = lY & 0x80000000;
const lX4 = lX & 0x40000000;
const lY4 = lY & 0x40000000;
const lResult = (lX & 0x3fffffff) + (lY & 0x3fffffff);
if (lX4 & lY4) return lResult ^ 0x80000000 ^ lX8 ^ lY8;
if (lX4 | lY4) {
if (lResult & 0x40000000) return lResult ^ 0xc0000000 ^ lX8 ^ lY8;
else return lResult ^ 0x40000000 ^ lX8 ^ lY8;
} else return lResult ^ lX8 ^ lY8;
AI 代码解读
}
function F(x, y, z) { return (x & y) | (~x & z); }
function G(x, y, z) { return (x & z) | (y & ~z); }
function H(x, y, z) { return x ^ y ^ z; }
function I(x, y, z) { return y ^ (x | ~z); }
function FF(a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(F(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
}
function GG(a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(G(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
}
function HH(a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(H(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
}
function II(a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(I(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
}
function convertToWordArray(string) {
let lWordCount;
const lMessageLength = string.length;
const lNumberOfWordsTemp1 = lMessageLength + 8;
const lNumberOfWordsTemp2 = (lNumberOfWordsTemp1 - (lNumberOfWordsTemp1 % 64)) / 64;
const lNumberOfWords = (lNumberOfWordsTemp2 + 1) * 16;
const lWordArray = Array(lNumberOfWords - 1);
let lBytePosition = 0;
let lByteCount = 0;
while (lByteCount < lMessageLength) {
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray[lWordCount] = lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition);
lByteCount++;
}
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
return lWordArray;
AI 代码解读
}
function wordToHex(lValue) {
let wordToHexValue = "";
for (let lCount = 0; lCount <= 3; lCount++) {
const lByte = (lValue >>> (lCount * 8)) & 255;
wordToHexValue += ("0" + lByte.toString(16)).slice(-2);
}
return wordToHexValue;
AI 代码解读
}
let x = [];
let k, AA, BB, CC, DD, a, b, c, d;
const S11 = 7, S12 = 12, S13 = 17, S14 = 22;
const S21 = 5, S22 = 9, S23 = 14, S24 = 20;
const S31 = 4, S32 = 11, S33 = 16, S34 = 23;
const S41 = 6, S42 = 10, S43 = 15, S44 = 21;
string = unescape(encodeURIComponent(string));
x = convertToWordArray(string);
a = 0x67452301;
b = 0xEFCDAB89;
c = 0x98BADCFE;
d = 0x10325476;
for (k = 0; k < x.length; k += 16) {
AA = a;
BB = b;
CC = c;
DD = d;
a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);
c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
a = II(a, b, c, d, x[k + 0], S41, 0xF4292244);
d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
c = II(c, d, a, b, x[k + 6], S43, 0xA3014314);
b = II(b, c, d, a, x[k + 13],
AI 代码解读