阿里云:
服务器购买地址
https://t.aliyun.com/U/C6sVsb若失效,可用地址
https://www.aliyun.com/activity/wuying/dj?source=5176.29345612&userCode=49hts92d腾讯云:
https://curl.qcloud.com/wJpWmSfU若失效,可用地址
https://cloud.tencent.com/act/cps/redirect?redirect=2446&cps_key=ad201ee2ef3b771157f72ee5464b1fea&from=console华为云
https://activity.huaweicloud.com/cps.html?fromacct=64b5cf7cc11b4840bb4ed2ea0b2f4468&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=2019052.部署教程
3.代码如下
const CryptoJS= require('crypto-js');const baseinfo =config.lenovo.baseinfo?config.lenovo.baseinfo:"eyJpbWVpIjoiODY1MzE1MDMxOTg1ODc4IiwicGhvbmVicmFuZCI6Imhvbm9yIiwicGhvbmVNb2RlbCI6IkZSRC1BTDEwIiwiYXBwVmVyc2lvbiI6IlY0LjIuNSIsInBob25laW5jcmVtZW50YWwiOiI1NTYoQzAwKSIsIlBhZ2VJbmZvIjoiTXlJbmZvcm1hdGlvbkFjdGlvbkltcGwiLCJwaG9uZWRpc3BsYXkiOiJGUkQtQUwxMCA4LjAuMC41NTYoQzAwKSIsInBob25lTWFudWZhY3R1cmVyIjoiSFVBV0VJIiwibGVub3ZvQ2x1YkNoYW5uZWwiOiJ5aW5neW9uZ2JhbyIsImxvZ2luTmFtZSI6IjE3NjQwNDA4NTM3IiwicGhvbmVwcm9kdWN0IjoiRlJELUFMMTAiLCJzeXN0ZW1WZXJzaW9uIjoiOC4wLjAiLCJhbmRyb2lkc2RrdmVyc2lvbiI6IjI2In0="const $http=require("axios")let result = "【联想延保每日签到】:"const account = config.lenovo.accountconst password =config.lenovo.passwordconst parsedWordArray = CryptoJS.enc.Base64.parse(baseinfo);const info=JSON.parse(parsedWordArray.toString(CryptoJS.enc.Utf8))let deviceid = info.imeiconst url = {"login": `https://uss.lenovomm.com/authen/1.2/tgt/user/get?msisdn=${account}`,"session": "https://api.club.lenovo.cn/users/getSessionID","sign1": "https://api.club.lenovo.cn/common/signin/add","sign2": "https://api.club.lenovo.cn/signin/v2/add"}let lpsutgt = ""headers = {baseinfo: baseinfo,unique: deviceid,"User-Agent": "LenovoClub/4.1.2 (iPad; iOS 13.6; Scale/2.00)",token: "",//"User-Agent":"Apache-HttpClient/UNAVAILABLE (java 1.5)",Authorization: "","itemid":"1","sversion": "0","X-Lenovo-APPID": "1","versionCode":"1000082"}function lxlogin() {return new Promise(async (resolve) => {try {let data = `lang=zh-CN-%23Hans&source=android%3Acom.lenovo.club.app-V4.2.5&deviceidtype=mac&deviceid=${deviceid}&devicecategory=unknown&devicevendor=${info.phoneManufacturer}&devicefamily=unknown&devicemodel=${info.phoneModel}&osversion=${info.systemVersion}&osname=Android&password=${password}`let res = await $http.post(url["login"], data);let lpsutgt = res.data.match(/<Value>(.+?)<\/Value>/)if (lpsutgt) {let res2 = await $http.get(`https://uss.lenovomm.com/authen/1.2/st/get?lpsutgt=${lpsutgt[1]}&source=ios%3Alenovo%3Aclub%3A4.1.0&lang=zh-CN&realm=club.lenovo.com.cn`)let lpsutgt2 = res2.data.match(/<Value>(.+?)<\/Value>/)lpsutgt = lpsutgt2 ? lpsutgt2[1] : null}//预约游戏idresult += "登陆成功!|| "console.log("login:" + lpsutgt)resolve(lpsutgt);} catch (err) {console.log(err.response);lpsutgt = nullresult += "登陆失败! || "}resolve();});}function getsession(lpsutgt) {return new Promise(async (resolve) => {// let json =""try {headers.Authorization = "Lenovosso " + lpsutgtheaders["token"] = lpsutgtlet s = aesEncrypto(`{"sessionid":"Lenovosso ${lpsutgt}","time":"${new Date().getTime()}"}`)url["session"] = url["session"] + `?s=${s}`let res3 = await $http.get(url["session"], {headers})let json = {lenovoid: res3.data.res.lenovoid,sessionid: res3.data.res.sessionid,token: res3.data.res.token}resolve(json)} catch (err) {console.log(err)console.log(decodeURI(err.response.data.res.error_CN))result += "获取token失败" + decodeURI(err.response.data.res.error_CN) + "\n"}resolve();});}function addsign(session) {return new Promise(async (resolve) => {try {headers.Authorization = "Lenovo " + session.sessionidheaders["token"] = session.tokenheaders["User-Agent"] = "Apache-HttpClient/UNAVAILABLE (java 1.5)"headers["Content-Type"] = "text/json"data = aesEncrypto(`{"uid":"${session.lenovoid}","imei":"${deviceid}","source":"0","sessionid":"Lenovo ${session.sessionid}","time":"${new Date().getTime()}"}`)let res = await $http.post(url["sign2"], data, {headers})console.log(res.data)if (typeof(res.data) === "object" & res.data.status == 0) {// msg+=res.data.res.add_yb_tipif (!res.data.res.success) {result += "今天已经签到过啦! "console.log("今天已经签到过啦")} else {result += "签到成功||" + res.data.res.rewardTips.replace(/\\n/g," || ") + " || 连续签到" + res.data.res.continueCount + "天"console.log("签到成功 " + res.data.res.rewardTips + "连续签到" + res.data.res.continueCount + "天")}}// console.log(res.data)// console.log(typeof(res.data)=="object"&&res.data.status==0)} catch (err) {// console.log(err)// console.log(decodeURI(err.response.data.res.error_CN))result += "签到失败" + decodeURI(err.response.data.res.error_CN)}resolve();});}function aesEncrypto(text) {key = CryptoJS.enc.Utf8.parse('nihao_liu#zh*9@7');iv = CryptoJS.enc.Utf8.parse('A*8@Stii_jin)*%6');var encrypto = CryptoJS.AES.encrypt(text, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7})return encrypto.ciphertext.toString()}async function lxyb() {console.log("任务开始")lpsutgt = await lxlogin()let session = await getsession(lpsutgt)if (session) {console.log(session)await addsign(session)}return result}module.exports=lxyb
解析
这个脚本是用于自动化 联想延保 每日签到的,主要流程包括登录、获取会话信息、然后进行签到并返回签到的结果。
主要功能
- 登录
:通过账户和设备信息登录联想平台。 - 获取会话信息
:成功登录后获取会话信息(如 sessionId、token 等)。 - 每日签到
:使用获取到的会话信息进行签到操作,并返回签到的结果。
主要方法解析:
1. lxlogin 方法:
- 功能
:用于登录联想平台。 - 流程
通过发送包含设备信息和账户密码的 POST 请求到登录接口 url["login"]。从响应中提取 lpsutgt,这是用于后续请求的临时会话标识符。如果登录成功,则返回 lpsutgt;如果失败,记录失败信息。
2. getsession 方法:
- 功能
:获取会话信息(如 lenovoid、sessionid、token)。 - 流程
: 使用登录返回的 lpsutgt获取会话信息。加密请求参数( sessionid和token)使用aesEncrypto方法进行加密。发送请求,获取并解析返回的 JSON 数据,提取 lenovoid、sessionid和token,用于后续签到。
3. addsign 方法:
- 功能
:执行签到操作。 - 流程
使用获取到的 sessionid和token发送 POST 请求到签到接口url["sign2"]。如果签到成功,会返回奖励信息,包含连续签到天数和奖励内容。 如果今天已经签到过了,返回 "今天已经签到过啦!"。 如果签到失败,会记录错误信息。
4. aesEncrypto 方法:
- 功能
:用于加密请求数据。 - 流程
:使用 CryptoJS.AES.encrypt对文本进行 AES 加密,生成密文。
5. lxyb 方法:
- 功能
:主函数,按顺序执行登录、获取会话、签到等操作。 - 流程
调用 lxlogin方法进行登录。获取会话信息。 如果会话信息有效,调用 addsign方法进行签到。返回签到结果。
这个脚本自动化了联想延保的每日签到过程,适用于需要定期签到的用户,通过调用 API 完成签到任务。通过加密请求数据和处理响应数据,确保了安全性和功能的实现。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论