const lk = new ToolKit(`电信助手`, `Telecom`); const TelecomConstKey = { // -----通用助手相关的----- Mobile: 'lkTelecomMobile', Password: 'lkTelecomPassword', SignCount: 'lkTelecomSignCount', Token: 'lkTelecomToken', }; let telecomMobile = lk.getVal(TelecomConstKey.Mobile); let telecomPassword = lk.getVal(TelecomConstKey.Password); //公钥 const publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBkLT15ThVgz6/NOl6s8GNPofdWzWbCkWnkaAm7O2LjkM1H7dMvzkiqdxU02jamGRHLX/ZNMCXHnPcW/sDhiFCBN18qFvy8g6VYb9QtroI09e176s+ZCtiv7hbin2cCTj99iUpnEloZm19lwHyo69u5UMiPMpq0/XKBO8lYhN/gwIDAQAB'; //私钥 const privateKey = ''; const GCommoTelecomHeads = { "Accept": "application/json", "Content-Type": "application/json; charset=UTF-8", "Connection": "Keep-Alive", "Accept-Encoding": "gzip", }; if (!lk.isExecComm) { if (lk.isRequest()) { checkHandleRequest(); if (retBody) { lk.done({ body: JSON.stringify(retBody) }); } else { lk.done(); } }else{ all(); } } function checkHandleRequest() { } function getSignCount() { let SignCount = lk.getVal(TelecomConstKey.SignCount); let td = lk.formatDate(new Date(), 'yyyyMMdd'); if (SignCount) { let [date, num] = SignCount.split('_'); if (date == td && num) { return Number(num); } else { lk.setVal(TelecomConstKey.SignCount, `${td}_0`); return 0; } } else { lk.setVal(TelecomConstKey.SignCount, `${td}_0`); return 0; } } async function all() { if (!lk.isEmpty(telecomMobile) || !lk.isEmpty(telecomPassword)) { lk.log('⚠️ 请配置手机号(lkTelecomMobile)和密码(lkTelecomPassword)'); return; } await doLogin(); lk.msg(''); lk.done(); } //RSA加密 function encryptRSA(data, key = publicKey) { let JSEncrypt = createJSEncrypt(); let encryptor = new JSEncrypt() encryptor.setPublicKey(key) // 如果是对象/数组的话,需要先JSON.stringify转换成字符串 return encryptor.encrypt(data) } //rea解密 function decryptRSA(data, key = privateKey) { let JSEncrypt = createJSEncrypt(); let encryptor = new JSEncrypt() encryptor.setPrivateKey(key) // 如果是对象/数组的话,需要先JSON.stringify转换成字符串 return encryptor.decrypt(data) } function transPhone(phoneNum) { let result = ''; let ArrPhone = phoneNum.toString().split(''); for (let i = 0; i < 11; i++) { result = `${result}` + String.fromCharCode(ArrPhone[i].charCodeAt(0) + 2 & 65535); } return result; } async function doLogin(){ if (getSignCount() > 10) { lk.appendNotifyInfo('⚠️ 当日登录已超过10次! 请明天再试'); return; } let timestamp = lk.formatDate(new Date(),'yyyyMMddHHmm00') let loginStr = `iPhone 14 16.6.1${telecomMobile}${telecomMobile}${timestamp}${telecomPassword}0$$$0.`; let body = { content: { fieldData: { accountType: '', authentication: telecomPassword, deviceUid: `3${telecomMobile}`, isChinatelecom: '0', loginAuthCipherAsymmertric: encryptRSA(loginStr), loginType: "4", phoneNum: transPhone(telecomMobile), systemVersion: "16.6.1", }, attach: "iPhone", }, headerInfos: { clientType: '#9.6.1#channel50#iPhone 14 Pro#', code: 'userLoginNormal', shopId: '20002', source: '110003', sourcePassword: 'Sid98s', timestamp: timestamp, userLoginName: telecomMobile, } } lk.log('--- request body:'); lk.log(JSON.stringify(body)); let reqData = { url: "https://appgologin.189.cn:9031/login/client/userLoginNormal", headers: GCommoTelecomHeads, body: JSON.stringify(body), }; lk.post(reqData, async (error, _response, data) => { let ret; try { if (error) { lk.log(`请求发生错误`); lk.execFail(); } else { lk.log('--- response body:'); lk.log(data); let info = JSON.parse(data); let loginInfo = info.responseData.data.loginSuccessResult; if (loginInfo && loginInfo.token) { lk.setVal(TelecomConstKey.Token, loginInfo.token); }else{ let errMsg = data.responseData.resultDesc || data.headerInfos.reason; if(errMsg){ lk.appendNotifyInfo(`⚠️ ${errMsg}`); } } } } catch (e) { lk.log(`请求发生错误`); lk.logErr(e); lk.execFail(); } finally { resolve(ret); } }); }