Skip to content

Commit 0629dcf

Browse files
committed
1 parent 5637062 commit 0629dcf

File tree

3 files changed

+268
-10
lines changed

3 files changed

+268
-10
lines changed

.github/workflows/midu_read.yml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,23 @@ jobs:
1212
build:
1313
runs-on: ubuntu-latest
1414
env:
15-
TXNEWS_SIGN: ${{ secrets.TXNEWS_SIGN }}
16-
TXNEWS_COOKIE: ${{ secrets.TXNEWS_COOKIE }}
17-
TXNEWS_VIDEO: ${{ secrets.TXNEWS_VIDEO }}
15+
MIDU_COOKIE: ${{ secrets.MIDU_COOKIE }}
16+
MIDU_BODY: ${{ secrets.MIDU_BODY }}
17+
MIDU_DRAW: ${{ secrets.MIDU_DRAW }}
1818
steps:
1919
- uses: actions/checkout@v1
2020
- name: Use Node.js 10.x
2121
uses: actions/setup-node@v1
2222
with:
2323
node-version: 10.x
2424
- name: npm install
25+
if: env.MIDU_COOKIE
2526
run: |
2627
npm install
2728
- name: '运行 【米读自动阅读】'
2829
run: |
2930
node Task/midu_Read.js
3031
env:
31-
MIDU_COOKIE: ${{ secrets.MIDU_COOKIE }}
32-
MIDU_BODY: ${{ secrets.MIDU_BODY }}
33-
MIDU_DRAW: ${{ secrets.MIDU_DRAW }}
3432
PUSH_KEY: ${{ secrets.PUSH_KEY }}
3533
BARK_PUSH: ${{ secrets.BARK_PUSH }}
3634
TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}

