阿里云:
服务器购买地址
https://t.aliyun.com/U/2s8buw
若失效,可用地址
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 {
cookie,
UserId,
deviceUid,
BookId,
TicketCount,
roleId,
version
} = config.qidian
QDSign = "";
Message = ""
const cryptojs = require('crypto-js');
const axios = require("axios")
function encrypt(data) {
let algorithm = 'des-128-cbc'
let passwd = '{1dYgqE)h9,R)hKqEcv4]k[h'
let iv = '01234567'
str = cryptojs.TripleDES.encrypt("" + data, cryptojs.enc.Utf8.parse(passwd), {
iv: cryptojs.enc.Utf8.parse(iv),
mode: cryptojs.mode.CBC,
padding: cryptojs.pad.Pkcs7
})
return str.toString()
}
var sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
function QDGet(url, data, method = "post") {
return new Promise(async (resolve) => {
try {
let headers = {
cookie,
QDSign,
"User-Agent": "Mozilla/mobile QDReaderAndroid/7.9.186/674/1000209"
}
qdsign = QD(data)
headers.QDSign = qdsign
let res = await axios({
method,
url: "https://druidv6.if.qidian.com" + url,
data,
headers
})
console.log(JSON.stringify(res.data))
resolve(res.data)
} catch (err) {
console.log(err)
if (err.response && err.response.data) resolve(err.response.data)
else Message += err
}
resolve();
});
}
function QD(data) {
let str1 = data.split("&")
.sort(function(a, b) {
return a.localeCompare(b);
}).join("&").toLowerCase()
sign = cryptojs.MD5(str1).toString()
let str = `Rv1rPTnczce|${Math.floor(Date.now() )}|${UserId}|${deviceUid}|1|${version}|0|${sign}|f189adc92b816b3e9da29ea304d4a7e4`
qdsign = encrypt(str)
return qdsign
}
async function qidian() {
Message += " 签到:"
let QDSign = ""
let signres = await QDGet("/argus/api/v2/checkin/checkin", "sessionKey=&banId=0&captchaTicket=&captchaRandStr=&challenge=&validate=&seccode=")
if (signres && (signres.Result == 0)) Message += `签到成功!连签${signres.Data.NoBrokenTime}天`
else if (signres && signres.Message) Message += signres.Message
if (TicketCount) {
//投票
urltp = "/Atom.axd/Api/InterAction/VoteRecomTicket"
datatp = `bookId=${BookId}&bookName=&count=${TicketCount}&description=这本书写的太好了,犒劳一下希望后续更精彩!&isSendSina=0&isSendTX=0&clienttype=1400&sourceId=0&sourceType=0`
let VoteRecomTicketRes = await QDGet(urltp, datatp)
if (VoteRecomTicketRes && VoteRecomTicketRes.Message) Message += "\n 投推荐票:" + VoteRecomTicketRes.Message
}
//笔芯
urlbx = "/argus/api/v1/bookrole/setrolelikestatus"
let databx = `bookId=${BookId??"1033475139"}&roleId=${roleId??("61367713050100871")}&likeStatus=1`
let likeRes = await QDGet(urlbx, databx)
if (likeRes && likeRes.Message) Message += "\n 比心:" + likeRes.Message
//每日抽卡
urlck = "/argus/api/v2/bookrole/card/call?type=1&costType=1&cardpoolid=0"
datack = "type=1&costType=1&cardpoolid=0"
let ckres = await QDGet(urlck, datack, "get")
if (ckres && ckres.Result == 0) Message += "\n 抽卡:" + "恭喜你欧气爆棚!!获得:" + ckres.Data.Items[0].CardName
else Message += "\n 抽卡:" + ckres.Message
return "【起点读书:】\n" + Message
}
module.exports = qidian
解析
这脚本是一个用于自动化任务的Node.js模块,主要用于起点中文网的签到、投推荐票、比心(点赞角色)、以及每日抽卡功能。它使用了加密技术、HTTP请求等技术来实现与起点中文网的交互。
主要作用
- 自动签到
向起点中文网发送签到请求,获取连续签到天数等信息。 - 投推荐票
向指定的书籍投推荐票。 - 比心(点赞)
对特定角色进行点赞。 - 每日抽卡
进行每日的抽卡活动,获取随机奖励。
主要方法
encrypt(data):
- 作用
使用TripleDES算法加密数据,生成请求起点中文网所需的签名(QDSign)。 - 参数
data
- 要加密的数据字符串。 - 返回值
加密后的字符串。 QDGet(url, data, method = "post"):
url
- API的相对路径。 data
- 请求的数据。 method
- HTTP方法,默认为POST。 - 作用
发送HTTP请求到起点中文网的API。 - 返回值
:API响应的数据。 QD(data):
- 作用
生成QDSign,用于验证请求的合法性。 - 参数
data
- 请求参数的字符串形式。 - 返回值
加密后的QDSign。 qidian():
- 作用
执行整个自动化任务的流程,包括签到、投票、比心和抽卡。 - 返回值
执行结果的消息字符串。
流程说明
- 签到
首先执行签到操作,若成功,记录连续签到天数。 - 投票
如果配置了投票,则对指定的书籍投推荐票。 - 比心
对配置的角色进行点赞。 - 抽卡
执行每日抽卡操作,记录获得的奖励。
脚本充分展示了Node.js在自动化网络任务中的应用,尤其是在处理登录、加密、API请求等方面的能力。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论