Files
temu-plugin/src/entry/background.js

272 lines
9.1 KiB
JavaScript
Raw Normal View History

2023-08-06 16:50:17 +08:00
/**
利用chrome的fetch来避免跨域
**/
2023-12-25 23:44:26 +08:00
2024-04-22 18:07:55 +08:00
import {getSign} from "@/api/aliExpress";
/**
* 根据图片URL获取Blob对象
* @param imageUrl
* @returns {Promise<unknown>}
*/
function getImageBlob(imageUrl) {
return new Promise((resolve) => {
fetch(imageUrl).then((response) => response.blob()) // 将响应转换为Blob对象
.then((blobData) => {
const fileName = imageUrl.match(/\/([^/]+)$/).at(-1)
const reader = new FileReader();
// 读取Blob对象的内容
reader.onloadend = function () {
const image = {blobData, fileName}
resolve({image});
};
reader.readAsArrayBuffer(blobData); // 将Blob对象作为参数传递给FileReader的readAsArrayBuffer()方法
})
});
}
2023-12-25 23:44:26 +08:00
2024-04-22 18:07:55 +08:00
/**
* 将cookie字符串转换为对象
* @param cookieString
* @returns {{}}
*/
function cookie2Obj(cookieString) {
const cookieArray = cookieString.split('; ');
const cookieObj = {};
for (let i = 0; i < cookieArray.length; i++) {
const [key, value] = cookieArray[i].split('=');
cookieObj[key] = value;
}
return cookieObj;
}
2023-08-06 16:50:17 +08:00
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.type == 'api') {
2023-12-25 23:44:26 +08:00
let headers = {}, data;
2023-08-15 17:09:00 +08:00
new Promise((resolve) => {
2023-08-06 16:50:17 +08:00
if (request.needMallId) {
headers.Mallid = request.mallId;
}
2023-08-15 17:09:00 +08:00
if (request.anti) {
2023-08-17 02:41:13 +08:00
headers["Anti-Content"] = request.anti
2023-08-15 17:09:00 +08:00
}
2023-12-25 21:18:46 +08:00
if (!request.isFormData) {
headers['Content-Type'] = 'application/json';
data = JSON.stringify(request.data)
} else {
console.log(request.data)
const formData = new FormData();
Object.keys(request.data).forEach(key => {
const value = request.data[key]
if (Array.isArray(value)) {
value.forEach((subValue, i) => {
formData.append(key + `[${i}]`, subValue)
})
} else {
2023-12-25 23:44:26 +08:00
if (key == "image") {
//跳过image的处理
} else formData.append(key, request.data[key])
2023-12-25 21:18:46 +08:00
}
})
data = formData
}
2023-08-06 16:50:17 +08:00
headers.cookie = getCookie();
2023-12-25 23:44:26 +08:00
if (request.isFormData && !!request.data.image) {//针对图片上传特殊的处理办法
2024-01-10 01:27:15 +08:00
getImageBlob(request.data.image).then(res => data.append('image', res.image.blobData)).then(resolve)
2023-12-25 23:44:26 +08:00
} else resolve()
}).then(() => fetch(request.url, {
headers, 'method': 'POST', 'referrerPolicy': 'no-referrer', 'credentials': 'include', 'body': data, 'mode': 'cors'
})).then(res => res.json()).then(sendResponse);
2023-10-12 13:16:12 +08:00
} else if (request.type == 'temuApi') {
new Promise((resolve) => {
let headers = {};
if (request.anti) {
headers["Anti-Content"] = request.anti
}
headers['Content-Type'] = 'application/json';
headers.cookie = getTemuCookie();
Promise.resolve().then(() => fetch(request.url, {
2023-12-25 23:44:26 +08:00
'headers': headers, 'method': 'POST', 'referrerPolicy': 'no-referrer', 'credentials': 'include', 'body': JSON.stringify(request.data), 'mode': 'cors'
2023-10-12 13:16:12 +08:00
})).then((res) => {
resolve(res.json());
2023-11-24 01:04:54 +08:00
}).catch(() => {
resolve({success: false, errorCode: -1})
2023-10-12 13:16:12 +08:00
});
}).then(sendResponse);
2023-09-25 10:13:54 +08:00
} else if (request.type == 'temu') {
new Promise((resolve) => {
let headers = {};
headers['Content-Type'] = 'text/html';
2023-12-16 22:56:15 +08:00
//headers.cookie = getTemuCookie();
2023-09-25 10:13:54 +08:00
Promise.resolve().then(() => fetch(request.url, {
2023-12-25 23:44:26 +08:00
'headers': headers, 'method': 'GET', 'referrerPolicy': 'no-referrer', //'credentials': 'include',
2023-09-25 10:13:54 +08:00
'mode': 'cors'
})).then((res) => {
// 创建了一个数据读取器
const reader = res.body.getReader();
// 创建了一个文本解码器
const decoder = new TextDecoder();
let text = ""
2023-12-25 23:44:26 +08:00
reader.read().then(function processText({done, value}) {
2023-09-25 10:13:54 +08:00
// Result 对象包含了两个属性:
// done - 当 stream 传完所有数据时则变成 true
// value - 数据片段。当 done 为 true 时始终为 undefined
if (done) {
resolve(text);
return;
}
// 将字节流转换为字符
text = text + decoder.decode(value)
// 再次调用这个函数以读取更多数据
return reader.read().then(processText);
});
});
}).then(sendResponse);
} else if (request.type == 'aliexpress') {
new Promise((resolve) => {
let headers = {};
headers['Content-Type'] = 'text/html';
headers.cookie = getAliexpressCookie();
2024-04-22 18:07:55 +08:00
const {_m_h5_c, _m_h5_tk} = cookie2Obj(headers.cookie)
2024-04-23 15:47:30 +08:00
const {appKey, formData, token} = request
const {sign, t} = getSign(token || _m_h5_c || _m_h5_tk, appKey, formData)
2024-04-22 18:07:55 +08:00
const url = new URL(request.url)
let params = new URLSearchParams(url.search);
params.append('sign', sign)
2024-04-23 14:02:12 +08:00
params.append('t', t)
2024-04-22 18:07:55 +08:00
url.search = params.toString()
Promise.resolve().then(() => fetch(url.toString(), {
'headers': headers, 'method': 'POST', 'referrerPolicy': 'no-referrer', 'credentials': 'include', 'mode': 'cors'
2023-09-25 10:13:54 +08:00
})).then((res) => {
// 创建了一个数据读取器
const reader = res.body.getReader();
// 创建了一个文本解码器
const decoder = new TextDecoder();
let text = ""
2023-12-25 23:44:26 +08:00
reader.read().then(function processText({done, value}) {
2023-09-25 10:13:54 +08:00
// Result 对象包含了两个属性:
// done - 当 stream 传完所有数据时则变成 true
// value - 数据片段。当 done 为 true 时始终为 undefined
if (done) {
resolve(text);
return;
}
// 将字节流转换为字符
text = text + decoder.decode(value)
// 再次调用这个函数以读取更多数据
return reader.read().then(processText);
});
});
}).then(sendResponse);
2023-12-25 21:18:46 +08:00
} else if (request.type == 'sheinApi') {
new Promise((resolve) => {
let headers = {};
headers['Content-Type'] = 'application/json';
headers.cookie = getSheinCookie()
request.params = formatParams(request.params)
2023-12-25 23:44:26 +08:00
let _url = request.url + (request.params ? ('?' + request.params) : '')
2023-12-25 21:18:46 +08:00
Promise.resolve().then(() => fetch(_url, {
2023-12-25 23:44:26 +08:00
'headers': headers, 'method': request.method, 'referrerPolicy': 'no-referrer', 'credentials': 'include', 'body': JSON.stringify(request.data), 'mode': 'cors'
2023-12-25 21:18:46 +08:00
})).then((res) => {
resolve(res.json());
});
}).then(sendResponse);
2023-08-06 16:50:17 +08:00
} else if (request.type == 'notify') {
2023-12-25 23:44:26 +08:00
chrome.notifications.create("" + Math.random(), {
type: "basic", title: "TEMU助手", message: "您店铺【" + request.mallName + "】的商品【" + request.productName + "】成功加入发货台,请尽快处理", iconUrl: "./icons/48.png"
}, null)
2023-08-06 16:50:17 +08:00
}
2023-08-06 16:50:17 +08:00
return true;
});
chrome.action.onClicked.addListener(function () {
chrome.tabs.create({
url: "./popup.html"
2023-08-06 16:50:17 +08:00
}, function (tab) {
console.log('tab is:' + tab);
2023-08-06 16:50:17 +08:00
});
});
2023-08-22 20:16:59 +08:00
chrome.webRequest.onSendHeaders.addListener(details => {
2023-12-25 23:44:26 +08:00
if (details.url && (details.url.indexOf('joinDeliveryGoodsOrderPlatform') != -1)) {
2023-08-22 20:16:59 +08:00
details.requestHeaders.push({
2024-02-23 10:29:39 +08:00
name: 'Referer', value: 'https://seller.kuajingmaihuo.com/main/order-manage'
2023-08-22 20:16:59 +08:00
})
2023-12-25 23:44:26 +08:00
for (let i = 0; i < details.requestHeaders.length; i++) {
2023-08-22 20:16:59 +08:00
if (details.requestHeaders[i].name == 'Origin') {
2024-02-23 10:29:39 +08:00
details.requestHeaders[i].value = 'https://seller.kuajingmaihuo.com'
2023-08-22 20:16:59 +08:00
break;
}
}
2023-12-25 23:44:26 +08:00
} else if (details.url && (details.url.indexOf('mms/userInfo') != -1)) {
2023-09-08 21:50:46 +08:00
details.requestHeaders.push({
2024-02-23 10:29:39 +08:00
name: 'Referer', value: 'https://seller.kuajingmaihuo.com/main/order-manage'
2023-09-08 21:50:46 +08:00
})
2023-12-25 23:44:26 +08:00
for (let i = 0; i < details.requestHeaders.length; i++) {
2023-09-08 21:50:46 +08:00
if (details.requestHeaders[i].name == 'Origin') {
2024-02-23 10:29:39 +08:00
details.requestHeaders[i].value = 'https://seller.kuajingmaihuo.com'
2023-09-08 21:50:46 +08:00
break;
}
}
2023-08-22 20:16:59 +08:00
}
2023-12-25 23:44:26 +08:00
}, {urls: ["<all_urls>"]}, ["requestHeaders", "extraHeaders"]);
2023-08-22 20:16:59 +08:00
2023-08-06 16:50:17 +08:00
function getCookie() {
2024-02-23 10:29:39 +08:00
const url = new URL("https://seller.kuajingmaihuo.com/");
2023-08-06 16:50:17 +08:00
let cStr = '';
chrome.cookies.getAll({domain: url.host}, (cookie) => {
cookie.map((c) => {
cStr += c.name + '=' + c.value + ';';
});
});
return cStr;
}
2023-09-25 10:13:54 +08:00
function getTemuCookie() {
const url = new URL("https://www.temu.com/");
let cStr = '';
chrome.cookies.getAll({domain: url.host}, (cookie) => {
cookie.map((c) => {
cStr += c.name + '=' + c.value + ';';
});
});
return cStr;
}
2023-12-25 21:18:46 +08:00
function getSheinCookie() {
const url = new URL("https://www.shein.com/");
let cStr = '';
chrome.cookies.getAll({domain: url.host}, (cookie) => {
cookie.map((c) => {
cStr += c.name + '=' + c.value + ';';
});
});
return cStr;
}
2023-09-25 10:13:54 +08:00
function getAliexpressCookie() {
2024-04-23 15:10:24 +08:00
const url = new URL("https://csp.aliexpress.com/");
2023-09-25 10:13:54 +08:00
let cStr = '';
chrome.cookies.getAll({domain: url.host}, (cookie) => {
cookie.map((c) => {
cStr += c.name + '=' + c.value + ';';
});
});
return cStr;
2023-12-25 21:18:46 +08:00
}
function formatParams(data) {
const arr = []
for (let name in data) {
arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name]))
}
return arr.join("&")
2023-12-25 23:44:26 +08:00
}