Rules-For-Quantumult-X/Scripts/SignIn/Duokan/duokan.js

124 lines
4.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const DUOKAN_COOKIE_KEY = 'duokan_cookie'
const DUOKAN_DEVICE_ID_KEY = 'duokan_device_id'
const API_HOST = 'https://www.duokan.com'
const TASK_NAME = '多看阅读'
let $util = init()
;(async () => {
let cookieVal = $util.getdata(DUOKAN_COOKIE_KEY)
let deviceId = $util.getdata(DUOKAN_DEVICE_ID_KEY)
if (!cookieVal || !deviceId) {
$util.msg(TASK_NAME, '⚠️ 请先获取 Cookie')
$util.done({})
return
}
await checkin(cookieVal, deviceId).then(() => {
$util.done({})
})
})()
function checkin(cookieVal, deviceId) {
return new Promise((resolve, reject) => {
let options = {
url: `${API_HOST}/checkin/v0/checkin`,
headers: {
'User-Agent':
'Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148',
Cookie: cookieVal
},
body: signature(deviceId)
}
$util.post(options, (error, response, data) => {
if (error) {
$util.log(`签到失败error${error}`)
$util.msg(TASK_NAME, '⚠️ 签到失败,详情请查看日志')
resolve()
return
}
let result = JSON.parse(data)
if (result && result.result === 0 && result.data) {
$util.log(`签到成功response: ${data}`)
let subtitle = `签到成功,已连续签到 ${result.data.today}`
let body = ''
if (result.data.gift && Array.isArray(result.data.gift) && result.data.gift.length > 0) {
body = result.data.gift.reduce((prev, cur) => {
return (prev += `获得 ${cur.value}${cur.name} \n`)
}, '')
}
$util.msg(TASK_NAME, subtitle, body)
resolve()
} else {
$util.log(`签到失败response: ${data}`)
$util.msg(TASK_NAME, `⚠️ 签到失败,${result.msg}`)
resolve()
}
})
})
}
function signature(deviceId) {
let t = parseInt(new Date().getTime() / 1000)
let c = 0
for (char of `${deviceId}&${t}`) {
c = (c * 131 + char.charCodeAt(0)) % 65536
}
return `_t=${t}&_c=${c}`
}
function init() {
isSurge = () => {
return undefined !== this.$httpClient
}
isQuanX = () => {
return undefined !== this.$task
}
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 = (msg) => {
console.log(`${msg}\n`)
}
get = (options, callback) => {
if (isQuanX()) {
if (typeof options == 'string') options = {url: options}
options['method'] = 'GET'
return $task.fetch(options).then(
(response) => {
response['status'] = response.statusCode
callback(null, response, response.body)
},
(reason) => callback(reason.error, null, null)
)
}
if (isSurge()) return $httpClient.get(options, callback)
}
post = (options, callback) => {
if (isQuanX()) {
if (typeof options == 'string') options = {url: options}
options['method'] = 'POST'
$task.fetch(options).then(
(response) => {
response['status'] = response.statusCode
callback(null, response, response.body)
},
(reason) => callback(reason.error, null, null)
)
}
if (isSurge()) $httpClient.post(options, callback)
}
done = (value = {}) => {
$done(value)
}
return {isSurge, isQuanX, msg, log, getdata, setdata, get, post, done}
}