您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
聚水潭-ajax版本-批量解密订单,保存到本地
// ==UserScript== // @name 聚水潭-ajax版本 // @namespace [https://sc.scm121.com/] // @version 0.1 // @description 聚水潭-ajax版本-批量解密订单,保存到本地 // @author Lzq // @run-at document-end // @license MIT // @match https://sc.scm121.com/* // @match *erp321.com/ // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_getValue // @grant GM_addStyle // @connect innerorder.scm121.com // @connect sc.scm121.com // @connect erp321.com // ==/UserScript== (function () { 'use strict' const apiFunList = { // 游客登陆 获取token getGuessTokenApi: (time) => `https://erp321.com/app/drp/drp_common.aspx?ts___=${time}&am___=GetRedirectToken`, getGuessTokenFun: () => { const delInput = document.getElementById('__VIEWSTATE').value const rotor = document.getElementById('__VIEWSTATEGENERATOR').value return new Promise((resolve) => { GM_xmlhttpRequest({ url: apiFunList.getGuessTokenApi(new Date().getTime()), method: 'POST', data: `__VIEWSTATE_DEL=${ delInput && encodeURI(delInput) }&__VIEWSTATEGENERATOR=${ rotor && encodeURI(rotor) }&__CALLBACKID=ACall1&__CALLBACKPARAM=%7B%22Method%22%3A%22GetRedirectToken%22%2C%22CallControl%22%3A%22%7Bpage%7D%22%7D&__VIEWSTATE=`, contentType: false, headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, onload: function (xhr) { console.log('游客token', xhr.responseText) resolve(xhr.responseText) }, }) }) }, // 登陆 获取token getTokenApi: `https://sc.scm121.com/api/report/open/login/erpJointLoginGyl2`, getTokenFun: () => { return new Promise((resolve) => { GM_xmlhttpRequest({ url: apiFunList.getTokenApi, method: 'POST', data: JSON.stringify({ fromSource: 'erp_nav_print' }), headers: { 'content-type': 'application/json', token: initPublicData.guessToken, }, onload: function (xhr) { console.log('TOken', xhr.responseText) resolve(xhr.responseText) }, }) }) }, // 获取会员信息 包含uid coid userInfoApi: `https://sc.scm121.com/api/company/user/supplier/getUserInfo?supplierType=shop&terminalName=SUPPLIER`, getUserInfo: () => { return new Promise((resolve) => { GM_xmlhttpRequest({ url: apiFunList.userInfoApi, method: 'GET', headers: { authorization: initPublicData.token, }, onload: function (xhr) { console.log('请求的数据', xhr.responseText) resolve(xhr.responseText) }, }) }) }, // 获取数据列表 已取消 已发货 pageListApi: 'https://innerorder.scm121.com/api/inner/supOrder/getErpNormalOrders', getPageList: () => { return new Promise((resolve) => { GM_xmlhttpRequest({ url: apiFunList.pageListApi, method: 'POST', data: JSON.stringify(initSCObject.pageObject), headers: { 'Content-type': 'application/json', accept: 'application/json', authorization: initPublicData.token, }, onload: function (xhr) { console.log('请求的数据', xhr.responseText) resolve(xhr.responseText) }, }) }) }, // 待发货 waitConfirmApi: `https://innerorder.scm121.com/api/inner/saleOutOrder/list`, waitConfirmFun: (pageObject) => { return new Promise((resolve) => { GM_xmlhttpRequest({ url: apiFunList.waitConfirmApi, method: 'POST', data: pageObject, headers: { 'Content-type': 'application/json', accept: 'application/json', authorization: initPublicData.token, }, onload: function (xhr) { console.log('请求的数据', xhr.responseText) resolve(xhr.responseText) }, }) }) }, // 解密 decryptionApi: 'https://innerorder.scm121.com/api/inner/innerOrder/decryption', decryptionFun: (data) => { console.log('进入参数', data) return new Promise((resolve) => { GM_xmlhttpRequest({ url: apiFunList.decryptionApi, method: 'POST', data, headers: { 'Content-type': 'application/json', accept: 'application/json', authorization: initPublicData.token, }, onload: function (xhr) { resolve(xhr.responseText) }, }) }) }, // 获取店铺列表 getShopListApi: `https://sc.scm121.com/api/company/shop/queryAllShopForOrder`, getShopList: () => { return new Promise((resolve) => { GM_xmlhttpRequest({ url: apiFunList.getShopListApi, method: 'GET', headers: { authorization: initPublicData.token, }, onload: function (xhr) { console.log('请求的店铺数据', xhr.responseText) resolve(xhr.responseText) }, }) }) }, } // 公共函数 const PublicFun = { // 获取Cookie内容 getCookie: (name) => { var arr, reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)') if ((arr = document.cookie.match(reg))) { return unescape(arr[2]) } else { return null } }, // 下载txt download: (filename, text) => { var element = document.createElement('a') let ttt = '' text.forEach((res) => { ttt = ttt + res }) element.setAttribute( 'href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(ttt) ) element.setAttribute('download', filename) element.style.display = 'none' document.body.appendChild(element) element.click() document.body.removeChild(element) }, } // 公共数据 const initPublicData = { userNamePhoneData: [], page: 1, limit: 10, guessToken: '', token: '', coId: '', uid: '', userAllData: [], shopId: '', combined: 0, listData: null, getTokenFuns: () => { return new Promise((resolve, rej) => { apiFunList.getTokenFun().then((res) => { console.log('res', res) const resJson = JSON.parse(res) if (resJson.success) { if (resJson.data || resJson.data.token) { initPublicData.token = resJson.data.token.refresh_token resolve(true) return } rej(true) return } rej(false) }) }) }, combinedInit: 0, // 累加器 //获取Uid Coid Function getUCOIDFun: () => { apiFunList.getUserInfo().then((res) => { const resJson = JSON.parse(res) if (resJson.success) { initPublicData.coId = resJson.data.coCompanyUser.coId initPublicData.uid = resJson.data.coCompanyUser.uid initSCObject.pageObject.coId = resJson.data.coCompanyUser.coId initSCObject.pageObject.uid = resJson.data.coCompanyUser.uid // 请求列表 // initSCObject.getPageFun() } // initPublicData.userAllData = resJson console.log('this', initPublicData) }) }, } // 已取消 已发货订单 const initSCObject = { //订单状态序号序号 orderStatusNum: 0, // 订单状态 orderStatus: ['Sent', 'Cancelled'], //Sent 已发货 Cancelled 已取消 // 获取页面的对象 pageObject: { dateQueryType: 'OrderDate', coId: initPublicData.coId, uid: initPublicData.uid, upSendFailed: false, shopIds: [], expertName: { leftValue: 'referrerName', }, pageNum: initPublicData.page, pageSize: initPublicData.limit, orderStatus: [], }, getPageFun: () => { return new Promise((resolve, rej) => { apiFunList.getPageList().then((res) => { // console.log('列表数据',res) const resJson = JSON.parse(res) if (resJson.success) { initPublicData.listData = resJson.data initPublicData.combined = initPublicData.listData.length resolve(resJson.data) // 解密函数 // decryptionObject.decryptionFun(initPublicData.combinedInit) } }) }) }, // 获取token } // 解密 const decryptionObject = { resnumcon: 5, // 错误重试次数 resetNum: 0, // 空数据计数器 errorResetNum: 0, // 失败计数器 decryptionData: { shopId: '', coId: '', items: [ { address: '', name: '', mobile: '', rawSoId: '', }, ], fuzzy: false, }, savaDataFun: () => { if(!initPublicData.userAllData || !initPublicData.userAllData.length) { alert('你不获取数据,我保存什么东西???') return } const spliterconte = initPublicData.userAllData.map(res => { return `${res.name} ${res.phone} ${res.address} ${res.shopList} ${res.shopName}\n` }) var myDate = new Date() PublicFun.download( `聚水潭 - ${myDate.getFullYear()}-${ myDate.getMonth() + 1 }-${myDate.getDate()} ${myDate.getHours()}:${myDate.getMinutes()}:${myDate.getSeconds()} --- ${ initPublicData.combined }条.txt`, spliterconte ) return }, decryptionFun: (num) => { console.log('initPublicData.listData', initPublicData.userAllData[num]) const numDatalist = initPublicData.userAllData[num] const userInfoData = numDatalist.fullReceiveData && JSON.parse(numDatalist.fullReceiveData) const fuzzFullReceiverInfo = numDatalist.fuzzFullReceiverInfo && JSON.parse(numDatalist.fuzzFullReceiverInfo) console.log('userInfoDatauserInfoData====>>>>', userInfoData) if (userInfoData) { decryptionObject.decryptionData.shopId = numDatalist.shopId decryptionObject.decryptionData.coId = initPublicData.coId decryptionObject.decryptionData.items = [ { address: userInfoData.ReceiverAddress || '', name: userInfoData.ReceiverName || '', mobile: userInfoData.ReceiverPhone || '', rawSoId: numDatalist.soId || '', }, ] apiFunList .decryptionFun( JSON.stringify(decryptionObject.decryptionData) ) .then((res) => { const resJson = JSON.parse(res) if (resJson.success) { if (!resJson.data.length) { // 重试n次后跳出 if (decryptionObject.resetNum < decryptionObject.resnumcon) { decryptionObject.resetNum++ decryptionObject.decryptionFun(num) return } decryptionObject.resetNum = 0 initPublicData.combinedInit++ decryptionObject.decryptionFun( initPublicData.combinedInit ) return } const userAddInfos = { name: resJson.data[0].name, address: resJson.data[0].address, mobile: resJson.data[0].mobile, } if(!userAddInfos.mobile) { const r = confirm(resJson.data[0].message + ',申请后点击确认继续,或者取消保存已有数据;'); if(r) { decryptionObject.decryptionFun(num) } return } initPublicData.userAllData[num].name = userAddInfos.name initPublicData.userAllData[num].phone = userAddInfos.mobile initPublicData.userAllData[num].address = initPublicData.userAllData[num].touAddrs + userAddInfos.address addDom.resetTabDom(num) // 保存到本地 // decryptionObject.savaDataFun( // userAddInfos, // numDatalist // ) if (initPublicData.combinedInit == initPublicData.combined-1) { // 数据保存到本地 setTimeout(_=>{ alert('已完成') }, 1000) return } initPublicData.combinedInit++ decryptionObject.decryptionFun(initPublicData.combinedInit) console.log('解密数据', res) return } console.log('错误', res) // 重试n次后跳出 if (decryptionObject.errorResetNum < decryptionObject.resnumcon) { decryptionObject.decryptionFun(num) decryptionObject.errorResetNum++ return } decryptionObject.errorResetNum = 0 initPublicData.combinedInit++ decryptionObject.decryptionFun( initPublicData.combinedInit ) }) } else { console.clear() console.log('没有加密的数据', fuzzFullReceiverInfo) const userAddInfos = { name: fuzzFullReceiverInfo.receiver_name, address: fuzzFullReceiverInfo.receiver_address, mobile: fuzzFullReceiverInfo.receiver_mobile, } if (initPublicData.combinedInit == initPublicData.combined-1) { // 数据保存到本地 setTimeout(_=>{ alert('已完成') }, 1000) return } // decryptionObject.savaDataFun(userAddInfos, numDatalist) } } } const addDom = { content: `<div class="topboxcontent" onClick="(()=>event.stopPropagation())()"> <div class="tables" style="color: red"> 每日订单解密数量有限;<br/> 根据抖音后台提供数量支持<br/> 可到抖店服务市场内申请解密额度使用 </div> <div class="tables">选择店铺: <form id='selectcontents'> </form> </div> <div class="tables">选择订单状态: <form id='selectOrderStatus'> <span class="conshge"><input name="order" class="ordechrngd" type="radio" value="WaitConfirm" />待发货</span> <span class="conshge"><input name="order" class="ordechrngd" type="radio" value="Cancelled" />已取消</span> <span class="conshge"><input name="order" class="ordechrngd" type="radio" value="Sent" />已发货</span> </form> </div> <div class="tables">第: <input name="pageNum" class="pageclass" id="classnums" type="number" min="1" value="${initSCObject.pageObject.pageNum}" style="width: 50px"/> 页开始</div> <div class="tables">解密: <input name="pageNum" class="pageclass" id="classnumsunhs" type="number" min="1" max="500" value="${initSCObject.pageObject.pageSize}" /> 条数据</div> <div class="consthe"> <table border="1" > <tbody> <tr> <th>姓名</th> <th>电话</th> <th>地址</th> <th>图片</th> <th>商品</th> <th>订单状态</th> <th>快递</th> <th>店铺</th> </tr> </tbody> <tbody id="tablistDom"> </tbody> </table> </div> <div class="boutonContent"> <button class="butons" id="getData">获取数据</button> <button class="butons" id="openData">开始解密</button> <button class="butons" id="saveData">保存到本地</button> <button class="butons" id="clearBox" style="color: red">关闭页面</button> </div> </div>`, selictDom: ``, addFun: () => { const dome = document.getElementById('tab_list') if (dome) { let newSpan = document.createElement('span') newSpan.className = 'tab-item' newSpan.style.color = 'red' newSpan.innerHTML = '订单解密功能' dome.append(newSpan) // addDom.funOpenContent() newSpan.addEventListener('click', addDom.funOpenContent) } }, // 功能弹窗 funOpenContent: () => { let newDiv = document.createElement('div') document.body.append(newDiv) newDiv.className = 'tobero-pages' newDiv.id = 'pagehs' newDiv.innerHTML = addDom.content apiFunList.getShopList().then((res) => { console.log('店铺数据:', res) const resJson = JSON.parse(res) if (resJson.success) { addDom.selictDom = `<span class="conshge"><input name="Fruit" class="chengnums" type="radio" value="0" />线下</span>` resJson.data.forEach((resq, i) => { addDom.selictDom = addDom.selictDom + `<span class="conshge"><input name="Fruit" class="chengnums" type="radio" value="${resq.shopId}" />${resq.shopName}</span>` }) document.getElementById('selectcontents').innerHTML = addDom.selictDom addDom.addDomFun() } }) }, resetTabDom(num) { console.log(num) const tagbse = document.getElementById('tablistDom') const chjyen = tagbse.getElementsByTagName('tr')[num].getElementsByTagName('th') console.log('chjyen', chjyen) chjyen[0].innerText = initPublicData.userAllData[num].name chjyen[1].innerText = initPublicData.userAllData[num].phone chjyen[2].innerText = initPublicData.userAllData[num].address }, // 绑定事件 addDomFun: () => { // 选择店铺 const inputNum = document.getElementsByClassName('chengnums') for (let i = 0; i < inputNum.length; i++) { console.log('resaa', inputNum[i]) inputNum[i].addEventListener('click', () => { initPublicData.shopId = inputNum[i].value initSCObject.pageObject.shopIds = [inputNum[i].value] console.log( 'initSCObject.pageObject', initSCObject.pageObject ) }) } // 修改页 const inputPage = document.getElementById('classnums') inputPage.addEventListener('change', () => { initSCObject.pageObject.pageNum = inputPage.value * 1 console.log('initSCObject.pageObject', initSCObject.pageObject) }) // 修改条 const inputSize = document.getElementById('classnumsunhs') inputSize.addEventListener('change', () => { initSCObject.pageObject.pageSize = inputSize.value * 1 console.log('initSCObject.pageObject', initSCObject.pageObject) }) // 选择状态 const inputStatus = document.getElementsByClassName('ordechrngd') for (let i = 0; i < inputStatus.length; i++) { console.log('resaa', inputStatus[i]) inputStatus[i].addEventListener('click', () => { initSCObject.pageObject.orderStatus = [inputStatus[i].value] console.log( 'initSCObject.pageObject', initSCObject.pageObject ) }) } // 获取数据 const getdatadom = document.getElementById('getData') getdatadom.addEventListener('click', () => { if(!initSCObject.pageObject.shopIds || !initSCObject.pageObject.shopIds.length) { alert('必须选一个店铺哈~') return } if(!initSCObject.pageObject.orderStatus || !initSCObject.pageObject.orderStatus.length) { alert('选个订单状态~') return } console.log('获取数据') initPublicData.userAllData = [] console.log('initSCObject.pageObject.orderStatus', initSCObject.pageObject.orderStatus) // 待发货 if(initSCObject.pageObject.orderStatus.includes('WaitConfirm')) { const datas = { "coId": initPublicData.coId, "uid": initPublicData.uid, "pageNum": initPublicData.page, "pageSize": initPublicData.limit, "saleOutStatus": "WaitConfirm", "shopId": initPublicData.shopId, "sortByPayDate": "asc" } console.log('datasdatas', datas) apiFunList.waitConfirmFun(JSON.stringify(datas)).then(res => { const resJSON = JSON.parse(res) initPublicData.combined = resJSON.data.length dataFamate(resJSON.data.map(asd => { asd.disInnerOrderGoodsViewList = asd.goodsInfo return asd })) }) return } // 已发货已取消 initSCObject.getPageFun().then((res) => { console.log('格式的', res) dataFamate(res) }) console.log('initPublicData.userAllData', initPublicData.userAllData) }) // 数据格式化 const dataFamate = function(res) { let datalistDom = `` const tablistDom = document.getElementById('tablistDom') res.forEach((as) => { const fullReceiveData = as.fullReceiveData && JSON.parse(as.fullReceiveData) const fuzzFullReceiverInfo = as.fuzzFullReceiverInfo && JSON.parse(as.fuzzFullReceiverInfo) const datainfos = { name: (fullReceiveData && fullReceiveData.MaskName) || (fuzzFullReceiverInfo && fuzzFullReceiverInfo.receiver_name), phone: (fullReceiveData && fullReceiveData.MaskPhone) || (fuzzFullReceiverInfo && fuzzFullReceiverInfo.receiver_mobile), address: as.receiverState + as.receiverCity + as.receiverDistrict + ((fullReceiveData && fullReceiveData.MaskAddress) || (fuzzFullReceiverInfo && fuzzFullReceiverInfo.receiver_address)), shopList: as.disInnerOrderGoodsViewList.map( (resasd) => { return `${resasd.properties}` } ), pic: as.disInnerOrderGoodsViewList.map( (resasd) => { return{src: resasd.pic, dom: `<img src=${resasd.pic} style="width: 30px;height: 30px"/>` } } ), touAddrs: as.receiverState + as.receiverCity + as.receiverDistrict , errorMsg: as.errorMsg, expressCompany: as.expressCompany, shopName: as.shopName, fullReceiveData: as.fullReceiveData, fuzzFullReceiverInfo: as.fuzzFullReceiverInfo, shopId: as.shopId, soId: as.soId } initPublicData.userAllData.push(datainfos) datalistDom = datalistDom + `<tr> <th style="width: 50px">${datainfos.name}</th> <th>${datainfos.phone}</th> <th>${datainfos.address}</th> <th>${datainfos.pic[0].dom}</th> <th>${datainfos.shopList}</th> <th>${datainfos.errorMsg}</th> <th>${datainfos.expressCompany}</th> <th>${datainfos.shopName}</th> </tr>` tablistDom.innerHTML = datalistDom console.log('fullReceiveData', fullReceiveData) console.log( 'fuzzFullReceiverInfo', fuzzFullReceiverInfo ) }) } // 开始解密 const statrdecryptionFun = document.getElementById('openData') statrdecryptionFun.addEventListener('click', () => { if(!initPublicData.userAllData || !initPublicData.userAllData.length) { alert('先获取数据呀~~~') return } decryptionObject.decryptionFun(0) }) // 保存按钮 const saveDataFun = document.getElementById('saveData') saveDataFun.addEventListener('click', () => { decryptionObject.savaDataFun(0) }) // 关闭弹窗 const clearBox = document.getElementById('clearBox') clearBox.addEventListener('click', () => { const newDiv = document.getElementById('pagehs') const r = confirm("你关了数据就没了, 想想好先"); if (r) { initPublicData.page = 1 initPublicData.userAllData = [] initPublicData.limit = 10 initPublicData.combined = 0 initPublicData.listData = null initPublicData.combinedInit = 0 initSCObject.pageObject.shopIds = [] initSCObject.pageObject.orderStatus = [] newDiv.remove() } }) }, } //初始化 const init = function () { // 渲染页面 window.onload = function () { apiFunList.getGuessTokenFun().then((res) => { const strin = res.split('|')[1] const resJson = JSON.parse(strin) if (resJson.IsSuccess) { initPublicData.guessToken = resJson.ReturnValue initPublicData.getTokenFuns().then((res) => { initPublicData.getUCOIDFun() addDom.addFun() }) } }) } // 开始解密过程 } // 样式 GM_addStyle(` .tobero-pages { width: 100vw !important; height: 100vh !important; background: rgba(0,0,0,0.3); position: fixed; top: 0; left: 0; z-index: 9999999999; display: flex; justify-content: center; align-items: center; } .topboxcontent { width: 60%; min-height:50px; background: #fff; border-radius: 10px; padding: 20px; } .topboxcontent .tables { padding:10px 0; border-bottom: 1px solid #eee; } .chengnums { padding-right: 10px } .conshge { padding: 10px 10px 10px 0; } .consthe { max-height: 300px; overflow: scroll; margin: 10px 0; } `) init() })()
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址