telecom.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. const lk = new ToolKit(`电信助手`, `Telecom`);
  2. const TelecomConstKey = {
  3. // -----通用助手相关的-----
  4. Mobile: 'lkTelecomMobile',
  5. Password: 'lkTelecomPassword',
  6. SignCount: 'lkTelecomSignCount',
  7. Token: 'lkTelecomToken',
  8. };
  9. let telecomMobile = lk.getVal(TelecomConstKey.Mobile);
  10. let telecomPassword = lk.getVal(TelecomConstKey.Password);
  11. //公钥
  12. const publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBkLT15ThVgz6/NOl6s8GNPofdWzWbCkWnkaAm7O2LjkM1H7dMvzkiqdxU02jamGRHLX/ZNMCXHnPcW/sDhiFCBN18qFvy8g6VYb9QtroI09e176s+ZCtiv7hbin2cCTj99iUpnEloZm19lwHyo69u5UMiPMpq0/XKBO8lYhN/gwIDAQAB';
  13. //私钥
  14. const privateKey = '';
  15. const GCommoTelecomHeads = {
  16. "Accept": "application/json",
  17. "Content-Type": "application/json; charset=UTF-8",
  18. "Connection": "Keep-Alive",
  19. "Accept-Encoding": "gzip",
  20. };
  21. if (!lk.isExecComm) {
  22. if (lk.isRequest()) {
  23. checkHandleRequest();
  24. if (retBody) {
  25. lk.done({ body: JSON.stringify(retBody) });
  26. } else {
  27. lk.done();
  28. }
  29. }else{
  30. all();
  31. }
  32. }
  33. function checkHandleRequest() {
  34. }
  35. function getSignCount() {
  36. let SignCount = lk.getVal(TelecomConstKey.SignCount);
  37. let td = lk.formatDate(new Date(), 'yyyyMMdd');
  38. if (SignCount) {
  39. let [date, num] = SignCount.split('_');
  40. if (date == td && num) {
  41. return Number(num);
  42. } else {
  43. lk.setVal(TelecomConstKey.SignCount, `${td}_0`);
  44. return 0;
  45. }
  46. } else {
  47. lk.setVal(TelecomConstKey.SignCount, `${td}_0`);
  48. return 0;
  49. }
  50. }
  51. async function all() {
  52. if (!lk.isEmpty(telecomMobile) || !lk.isEmpty(telecomPassword)) {
  53. lk.log('⚠️ 请配置手机号(lkTelecomMobile)和密码(lkTelecomPassword)');
  54. return;
  55. }
  56. await doLogin();
  57. lk.msg('');
  58. lk.done();
  59. }
  60. //RSA加密
  61. function encryptRSA(data, key = publicKey) {
  62. let JSEncrypt = createJSEncrypt();
  63. let encryptor = new JSEncrypt()
  64. encryptor.setPublicKey(key)
  65. // 如果是对象/数组的话,需要先JSON.stringify转换成字符串
  66. return encryptor.encrypt(data)
  67. }
  68. //rea解密
  69. function decryptRSA(data, key = privateKey) {
  70. let JSEncrypt = createJSEncrypt();
  71. let encryptor = new JSEncrypt()
  72. encryptor.setPrivateKey(key)
  73. // 如果是对象/数组的话,需要先JSON.stringify转换成字符串
  74. return encryptor.decrypt(data)
  75. }
  76. function transPhone(phoneNum) {
  77. let result = '';
  78. let ArrPhone = phoneNum.toString().split('');
  79. for (let i = 0; i < 11; i++) {
  80. result = `${result}` + String.fromCharCode(ArrPhone[i].charCodeAt(0) + 2 & 65535);
  81. }
  82. return result;
  83. }
  84. async function doLogin(){
  85. if (getSignCount() > 10) {
  86. lk.appendNotifyInfo('⚠️ 当日登录已超过10次! 请明天再试');
  87. return;
  88. }
  89. let timestamp = lk.formatDate(new Date(),'yyyyMMddHHmm00')
  90. let loginStr = `iPhone 14 16.6.1${telecomMobile}${telecomMobile}${timestamp}${telecomPassword}0$$$0.`;
  91. let body = {
  92. content: {
  93. fieldData: {
  94. accountType: '',
  95. authentication: telecomPassword,
  96. deviceUid: `3${telecomMobile}`,
  97. isChinatelecom: '0',
  98. loginAuthCipherAsymmertric: encryptRSA(loginStr),
  99. loginType: "4",
  100. phoneNum: transPhone(telecomMobile),
  101. systemVersion: "16.6.1",
  102. },
  103. attach: "iPhone",
  104. },
  105. headerInfos: {
  106. clientType: '#9.6.1#channel50#iPhone 14 Pro#',
  107. code: 'userLoginNormal',
  108. shopId: '20002',
  109. source: '110003',
  110. sourcePassword: 'Sid98s',
  111. timestamp: timestamp,
  112. userLoginName: telecomMobile,
  113. }
  114. }
  115. lk.log('--- request body:');
  116. lk.log(JSON.stringify(body));
  117. let reqData = {
  118. url: "https://appgologin.189.cn:9031/login/client/userLoginNormal",
  119. headers: GCommoTelecomHeads,
  120. body: JSON.stringify(body),
  121. };
  122. lk.post(reqData, async (error, _response, data) => {
  123. let ret;
  124. try {
  125. if (error) {
  126. lk.log(`请求发生错误`);
  127. lk.execFail();
  128. } else {
  129. lk.log('--- response body:');
  130. lk.log(data);
  131. let info = JSON.parse(data);
  132. let loginInfo = info.responseData.data.loginSuccessResult;
  133. if (loginInfo && loginInfo.token) {
  134. lk.setVal(TelecomConstKey.Token, loginInfo.token);
  135. }else{
  136. let errMsg = data.responseData.resultDesc || data.headerInfos.reason;
  137. if(errMsg){
  138. lk.appendNotifyInfo(`⚠️ ${errMsg}`);
  139. }
  140. }
  141. }
  142. } catch (e) {
  143. lk.log(`请求发生错误`);
  144. lk.logErr(e);
  145. lk.execFail();
  146. } finally {
  147. resolve(ret);
  148. }
  149. });
  150. }