2020-07-02 11:50:39 +08:00
|
|
|
// 赞赏:邀请码`A1040276307`
|
|
|
|
// 链接`http://html34.qukantoutiao.net/qpr2/bBmQ.html?pid=5eb14518`
|
|
|
|
// 农妇山泉 -> 有点咸
|
|
|
|
|
|
|
|
/********************
|
|
|
|
* 1、 为了方便任意脚本可以清除Cookie, 任意一个脚本将DeleteCookie = true且选择要清除的账号都可以生效
|
|
|
|
* 2、 debug模式可以在Surge&&Qx中开启,方便你判定多用户及脚本运行情况
|
|
|
|
* 3、 Qx==>dubug:miduRede构造请求
|
|
|
|
* 4、 Surge==>debug:load脚本->evalaute
|
|
|
|
* 5、脚本默认每半小时通知一次,建议自己先debug看看是否成功
|
|
|
|
*********************/
|
|
|
|
|
|
|
|
// 是否开启清除Cookie
|
|
|
|
const DeleteCookie = false // 清除所有Cookie,将下方改为true,默认false
|
|
|
|
|
|
|
|
// 选取清除操作
|
|
|
|
const DeleteCookieAll = false // 清除所有
|
|
|
|
const DeleteCookieOne = false // 清除账户一
|
|
|
|
const DeleteCookieTwo = false // 清除账户二
|
|
|
|
|
|
|
|
const debug = false // 开启debug模式,每次脚本执行会显示通知,默认false
|
|
|
|
|
|
|
|
const bind = true // 绑定作者邀请码,默认true,可更改为false
|
|
|
|
|
|
|
|
const cookieName = '米读阅读时长'
|
|
|
|
|
|
|
|
const senku = init()
|
|
|
|
|
|
|
|
debug ? senku.setdata('true', 'debug') : senku.setdata('false', 'debug')
|
|
|
|
bind ? '' : senku.setdata('', 'bind');
|
|
|
|
if (DeleteCookie) {
|
|
|
|
const one = senku.getdata('tokenMidu_read')
|
|
|
|
const two = senku.getdata('tokenMidu_sign')
|
|
|
|
const three = senku.getdata('tokenMidu_read2')
|
|
|
|
const four = senku.getdata('tokenMidu_sign2')
|
|
|
|
if (DeleteCookieAll) {
|
|
|
|
if (one || two || three || four) {
|
|
|
|
senku.setdata("", 'senku_signbody_midu')
|
|
|
|
senku.setdata("", 'senku_signbody_midu2')
|
|
|
|
senku.setdata("", 'senku_readTimebody_midu')
|
|
|
|
senku.setdata("", 'senku_readTimebody_midu2')
|
|
|
|
senku.setdata("", 'senku_readTimeheader_midu')
|
|
|
|
senku.setdata("", 'senku_readTimeheader_midu2')
|
|
|
|
senku.setdata("", "tokenMidu_read")
|
|
|
|
senku.setdata("", "tokenMidu_read2")
|
|
|
|
senku.setdata("", "tokenMidu_sign")
|
|
|
|
senku.setdata("", "tokenMidu_sign2")
|
|
|
|
senku.msg("米读 Cookie清除成功 !", "", '请手动关闭脚本内"DeleteCookie"选项')
|
|
|
|
} else {
|
|
|
|
senku.msg("米读 无可清除的Cookie !", "", '请手动关闭脚本内"DeleteCookie"选项')
|
|
|
|
}
|
|
|
|
} else if (DeleteCookieOne) {
|
|
|
|
if (one || two) {
|
|
|
|
senku.setdata("", 'senku_signbody_midu')
|
|
|
|
senku.setdata("", 'senku_readTimebody_midu')
|
|
|
|
senku.setdata("", 'senku_readTimeheader_midu')
|
|
|
|
senku.setdata("", "tokenMidu_read")
|
|
|
|
senku.setdata("", "tokenMidu_sign")
|
|
|
|
senku.msg("米读 Cookie清除成功 !", "清除账户一选项", '请手动关闭脚本内"DeleteCookie"选项')
|
|
|
|
} else {
|
|
|
|
senku.msg("米读 无可清除的Cookie !", "清除账户一选项", '请手动关闭脚本内"DeleteCookie"选项')
|
|
|
|
}
|
|
|
|
} else if (DeleteCookieTwo) {
|
|
|
|
if (three || four) {
|
|
|
|
senku.setdata("", 'senku_signbody_midu2')
|
|
|
|
senku.setdata("", 'senku_readTimebody_midu2')
|
|
|
|
senku.setdata("", 'senku_readTimeheader_midu2')
|
|
|
|
senku.setdata("", "tokenMidu_read2")
|
|
|
|
senku.setdata("", "tokenMidu_sign2")
|
|
|
|
senku.msg("米读 Cookie清除成功 !", "清除账户二选项", '请手动关闭脚本内"DeleteCookie"选项')
|
|
|
|
} else {
|
|
|
|
senku.msg("米读 无可清除的Cookie !", "清除账户二选项", '请手动关闭脚本内"DeleteCookie"选项')
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
senku.msg("米读 清除Cookie !", "未选取任何选项", '请手动关闭脚本内"DeleteCookie"选项')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function initial() {
|
|
|
|
signinfo = {
|
|
|
|
addnumList: [],
|
|
|
|
rollList: [],
|
|
|
|
doubleList: []
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
;
|
|
|
|
(sign = () => {
|
|
|
|
senku.log(`🔔 ${cookieName}`)
|
|
|
|
senku.getdata('tokenMidu_read') ? '' : senku.msg('米读阅读', '', '不存在Cookie')
|
|
|
|
DualAccount = true
|
|
|
|
if (senku.getdata('tokenMidu_read')) {
|
|
|
|
tokenVal = senku.getdata('tokenMidu_read')
|
|
|
|
readTimeheaderVal = senku.getdata('senku_readTimeheader_midu')
|
|
|
|
readTimebodyVal = senku.getdata('senku_readTimebody_midu')
|
|
|
|
signbodyVal = senku.getdata('senku_signbody_midu')
|
|
|
|
all()
|
|
|
|
}
|
|
|
|
senku.done()
|
|
|
|
})()
|
|
|
|
|
|
|
|
|
|
|
|
async function all() {
|
|
|
|
try {
|
|
|
|
senku.log(`🍎${readTimeheaderVal}`)
|
|
|
|
const headerVal = readTimeheaderVal
|
|
|
|
const urlVal = readTimebodyVal
|
|
|
|
const key = signbodyVal
|
|
|
|
const token = tokenVal
|
|
|
|
initial()
|
|
|
|
|
|
|
|
await readTime(headerVal, token, urlVal)
|
|
|
|
await userInfo(key)
|
|
|
|
await prizeInfo(key)
|
|
|
|
if (signinfo.prizeInfo && signinfo.prizeInfo.data && signinfo.prizeInfo.data.total_num) {
|
|
|
|
await prizeTask(key)
|
|
|
|
await drawPrize(key)
|
|
|
|
}
|
|
|
|
await showmsg()
|
|
|
|
senku.done()
|
|
|
|
} catch (e) {
|
|
|
|
senku.msg(cookieName, `失败`, `说明: ${e}`)
|
|
|
|
senku.log(`❌ ${cookieName} - 失败: ${e}`)
|
|
|
|
senku.done()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function double() {
|
|
|
|
initial()
|
|
|
|
DualAccount = false
|
|
|
|
if (senku.getdata('tokenMidu_read2')) {
|
|
|
|
tokenVal = senku.getdata('tokenMidu_read2')
|
|
|
|
readTimeheaderVal = senku.getdata('senku_readTimeheader_midu2')
|
|
|
|
readTimebodyVal = senku.getdata('senku_readTimebody_midu2')
|
|
|
|
signbodyVal = senku.getdata('senku_signbody_midu2')
|
|
|
|
all()
|
|
|
|
}
|
|
|
|
}
|
2020-07-02 11:52:57 +08:00
|
|
|
|
2020-07-02 11:50:39 +08:00
|
|
|
// 抽奖
|
|
|
|
function drawPrize(bodyVal) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
const drawPrizeurlVal = 'https://apiwz.midukanshu.com/wz/task/drawPrize?' + bodyVal
|
|
|
|
const url = {
|
|
|
|
url: drawPrizeurlVal,
|
|
|
|
headers: {}
|
|
|
|
}
|
|
|
|
url.headers['Host'] = 'apiwz.midukanshu.com'
|
|
|
|
url.headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
|
|
|
url.headers['User-Agent'] = 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148'
|
|
|
|
senku.post(url, (error, response, data) => {
|
|
|
|
try {
|
|
|
|
senku.log(`🐍🐢 ${cookieName} drawPrize - response: ${JSON.stringify(response)}`)
|
|
|
|
if (data) {
|
|
|
|
signinfo.drawPrize = JSON.parse(data)
|
|
|
|
}
|
|
|
|
resolve()
|
|
|
|
} catch (e) {
|
|
|
|
// senku.msg(cookieName, `抽奖: 失败`, `说明: ${e}`)
|
|
|
|
senku.log(`❌ ${cookieName} drawPrize - 抽奖失败: ${e}`)
|
|
|
|
senku.log(`❌ ${cookieName} drawPrize - response: ${JSON.stringify(response)}`)
|
|
|
|
resolve()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// 观看视频获取抽奖机会
|
|
|
|
function prizeTask(bodyVal) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
const prizeTaskurlVal = 'https://apiwz.midukanshu.com/wz/task/prizeTask?' + bodyVal
|
|
|
|
const url = {
|
|
|
|
url: prizeTaskurlVal,
|
|
|
|
headers: {}
|
|
|
|
}
|
|
|
|
url.headers['Host'] = 'apiwz.midukanshu.com'
|
|
|
|
url.headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
|
|
|
url.headers['User-Agent'] = 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148'
|
|
|
|
senku.post(url, (error, response, data) => {
|
|
|
|
try {
|
|
|
|
senku.log(`🐍🐢 ${cookieName} prizeTask - response: ${JSON.stringify(response)}`)
|
|
|
|
if (data) {
|
|
|
|
signinfo.prizeTask = JSON.parse(data)
|
|
|
|
}
|
|
|
|
resolve()
|
|
|
|
} catch (e) {
|
|
|
|
// senku.msg(cookieName, `观看视频抽奖: 失败`, `说明: ${e}`)
|
|
|
|
senku.log(`❌ ${cookieName} prizeTask - 观看视频抽奖失败: ${e}`)
|
|
|
|
senku.log(`❌ ${cookieName} prizeTask - response: ${JSON.stringify(response)}`)
|
|
|
|
resolve()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// 抽奖信息
|
|
|
|
function prizeInfo(bodyVal) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
const prizeInfourlVal = 'https://apiwz.midukanshu.com/wz/task/prizeList?' + bodyVal
|
|
|
|
const url = {
|
|
|
|
url: prizeInfourlVal,
|
|
|
|
headers: {}
|
|
|
|
}
|
|
|
|
url.headers['Host'] = 'apiwz.midukanshu.com'
|
|
|
|
url.headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
|
|
|
url.headers['User-Agent'] = 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148'
|
|
|
|
senku.post(url, (error, response, data) => {
|
|
|
|
try {
|
|
|
|
senku.log(`🐍🐢 ${cookieName} prizeInfo - response: ${JSON.stringify(response)}`)
|
|
|
|
if (data) {
|
|
|
|
signinfo.prizeInfo = JSON.parse(data)
|
|
|
|
}
|
|
|
|
resolve()
|
|
|
|
} catch (e) {
|
|
|
|
// senku.msg(cookieName, `抽奖信息: 失败`, `说明: ${e}`)
|
|
|
|
senku.log(`❌ ${cookieName} prizeInfo - 抽奖信息失败: ${e}`)
|
|
|
|
senku.log(`❌ ${cookieName} prizeInfo - response: ${JSON.stringify(response)}`)
|
|
|
|
resolve()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
2020-07-02 11:52:57 +08:00
|
|
|
|
2020-07-02 11:50:39 +08:00
|
|
|
// 阅读时长
|
|
|
|
function readTime(header, token, urlVal) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
const url = {
|
|
|
|
url: 'https://apiwz.midukanshu.com/user/readTimeBase/readTime?' + urlVal,
|
|
|
|
headers: {
|
|
|
|
'host': 'apiwz.midukanshu.com',
|
|
|
|
'versionName': '1.7.2.0501.1930',
|
|
|
|
"User-Agent": "MRSpeedNovel/0430.1512 CFNetwork/1125.2 Darwin/19.5.0",
|
|
|
|
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8",
|
|
|
|
'token': token,
|
|
|
|
'tk': header
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
senku.post(url, (error, response, data) => {
|
|
|
|
try {
|
|
|
|
senku.log(`🐍🐢 ${cookieName} readTime - response: ${JSON.stringify(response)}`)
|
|
|
|
if (data) {
|
|
|
|
signinfo.readTime = JSON.parse(data)
|
|
|
|
}
|
|
|
|
resolve()
|
|
|
|
} catch (e) {
|
|
|
|
// senku.msg(cookieName, `阅读时长: 失败`, `说明: ${e}`)
|
|
|
|
senku.log(`❌ ${cookieName} readTime - 阅读时长失败: ${e}`)
|
|
|
|
senku.log(`❌ ${cookieName} readTime - response: ${JSON.stringify(response)}`)
|
|
|
|
resolve()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// 用户信息
|
|
|
|
function userInfo(bodyVal) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
const userInfourlVal = 'https://apiwz.midukanshu.com/wz/user/getInfo?' + bodyVal
|
|
|
|
const url = {
|
|
|
|
url: userInfourlVal,
|
|
|
|
headers: {}
|
|
|
|
}
|
|
|
|
url.headers['Host'] = 'apiwz.midukanshu.com'
|
|
|
|
url.headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
|
|
|
url.headers['User-Agent'] = 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148'
|
|
|
|
senku.post(url, (error, response, data) => {
|
|
|
|
try {
|
|
|
|
senku.log(`🐍🐢 ${cookieName} userInfo - response: ${JSON.stringify(response)}`)
|
|
|
|
if (data) {
|
|
|
|
signinfo.userInfo = JSON.parse(data)
|
|
|
|
}
|
|
|
|
resolve()
|
|
|
|
} catch (e) {
|
|
|
|
// senku.msg(cookieName, `用户信息: 失败`, `说明: ${e}`)
|
|
|
|
senku.log(`❌ ${cookieName} userInfo - 用户信息失败: ${e}`)
|
|
|
|
senku.log(`❌ ${cookieName} userInfo - response: ${JSON.stringify(response)}`)
|
|
|
|
resolve()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
function showmsg() {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
let subTitle = ''
|
|
|
|
let detail = ''
|
|
|
|
const name = signinfo.userInfo && signinfo.userInfo.data && signinfo.userInfo.data.nickname ? signinfo.userInfo.data.nickname : `账户已退出`
|
|
|
|
if (signinfo.readTime && signinfo.readTime.code == 0) {
|
|
|
|
const coin = signinfo.readTime.data.coin
|
|
|
|
const readTotalMinute = signinfo.readTime.data.readTotalMinute
|
|
|
|
const total_coin = signinfo.readTime.data.total_coin
|
|
|
|
coin == 0 ? detail += `` : detail += `【阅读时长】获得${coin}💰`
|
|
|
|
readTotalMinute ? detail += ` 阅读时长${readTotalMinute / 2}分钟,该账户:${total_coin}💰` : detail += `该账户:${total_coin}💰`
|
|
|
|
} else if (signinfo.readTime && signinfo.readTime.code != 0) {
|
|
|
|
detail += `【阅读时长】错误代码${signinfo.readTime.code},错误信息${signinfo.readTime.message}`
|
|
|
|
senku.msg(cookieName + ` 用户:${name}`, subTitle, detail)
|
|
|
|
}
|
|
|
|
|
|
|
|
if (senku.getdata('debug') == 'true' || detail && signinfo.readTime && signinfo.readTime.data && signinfo.readTime.data.readTotalMinute % 60 == 0) {
|
|
|
|
senku.msg(cookieName + ` 用户:${name}`, subTitle, detail)
|
|
|
|
} else if (senku.getdata('debug') == 'true' || signinfo.readTime && signinfo.readTime.data && signinfo.readTime.data.readTotalMinute % 60 == 0) {
|
|
|
|
senku.msg(cookieName + ` 用户:${name}`, '阅读结果', '时间未到')
|
|
|
|
}
|
|
|
|
|
|
|
|
// 大转盘抽手机
|
|
|
|
// if (signinfo.drawPrize) {
|
|
|
|
// if (signinfo.drawPrize.code == 0) {
|
|
|
|
// detail += `【转盘奖励】本次${drawPrize.data.title}\n`
|
|
|
|
// } else {
|
|
|
|
// detail += `【转盘奖励】无次数抽奖`
|
|
|
|
// }
|
|
|
|
// senku.msg(cookieName + ` 用户:${name}`, subTitle, detail)
|
|
|
|
// }
|
|
|
|
if (DualAccount) double()
|
|
|
|
resolve()
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function init() {
|
|
|
|
isSurge = () => {
|
|
|
|
return undefined === this.$httpClient ? false : true
|
|
|
|
}
|
|
|
|
isQuanX = () => {
|
|
|
|
return undefined === this.$task ? false : true
|
|
|
|
}
|
|
|
|
getdata = (key) => {
|
|
|
|
if (isSurge()) return $persistentStore.read(key)
|
|
|
|
if (isQuanX()) return $prefs.valueForKey(key)
|
|
|
|
}
|
|
|
|
setdata = (key, val) => {
|
|
|
|
if (isSurge()) return $persistentStore.write(key, val)
|
|
|
|
if (isQuanX()) return $prefs.setValueForKey(key, val)
|
|
|
|
}
|
|
|
|
msg = (title, subtitle, body) => {
|
|
|
|
if (isSurge()) $notification.post(title, subtitle, body)
|
|
|
|
if (isQuanX()) $notify(title, subtitle, body)
|
|
|
|
}
|
|
|
|
log = (message) => console.log(message)
|
|
|
|
get = (url, cb) => {
|
|
|
|
if (isSurge()) {
|
|
|
|
$httpClient.get(url, cb)
|
|
|
|
}
|
|
|
|
if (isQuanX()) {
|
|
|
|
url.method = 'GET'
|
|
|
|
$task.fetch(url).then((resp) => cb(null, resp, resp.body))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
post = (url, cb) => {
|
|
|
|
if (isSurge()) {
|
|
|
|
$httpClient.post(url, cb)
|
|
|
|
}
|
|
|
|
if (isQuanX()) {
|
|
|
|
url.method = 'POST'
|
|
|
|
$task.fetch(url).then((resp) => cb(null, resp, resp.body))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
done = (value = {}) => {
|
|
|
|
$done(value)
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
isSurge,
|
|
|
|
isQuanX,
|
|
|
|
msg,
|
|
|
|
log,
|
|
|
|
getdata,
|
|
|
|
setdata,
|
|
|
|
get,
|
|
|
|
post,
|
|
|
|
done
|
|
|
|
}
|
|
|
|
}
|