diff --git a/yanxuan/README.md b/yanxuan/README.md new file mode 100644 index 000000000..ab41e24ed --- /dev/null +++ b/yanxuan/README.md @@ -0,0 +1,98 @@ +# 网易严选 + +> 代码已同时兼容 Surge & QuanX, 使用同一份签到脚本即可 + +> 2020.1.11 QuanX 在`190`版本开始, 获取 Cookie 方式需要从`script-response-body`改为`script-request-header` + +## 配置 (Surge) + +```properties +[MITM] +*.you.163.com + +[Script] +http-request ^https:\/\/m\.you\.163\.com\/xhr\/points\/index\.json script-path=https://raw.githubusercontent.com/chavyleung/scripts/master/yanxuan/yanxuan.cookie.js +cron "10 0 0 * * *" script-path=https://raw.githubusercontent.com/chavyleung/scripts/master/yanxuan/yanxuan.js +``` + +## 配置 (QuanX) + +```properties +[MITM] +*.you.163.com + +[rewrite_local] +# 189及以前版本 +^https:\/\/m\.you\.163\.com\/xhr\/points\/index\.json url script-response-body yanxuan.cookie.js +# 190及以后版本 +^https:\/\/m\.you\.163\.com\/xhr\/points\/index\.json url script-request-header yanxuan.cookie.js + + + +[task_local] +1 0 * * * yanxuan.js +``` + +## 说明 + +1. 先把`*.you.163.com`加到`[MITM]` +2. 再配置重写规则: + - Surge: 把两条远程脚本放到`[Script]` + - QuanX: 把`yanxuan.cookie.js`和`yanxuan.js`传到`On My iPhone - Quantumult X - Scripts` (传到 iCloud 相同目录也可, 注意要打开 quanx 的 iCloud 开关) +3. 打开 APP, 访问下`个人`>`每日签到`(右上角) +4. 系统提示: `获取Cookie: 成功` (如果不提示获取成功, 尝试杀进程再进`个人`>`每日签到`) +5. 最后就可以把第 1 条脚本注释掉了 + +> 第 1 条脚本是用来获取 cookie 的, 用浏览器访问一次获取 cookie 成功后就可以删掉或注释掉了, 但请确保在`登录成功`后再获取 cookie. + +> 第 2 条脚本是签到脚本, 每天`00:00:10`执行一次. + +## 常见问题 + +1. 无法写入 Cookie + + - 检查 Surge 系统通知权限放开了没 + - 如果你用的是 Safari, 请尝试在浏览地址栏`手动输入网址`(不要用复制粘贴) + +2. 写入 Cookie 成功, 但签到不成功 + + - 看看是不是在登录前就写入 Cookie 了 + - 如果是,请确保在登录成功后,再尝试写入 Cookie + +3. 为什么有时成功有时失败 + + - 很正常,网络问题,哪怕你是手工签到也可能失败(凌晨签到容易拥堵就容易失败) + - 暂时不考虑代码级的重试机制,但咱有配置级的(暴力美学): + + - `Surge`配置: + + ```properties + # 没有什么是一顿饭解决不了的: + cron "10 0 0 * * *" script-path=xxx.js # 每天00:00:10执行一次 + # 如果有,那就两顿: + cron "20 0 0 * * *" script-path=xxx.js # 每天00:00:20执行一次 + # 实在不行,三顿也能接受: + cron "30 0 0 * * *" script-path=xxx.js # 每天00:00:30执行一次 + + # 再粗暴点,直接: + cron "* */60 * * * *" script-path=xxx.js # 每60分执行一次 + ``` + + - `QuanX`配置: + + ```properties + [task_local] + 1 0 * * * xxx.js # 每天00:01执行一次 + 2 0 * * * xxx.js # 每天00:02执行一次 + 3 0 * * * xxx.js # 每天00:03执行一次 + + */60 * * * * xxx.js # 每60分执行一次 + ``` + +## 感谢 + +[@NobyDa](https://github.com/NobyDa) + +[@lhie1](https://github.com/lhie1) + +[@ConnersHua](https://github.com/ConnersHua) diff --git a/yanxuan/yanxuan.cookie.js b/yanxuan/yanxuan.cookie.js new file mode 100644 index 000000000..c34838880 --- /dev/null +++ b/yanxuan/yanxuan.cookie.js @@ -0,0 +1,72 @@ +const cookieName = '网易严选' +const cookieKey = 'chavy_cookie_yanxuan' +const tokenKey = 'chavy_token_yanxuan' +const chavy = init() +const cookieVal = $request.headers['Cookie'] +if (cookieVal.indexOf('yx_csrf') > 0) { + if (chavy.setdata(cookieVal, cookieKey)) { + chavy.msg(`${cookieName}`, '获取Cookie: 成功', '') + chavy.log(`[${cookieName}] 获取Cookie: 成功, cookie: ${cookieVal}`) + } +} else { + chavy.msg(`${cookieName}`, '获取Cookie: 失败', `请确保在已登录状态下获取Cookie`) + chavy.log(`[${cookieName}] ${subTitle}, cookie: ${cookieVal}`) +} + +const queryparam = $request.url.split('?')[1] +if (queryparam) { + const params = {} + for (param of $request.url.split('?')[1].split('&')) { + params[param.split('=')[0]] = param.split('=')[1] + } + const token = JSON.stringify(params) + if (params['csrf_token'] && chavy.setdata(token, tokenKey)) { + chavy.msg(`${cookieName}`, '获取Token: 成功', '') + chavy.log(`[${cookieName}] 获取Token: 成功, token: ${token}`) + } +} + +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.body)) + } + } + post = (url, cb) => { + if (isSurge()) { + $httpClient.post(url, cb) + } + if (isQuanX()) { + url.method = 'POST' + $task.fetch(url).then((resp) => cb(null, {}, resp.body)) + } + } + done = (value = {}) => { + $done(value) + } + return { isSurge, isQuanX, msg, log, getdata, setdata, get, post, done } +} +chavy.done() diff --git a/yanxuan/yanxuan.js b/yanxuan/yanxuan.js new file mode 100644 index 000000000..46a8a1515 --- /dev/null +++ b/yanxuan/yanxuan.js @@ -0,0 +1,87 @@ +const cookieName = '网易严选' +const cookieKey = 'chavy_cookie_yanxuan' +const tokenKey = 'chavy_token_yanxuan' +const chavy = init() +let cookieVal = chavy.getdata(cookieKey) +let tokenVal = chavy.getdata(tokenKey) + +sign() + +function sign() { + const token = JSON.parse(tokenVal) + let url = { url: `https://m.you.163.com/xhr/points/sign.json?csrf_token=${token.csrf_token}`, headers: { Cookie: cookieVal } } + url.headers['Accept'] = `application/json, text/javascript, */*; q=0.01` + url.headers['Accept-Encoding'] = `gzip, deflate, br` + url.headers['Origin'] = `https://m.you.163.com` + url.headers['Connection'] = `keep-alive` + url.headers['Host'] = `m.you.163.com` + url.headers['Content-Length'] = `0` + url.headers['User-Agent'] = `Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 yanxuan/5.1.2 device-id/d7af0a77d9d88bd33a8ae5b35e6219ad app-chan-id/AppStore trustId/ios_trustid_3353a5577f9c4677bddec1ca7ac490fb` + url.headers['Referer'] = `https://m.you.163.com/points/index` + url.headers['Accept-Language'] = `zh-cn` + url.headers['X-Requested-With'] = `XMLHttpRequest` + + chavy.post(url, (error, response, data) => { + chavy.log(`${cookieName}, data: ${data}`) + const result = JSON.parse(data) + const title = `${cookieName}` + let subTitle = `` + let detail = `` + if (result.code == '200') { + subTitle = `签到结果: 成功` + detail = `积分: ${result.data.point}` + } else if (result.code == '400') { + subTitle = `签到结果: 成功 (重复签到)` + detail = `说明: ${result.errorCode}` + } else { + subTitle = `签到失败: 未知` + detail = `编码: ${result.code}, 说明: ${result.errorCode}` + } + chavy.msg(title, subTitle, detail) + }) + chavy.done() +} + +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.body)) + } + } + post = (url, cb) => { + if (isSurge()) { + $httpClient.post(url, cb) + } + if (isQuanX()) { + url.method = 'POST' + $task.fetch(url).then((resp) => cb(null, {}, resp.body)) + } + } + done = (value = {}) => { + $done(value) + } + return { isSurge, isQuanX, msg, log, getdata, setdata, get, post, done } +}