Task/midu_Read.js

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,261 @@
1+
2+
const cookieName = '米读阅读时长'
3+
const $ = new Env(cookieName)
4+
let cookiesArr = [], BodyArr = [],DrawArr= [];
5+
6+
if ($.isNode()) {
7+
if (process.env.MIDU_COOKIE && process.env.MIDU_COOKIE.split('&') && process.env.MIDU_COOKIE.split('&').length > 0) {
8+
miduCookie = process.env.MIDU_COOKIE.split('&');
9+
}
10+
if (process.env.MIDU_BODY && process.env.MIDU_BODY.split('&') && process.env.MIDU_BODY.split('&').length > 0) {
11+
miduBodys = process.env.MIDU_BODY.split('&');
12+
}
13+
if (process.env.MIDU_DRAW && process.env.MIDU_DRAW.split('#') && process.env.MIDU_DRAW.split('#').length > 0) {
14+
DrawBodys = process.env.MIDU_DRAW.split('#');
15+
}
16+
Object.keys(miduCookie).forEach((item) => {
17+
if (miduCookie[item]) {
18+
cookiesArr.push(miduCookie[item])
19+
}
20+
})
21+
Object.keys(miduBodys).forEach((item) => {
22+
if (miduBodys[item]) {
23+
BodyArr.push(miduBodys[item])
24+
}
25+
})
26+
Object.keys(DrawBodys).forEach((item) => {
27+
if (DrawBodys[item]) {
28+
DrawArr.push(DrawBodys[item])
29+
}
30+
})
31+
} else {
32+
cookiesArr.push($.getdata('tokenMidu_read'));
33+
BodyArr.push($.getdata('senku_readTimebody_midu'));
34+
DrawArr.push($.getdata('senku_signbody_midu'))
35+
}
36+
37+
!(async () => {
38+
if (!cookiesArr[0]){
39+
$.msg($.name, '【提示】米读一cookie');
40+
console.log($.name, '【提示】米读一cookie');
41+
return;
42+
}
43+
if ($.isNode()){
44+
console.log(`\n============ 脚本执行来自 Github Action ==============\n`)
45+
console.log(`============ 脚本执行-国际标准时间(UTC):${new Date().toLocaleString()} =============\n`)
46+
console.log(`============ 脚本执行-北京时间(UTC+8):${new Date(new Date().getTime() + 8 * 60 * 60 * 1000).toLocaleString()}=============\n`)
47+
};
48+
for (let i = 0; i < BodyArr.length; i++) {
49+
if (BodyArr[i]) {
50+
tokenVal = cookiesArr[i];
51+
bodyVal = BodyArr[i];
52+
drawVal = DrawArr[i];
53+
//console.log(bodyVal)
54+
$.index = i + 1;
55+
console.log(`-------------------------\n\n开始【米读账号${$.index}】`)
56+
$.log(`🔔 ${cookieName}`)
57+
await readTime();
58+
await drawPrize();
59+
await prizeTask();
60+
await prizeInfo();
61+
await dice_roll();
62+
await dice_double();
63+
}
64+
}
65+
})()
66+
.catch((e) => $.log(`❌ ${cookieName} 签到失败: ${e}`))
67+
68+
69+
// 阅读时长
70+
function readTime() {
71+
return new Promise((resolve, reject) => {
72+
let request = {
73+
url: "https://apiwz.midukanshu.com/user/readTimeBase/readTime",
74+
headers: {'token' : tokenVal,'User-Agent' : `MRSpeedNovel/0918.1649 CFNetwork/1128.0.1 Darwin/19.6.0`,'mobile-brand': 'iPhone','Content-Type': 'application/x-www-form-urlencoded'
75+
},
76+
body: bodyVal,
77+
}
78+
$.post(request, (error, response, data) => {
79+
try {
80+
// $.log(`❕ ${cookieName} readTime - response: ${JSON.stringify(response)}`)
81+
readtime = JSON.parse(data)
82+
let subTitle = ''
83+
let detail = ''
84+
if (readtime && readtime.code == 0) {
85+
const coin = readtime.data.coin
86+
const readTotalMinute = readtime.data.readTotalMinute
87+
const total_coin = readtime.data.total_coin
88+
coin == 0 ? detail += `` : detail += `【阅读时长】获得${coin}💰`
89+
if (readTotalMinute % 20 == 0) {
90+
readTotalMinute ? detail += ` 阅读时长${readTotalMinute / 2}分钟,该账户:${total_coin}💰` : detail += `该账户:${total_coin}💰`
91+
$.msg(cookieName, subTitle, detail)
92+
} else if ($.getdata('debug') == 'true') {
93+
readTotalMinute ? detail += ` 阅读时长${readTotalMinute / 2}分钟,该账户:${total_coin}💰` : detail += `该账户:${total_coin}💰`
94+
$.msg(cookieName, subTitle, detail)
95+
96+
97+
}
98+
} else if (readTime.code != 0) {
99+
detail += `【阅读时长】错误代码${readtime.code},错误信息${readtime.message}`
100+
$.msg(cookieName, subTitle, detail)
101+
} else {
102+
detail += '【阅读时长】失败'
103+
$.msg(cookieName, subTitle, detail)
104+
}
105+
resolve()
106+
} catch (e) {
107+
$.msg(cookieName, `阅读时长: 失败`, `说明: ${e}`)
108+
$.log(`❌ ${cookieName} readTime - 签到失败: ${e}`)
109+
$.log(`❌ ${cookieName} readTime - response: ${JSON.stringify(response)}`)
110+
resolve()
111+
}
112+
})
113+
})
114+
}
115+
function drawPrize() {
116+
return new Promise((resolve, reject) => {
117+
const drawPrizeurlVal = 'https://apiwz.midukanshu.com/wz/task/drawPrize'
118+
const url = {
119+
url: drawPrizeurlVal,
120+
headers: {},
121+
body: drawVal
122+
}
123+
url.headers['Host'] = 'apiwz.midukanshu.com'
124+
url.headers['Content-Type'] = 'application/x-www-form-urlencoded'
125+
url.headers['User-Agent'] = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 qapp miduapp'
126+
$.post(url, (error, response, data) => {
127+
try {
128+
$.log(`🐍🐢 ${cookieName} drawPrize - response: ${JSON.stringify(response)}`)
129+
if (data) {
130+
drawprize = JSON.parse(data)
131+
}
132+
resolve()
133+
} catch (e) {
134+
// $.msg(cookieName, `抽奖: 失败`, `说明: ${e}`)
135+
$.log(`❌ ${cookieName} drawPrize - 抽奖失败: ${e}`)
136+
$.log(`❌ ${cookieName} drawPrize - response: ${JSON.stringify(response)}`)
137+
resolve()
138+
}
139+
})
140+
})
141+
}
142+
143+
// 观看视频获取抽奖机会
144+
function prizeTask() {
145+
return new Promise((resolve, reject) => {
146+
const prizeTaskurlVal = 'https://apiwz.midukanshu.com/wz/task/prizeTask'
147+
const url = {
148+
url: prizeTaskurlVal,
149+
headers: {},
150+
body: drawVal
151+
}
152+
url.headers['Host'] = 'apiwz.midukanshu.com'
153+
url.headers['Content-Type'] = 'application/x-www-form-urlencoded'
154+
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'
155+
$.post(url, (error, response, data) => {
156+
try {
157+
$.log(`🐍🐢 ${cookieName} prizeTask - response: ${JSON.stringify(response)}`)
158+
if (data) {
159+
prizetask = JSON.parse(data)
160+
}
161+
resolve()
162+
} catch (e) {
163+
// $.msg(cookieName, `观看视频抽奖: 失败`, `说明: ${e}`)
164+
$.log(`❌ ${cookieName} prizeTask - 观看视频抽奖失败: ${e}`)
165+
$.log(`❌ ${cookieName} prizeTask - response: ${JSON.stringify(response)}`)
166+
resolve()
167+
}
168+
})
169+
})
170+
}
171+
172+
// 抽奖信息
173+
function prizeInfo() {
174+
return new Promise((resolve, reject) => {
175+
const prizeInfourlVal = 'https://apiwz.midukanshu.com/wz/task/prizeList'
176+
const url = {
177+
url: prizeInfourlVal,
178+
headers: {},
179+
body: drawVal
180+
}
181+
url.headers['Host'] = 'apiwz.midukanshu.com'
182+
url.headers['Content-Type'] = 'application/x-www-form-urlencoded'
183+
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'
184+
$.post(url, (error, response, data) => {
185+
try {
186+
$.log(`🐍🐢 ${cookieName} prizeInfo - response: ${JSON.stringify(response)}`)
187+
if (data) {
188+
prizeinfo = JSON.parse(data)
189+
}
190+
resolve()
191+
} catch (e) {
192+
// $.msg(cookieName, `抽奖信息: 失败`, `说明: ${e}`)
193+
$.log(`❌ ${cookieName} prizeInfo - 抽奖信息失败: ${e}`)
194+
$.log(`❌ ${cookieName} prizeInfo - response: ${JSON.stringify(response)}`)
195+
resolve()
196+
}
197+
})
198+
})
199+
}
200+
201+
// 掷骰子
202+
function dice_roll() {
203+
return new Promise((resolve, reject) => {
204+
const dice_roll_urlVal = 'https://apiwz.midukanshu.com/wz/dice/roll'
205+
const url = {
206+
url: dice_roll_urlVal,
207+
headers: {},
208+
body: drawVal
209+
}
210+
url.headers['Host'] = 'apiwz.midukanshu.com'
211+
url.headers['Content-Type'] = 'application/x-www-form-urlencoded'
212+
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'
213+
$.post(url, (error, response, data) => {
214+
try {
215+
$.log(`🐍🐢 ${cookieName} dice_roll - response: ${JSON.stringify(response)}`)
216+
if (JSON.parse(data).code == 0) {
217+
rollList=JSON.parse(data)
218+
}
219+
resolve()
220+
} catch (e) {
221+
$.msg(cookieName, `掷骰子: 失败`, `说明: ${e}`)
222+
$.log(`❌ ${cookieName} dice_roll - 掷骰子失败: ${e}`)
223+
$.log(`❌ ${cookieName} dice_roll - response: ${JSON.stringify(response)}`)
224+
resolve()
225+
}
226+
})
227+
})
228+
}
229+
230+
// 骰子双倍奖励
231+
function dice_double() {
232+
return new Promise((resolve, reject) => {
233+
const dice_double_urlVal = 'https://apiwz.midukanshu.com/wz/dice/doubleReward'
234+
const url = {
235+
url: dice_double_urlVal,
236+
headers: {},
237+
body: drawVal
238+
}
239+
url.headers['Host'] = 'apiwz.midukanshu.com'
240+
url.headers['Content-Type'] = 'application/x-www-form-urlencoded'
241+
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'
242+
$.post(url, (error, response, data) => {
243+
try {
244+
$.log(`🐍🐢 ${cookieName} dice_double - response: ${JSON.stringify(response)}`)
245+
if (JSON.parse(data).code == 0) {
246+
doubleList=JSON.parse(data)
247+
}
248+
resolve()
249+
} catch (e) {
250+
$.msg(cookieName, `骰子双倍奖励: 失败`, `说明: ${e}`)
251+
$.log(`❌ ${cookieName} dice_double - 骰子双倍奖励失败: ${e}`)
252+
$.log(`❌ ${cookieName} dice_double - response: ${JSON.stringify(response)}`)
253+
resolve()
254+
}
255+
})
256+
})
257+
}
258+
259+
260+
261+
function Env(t,e){class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise((e,i)=>{s.call(this,t,(t,s,r)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.isNeedRewrite=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let r=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");r=r?1*r:20,r=e&&e.timeout?e.timeout:r;const[o,h]=i.split("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),r=JSON.stringify(this.data);s?this.fs.writeFileSync(t,r):i?this.fs.writeFileSync(e,r):this.fs.writeFileSync(t,r)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let r=t;for(const t of i)if(r=Object(r)[t],void 0===r)return s;return r}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),r=s?this.getval(s):"";if(r)try{const t=JSON.parse(r);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,r]=/^@(.*?)\.(.*?)$/.exec(e),o=this.getval(i),h=i?"null"===o?null:o||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,r,t),s=this.setval(JSON.stringify(e),i)}catch(e){const o={};this.lodash_set(o,r,t),s=this.setval(JSON.stringify(o),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?(this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)})):this.isQuanX()?(this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t))):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{if(t.headers["set-cookie"]){const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)}))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)})}}time(t){let e={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t}msg(e=t,s="",i="",r){const o=t=>{if(!t)return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:this.isSurge()?{url:t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t.url||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.url||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}if(this.isSurge()){let e=t.url||t.openUrl||t["open-url"];return{url:e}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}

0 commit comments

Comments
 (0)