阿里云:
服务器购买地址
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=201905
2.部署教程
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.account
const password =config.lenovo.password
const parsedWordArray = CryptoJS.enc.Base64.parse(baseinfo);
const info=JSON.parse(parsedWordArray.toString(CryptoJS.enc.Utf8))
let deviceid = info.imei
const 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
}
//预约游戏id
result += "登陆成功!|| "
console.log("login:" + lpsutgt)
resolve(lpsutgt);
} catch (err) {
console.log(err.response);
lpsutgt = null
result += "登陆失败! || "
}
resolve();
});
}
function getsession(lpsutgt) {
return new Promise(async (resolve) => {
// let json =""
try {
headers.Authorization = "Lenovosso " + lpsutgt
headers["token"] = lpsutgt
let 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.sessionid
headers["token"] = session.token
headers["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_tip
if (!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 完成签到任务。通过加密请求数据和处理响应数据,确保了安全性和功能的实现。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论