您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
基于-淘宝买家订单导出这个插件做了一些拓展
// ==UserScript== // @name 淘宝买家订单导出插件 // @namespace http://tampermonkey.net/ // @version 0.4 // @description 基于-淘宝买家订单导出这个插件做了一些拓展 // @author kubrick // @include https://buyertrade.taobao* // @require https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js // @grant none // @license MIT // ==/UserScript== function addButton(element, onclickFunc, color, value = "按钮", width = "40px", height = "40px",) { const button = document.createElement("input"); button.type = "button"; button.value = value; button.style.height = height; button.style.width = width; button.style.align = "center"; button.style.marginBottom = "10px"; button.style.marginLeft = "50px"; button.style.color = "white"; button.style.background = color; button.style.border = "1px solid #409EFF"; button.onclick = function () { onclickFunc(); } element.appendChild(button); element.insertBefore(button, element.childNodes[0]); } const orderListPage = /(http|https):\/\/buyertrade\.taobao.*?\/trade/g; const buttonWidth = "80px" if (orderListPage.exec(document.URL)) { const orderListMain = document.getElementById("J_bought_main"); addButton(orderListMain, addCurrentPageOrdersToList, "#1E90FF", "添加当页订单", buttonWidth,); addButton(orderListMain, addOrdersToReportListV2, "#1E90FF", "添加昨日订单", buttonWidth); addButton(orderListMain, cleanOrderList, "#1E90FF", "清除订单", buttonWidth); addButton(orderListMain, exportOrders, "#1E90FF", "导出订单", buttonWidth); addButton(orderListMain, timerReportYesterday, "#1E90FF", "定时导出订单", buttonWidth); } let flag = true let yesterday = getYesterday() // 添加昨日订单到导出列表 function addOrdersToReportListV2() { // 1、循环所有的页面订单,小于指定日期直接进行返回 // 2、先获取当前页面的,有下一页就获取下一页,直到没有下一页。 get_next_page_order(yesterday) while (flag) { document.getElementsByClassName("pagination-next")[0].click(); // 延迟执行 sleep(get_next_page_order, 2000); } console.info("添加订单成功!") } // 跳转到下一页(需要递归) function get_next_page_order(time) { const orders = document.getElementsByClassName("js-order-container"); if (orders == null || orders == undefined) { return } for (let order of orders) { let items = processOrder(order, yesterday); if (!items) { continue; } _.forEach(items, (value, key) => { orderList[key] = value; }) } console.info("添加了: (" + Object.keys(orderList).length + ") 条订单") } // 导出csv function toCsv(header, data, filename) { let rows = ""; let row = header.join(","); rows += row + "\n"; _.forEach(data, value => { rows += _.replace(value.join(","), '#', '@') + "\n"; }) let blob = new Blob(["\ufeff" + rows], { type: 'text/csv;charset=utf-8;' }); let encodedUrl = URL.createObjectURL(blob); let url = document.createElement("a"); url.setAttribute("href", encodedUrl); url.setAttribute("download", filename + ".csv"); document.body.appendChild(url); url.click(); } // 清空 function cleanOrderList() { let count = Object.keys(orderList).length orderList = {} console.info("清除订单成功!") console.info("清除了: (" + count + ") 条订单") } let orderList = {} // 添加当前页面的订单到导出列表 function addCurrentPageOrdersToList() { const orders = document.getElementsByClassName("js-order-container"); for (let order of orders) { let items = processOrder(order, null); if (!items) { continue; } _.forEach(items, (value, key) => { orderList[key] = value; }) } console.info("添加订单成功!") } function exportOrders() { const header = ["订单号", "下单日期", "商品明细", "商品链接", "单价", "数量", "实付款", "状态"]; toCsv(header, orderList, "淘宝订单导出") } // 处理订单-获取订单的详细信息 function processOrder(order, time) { let outputData = {}; let textContent = order.textContent; let pattern = /(\d{4}-\d{2}-\d{2})订单号: ()/; let isExist = pattern.exec(textContent); let insuranceText = "保险服务"; if (!isExist) { console.log('暂未发现订单!'); } else { const date = isExist[1]; const id = order.querySelector("div[data-id]").getAttribute("data-id"); let index = 0; if (time != undefined) { if (time != null) { if (date != time) { if (date < time) { flag = false return } return } } } let productQuery = order.querySelector("span[data-reactid='.0.7:$order-" + id + ".$" + id + ".0.1:1:0.$" + index + ".$0.0.1.0.0.1']"); let priceQuery = order.querySelector("span[data-reactid='.0.7:$order-" + id + ".$" + id + ".0.1:1:0.$" + index + ".$1.0.1.1']"); let countQuery = order.querySelector("p[data-reactid='.0.7:$order-" + id + ".$" + id + ".0.1:1:0.$" + index + ".$2.0.0']"); let actualPayQuery = order.querySelector("span[data-reactid='.0.7:$order-" + id + ".$" + id + ".0.1:1:0.$" + index + ".$4.0.0.2.0.1']"); let itemUrlQuery = order.querySelector("a[href]"); if (productQuery === null) { return; } let price = priceQuery.textContent; if (productQuery.textContent == insuranceText) { return; } let count = countQuery.textContent; let actualPay; if (actualPayQuery != null) { // 实付金额 actualPay = actualPayQuery.textContent; } else { count = 1; } let orderStatus = "" if (index === 0) { let statusQuery = order.querySelector("span[data-reactid='.0.7:$order-" + id + ".$" + id + ".0.1:1:0.$" + index + ".$5.0.0.0']"); // 订单状态 orderStatus = statusQuery.textContent; } let itemUrl = itemUrlQuery.href index++; outputData[id + index] = [ id, date, productQuery.textContent.replace(/,/g, ","), itemUrl, parseFloat(price), count, actualPay, orderStatus, ] } return outputData; } // 定时导出订单 function timerReportYesterday() { console.info("定时导出订单开始处理!") // 启动定时器-定时导出订单数据 setInterval(exportYesterday, 100000); } // 今天是否已经导出过订单 let todayExecuteFlag = false function exportYesterday() { let y = getYesterday(); let t = getToDay(); // 判断今天是否执行过一次 if (t > y && !todayExecuteFlag) { addOrdersToReportListV2() exportOrders() todayExecuteFlag = true } } // 格式化时间 function formatDate(date) { const year = date.getFullYear() let month = date.getMonth() + 1 let day = date.getDate() if (month < 10) { month = `0${month}` } if (day < 10) { day = `0${day}` } return (`${year}-${month}-${day}`) } // 获取昨天日期 function getYesterday() { return getDate(-1); } // 获取今天日期 function getToDay() { return getDate(0); } function getDate(days) { const date = new Date() const year = date.getFullYear() const month = date.getMonth() const day = date.getDate() return formatDate(new Date(year, month, day + days)) } // setTimeout let sleep = function (fun, time) { setTimeout(() => { fun(); }, time); } function openClosePage() { const url = "https://trade.tmall.com/detail/orderDetail.htm?spm=a1z09.2.0.0.67002e8dTwCepX&bizOrderId=2944899865585097114"; let result = getSyncUrlResponse(url) console.info(result) } function getSyncUrlResponse(url) { var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.open("GET", url, false); xhr.send(); return xhr.responseText; }