175 lines
5.2 KiB
Python
175 lines
5.2 KiB
Python
|
"""
|
||
|
@author: GideonSenku, modified by pysta
|
||
|
@file: SurgeToJs.py
|
||
|
@createTime: 2020-05-01
|
||
|
|
||
|
本脚本用作曲线双阅读,结合APP:py3使用
|
||
|
1、登陆要阅读的账号一、二、三.....,理论无限
|
||
|
2、Surge抓包记录找到https://apiwz.midukanshu.com/user/readTimeBase/readTime选择该记录导出,使用pythonista3运行miduRead.py
|
||
|
3、在Surge->脚本->新增, 脚本名:自定义不要重复就好, 脚本类型选择Cron, cron表达式: */1 * * * * 脚本位置->本地
|
||
|
4、编辑脚本:贴贴py3的结果
|
||
|
"""
|
||
|
|
||
|
import zipfile
|
||
|
import json
|
||
|
import appex
|
||
|
import clipboard
|
||
|
import console
|
||
|
|
||
|
|
||
|
def get_request_data(path):
|
||
|
|
||
|
with zipfile.ZipFile(path, 'r') as z:
|
||
|
with z.open('model.json') as f:
|
||
|
data = json.load(f)
|
||
|
if 'request.dump' in z.namelist():
|
||
|
with z.open('request.dump') as f:
|
||
|
body = str(f.read(), encoding='utf-8')
|
||
|
data['requestBody'] = body
|
||
|
return data
|
||
|
|
||
|
|
||
|
path = appex.get_file_path()
|
||
|
data = get_request_data(path)
|
||
|
|
||
|
body = data.get('requestBody', '')
|
||
|
url = data['URL']
|
||
|
method = data['method'].lower()
|
||
|
headers = {k: v for k, v in [
|
||
|
i.split(': ', 1) for i in data['requestHeader'].split('\r\n')[1:] if i]}
|
||
|
|
||
|
js = """
|
||
|
// 赞赏:邀请码`A1040276307`
|
||
|
// 链接`http://html34.qukantoutiao.net/qpr2/bBmQ.html?pid=5eb14518`
|
||
|
// 农妇山泉 -> 有点咸
|
||
|
|
||
|
const cookieName = '米读阅读时长'
|
||
|
const signinfo = {}
|
||
|
const senku = init()
|
||
|
// 开启debug模式,每次脚本执行会显示通知,默认false
|
||
|
const debug = false
|
||
|
|
||
|
|
||
|
debug ? senku.setdata('true', 'debug') : senku.setdata('false', 'debug')
|
||
|
"""
|
||
|
js = js + f'''
|
||
|
const urlVal = {json.dumps(url)}
|
||
|
const bodyVal = {json.dumps(body)}
|
||
|
const headerVal = {json.dumps(headers, indent=4)}
|
||
|
const request = {{
|
||
|
url: urlVal,
|
||
|
headers: headerVal,
|
||
|
body: bodyVal
|
||
|
}}
|
||
|
|
||
|
'''
|
||
|
js = js + """
|
||
|
;
|
||
|
(sign = async () => {
|
||
|
senku.log(`🔔 ${cookieName}`)
|
||
|
await readTime()
|
||
|
showmsg()
|
||
|
senku.done()
|
||
|
})().catch((e) => senku.log(`❌ ${cookieName} 签到失败: ${e}`), senku.done())
|
||
|
|
||
|
|
||
|
// 阅读时长
|
||
|
function readTime() {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
senku.post(request, (error, response, data) => {
|
||
|
try {
|
||
|
senku.log(`❕ ${cookieName} readTime - response: ${JSON.stringify(response)}`)
|
||
|
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 showmsg() {
|
||
|
let subTitle = ''
|
||
|
let detail = ''
|
||
|
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.code != 0) {
|
||
|
detail += `【阅读时长】错误代码${signinfo.readTime.code},错误信息${signinfo.readTime.message}`
|
||
|
senku.msg(cookieName, subTitle, detail)
|
||
|
} else {
|
||
|
detail += '【阅读时长】失败'
|
||
|
senku.msg(cookieName, subTitle, detail)
|
||
|
}
|
||
|
|
||
|
if (senku.getdata('debug') == 'true' || detail && signinfo.readTime.data.readTotalMinute % 60 == 0) {
|
||
|
senku.msg(cookieName, subTitle, detail)
|
||
|
} else if (senku.getdata('debug') == 'true' || signinfo.readTime.data.readTotalMinute % 60 == 0) {
|
||
|
senku.msg(cookieName, '阅读结果', '时间未到')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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
|
||
|
}
|
||
|
}
|
||
|
"""
|
||
|
print(js)
|
||
|
clipboard.set(js)
|
||
|
console.hud_alert('Copyed!')
|