├── .gitignore ├── LICENSE ├── Loon.scripts.conf ├── QuantumultX.rewrite.conf ├── QuantumultX.task.conf ├── README.md ├── README_EN.md ├── Surge.cookies.sgmodule ├── Surge.tasks.sgmodule ├── _config.yml ├── check_in ├── appstore │ └── AppMonitor.js ├── energybill │ ├── bill.js │ └── billhn.js ├── funko │ ├── funboat.js │ └── mindstyle.js ├── glados │ ├── checkin.jpeg │ ├── checkin_env.js │ ├── checkincookie.jpeg │ ├── checkincookie_env.js │ └── glados.js ├── hjjc │ └── hjjc.js ├── hotsearch │ └── hot.js ├── hzh │ └── hzh.js ├── idaily │ └── idaily.js ├── jiumu │ └── jiumu.js ├── klcw │ ├── klcw-app.js │ └── klcw.js ├── nasa │ └── nasapic.js ├── ssq │ └── ssq.js ├── taobao │ ├── tb-name.js │ └── tb.js ├── timepop │ └── timepop.js ├── wechatsubs │ ├── gxrcw.js │ ├── sydwzp.js │ └── wechatsubs.js └── weibo │ ├── deletecookie.js │ ├── weibotalk.cookie.js │ ├── weibotalk.js │ └── 获取Cookie指南.MOV ├── evilbutcher.boxjs.json ├── picture ├── 10th.png ├── 11th.png ├── 13th.png ├── alyp.png ├── bill.png ├── bill_tran.png ├── doc.png ├── funko.png ├── funko_tran.png ├── gjb.png ├── gjb_tran.png ├── gxrcw.png ├── gxrcw_tran.png ├── hzh.png ├── hzh_tran.png ├── idaily.png ├── idaily_tran.png ├── img.png ├── jiumu.png ├── jiumu_tran.png ├── klcw.png ├── klcw_tran.png ├── mindstyle.png ├── mindstyle_tran.png ├── nasa.png ├── nasa_tran.png ├── photo.jpeg ├── ssq.png ├── ssq_tran.png ├── sydw.png ├── sydw_tran.png ├── tb.png ├── tb_tran.png ├── timepop.png ├── timepop_tran.png ├── wechat.png ├── wechat_tran.png └── zouswu.png ├── profiles ├── Loon │ └── Loon.scripts.conf ├── QuantumultX │ ├── QuantumultX.rewrite.conf │ ├── QuantumultX.task.json │ ├── addons │ │ ├── funboat.conf │ │ ├── glados.conf │ │ ├── hzh.conf │ │ ├── jiumu.conf │ │ ├── klcw-app.conf │ │ ├── klcw.conf │ │ ├── taobao.conf │ │ ├── timepop.conf │ │ └── weibo.conf │ ├── evil.conf │ └── evilbuther.list ├── Surge │ ├── Surge.cookies.sgmodule │ └── Surge.tasks.sgmodule └── package.json └── remove_ad ├── 10086.js ├── README.md ├── bbdc.js ├── bjyd.js ├── nltk.js ├── pk.js ├── quake.js ├── rewrite.txt └── zhihu.js /.gitignore: -------------------------------------------------------------------------------- 1 | zhsz 2 | gjb -------------------------------------------------------------------------------- /Loon.scripts.conf: -------------------------------------------------------------------------------- 1 | # evilbutcher 脚本集合 2 | 3 | hostname = h5.youzan.com, glados.rocks, api.weibo.cn 4 | 5 | http-request https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkin, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js, tag=Funboat获取签到Cookie 6 | http-request https:\/\/h5\.youzan\.com\/wscuser\/membercenter\/stats, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js, tag=Funboat获取积分Cookie 7 | http-request https:\/\/glados\.rocks\/api\/user\/status, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js, tag=GLaDOS获取Cookie 8 | http-request ^https?://m?api\.weibo\.c(n|om)\/2\/(cardlist|page\/button|page) script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.cookie.js,requires-body=false, tag=微博超话获取Cookie 9 | 10 | cron "0 6 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/nasa/nasapic.js, tag=NASA每日一图 11 | cron "0 6 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/idaily/idaily.js, tag=iDaily每日环球视野 12 | cron "30 7-22 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/appstore/AppMonitor.js, tag=App价格监控 13 | cron "30 0 8-22/2 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hotsearch/hot.js, tag=热门监控 14 | cron "45 3 8 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.js, tag=微博超话 15 | cron "25 4 8 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js, tag=GLaDOS签到 16 | cron "45 4 8 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/checkin_env.js, tag=机场签到 17 | cron "0 5 8 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/checkincookie_env.js, tag=机场签到Cookie版 18 | cron "0 4 8 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js, tag=Funboat签到 -------------------------------------------------------------------------------- /QuantumultX.rewrite.conf: -------------------------------------------------------------------------------- 1 | # @evilbutcher 脚本集合 2 | 3 | hostname = h5.youzan.com, glados.rocks, api.weibo.cn, api.weibo.com, 10086.online-cmcc.cn, 121.43.19.216, sapi.beingfine.cn, mobilebj.cn, api.gotokeep.com 4 | 5 | #funboat获取Cookie 6 | https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkin url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js 7 | https:\/\/h5\.youzan\.com\/wscuser\/membercenter\/stats url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js 8 | 9 | #GLaDOS获取Cookie 10 | https:\/\/glados\.rocks\/api\/user\/status url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js 11 | 12 | #微博超话获取Cookie 13 | ^https?://m?api\.weibo\.c(n|om)\/2\/(cardlist|page\/button|page) url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.cookie.js 14 | 15 | #10086去开屏广告 16 | https:\/\/10086\.online\-cmcc\.cn\:20010\/gfms\/front\/hn\/busi3\!getAdvert url script-response-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/remove_ad/10086.js 17 | 18 | #不背单词解锁 19 | ^https:\/\/sapi\.beingfine\.cn\/v3\/report\/launch\/ url script-response-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/remove_ad/bbdc.js 20 | 21 | #北京移动去开屏广告 22 | https:\/\/mobilebj\.cn\/app\/appBasicInfo? url script-response-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/remove_ad/bjyd.js 23 | 24 | #微博去广告 25 | https:\/\/api\.weibo\.com\/oauth2\/getaid url reject 26 | 27 | #keep去开屏广告 28 | https:\/\/api\.gotokeep\.com\/ads\/v1\/ads\?spotIds url reject 29 | -------------------------------------------------------------------------------- /QuantumultX.task.conf: -------------------------------------------------------------------------------- 1 | # @evilbutcher 脚本集合 2 | 3 | [tack_local] 4 | 0 0 6 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/nasa/nasapic.js, tag=NASA每日一图, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/nasa.png, enabled=true 5 | 0 0 6 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/idaily/idaily.js, tag=iDaily每日环球视野, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/idaily.png, enabled=true 6 | 30 7-22 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/appstore/AppMonitor.js, tag=App价格监控, img-url=https://raw.githubusercontent.com/Orz-3/Task/master/appstore.png, enabled=true 7 | 30 0 8-22/2 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hotsearch/hot.js, tag=热门监控, img-url=https://raw.githubusercontent.com/58xinian/icon/master/hot.png, enabled=true 8 | 45 3 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.js, tag=微博超话, img-url=https://raw.githubusercontent.com/Orz-3/Task/master/weibo.png, enabled=true 9 | 25 4 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js, tag=GLaDOS, img-url=https://raw.githubusercontent.com/58xinian/icon/master/glados1.png, enabled=true 10 | 45 4 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/checkin_env.js, tag=机场签到, img-url=https://raw.githubusercontent.com/Orz-3/Task/master/airport.png, enabled=true 11 | 0 5 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master//check_in/glados/checkincookie_env.js, tag=机场签到Cookie版, img-url=https://raw.githubusercontent.com/58xinian/icon/master/glados.png, enabled=true 12 | 0 4 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js, tag=Funboat, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/funko.png, enabled=true -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Anurag's github stats](https://github-readme-stats.vercel.app/api?username=evilbutcher)](https://github.com/anuraghazra/github-readme-stats) 2 | 3 | # Quantumult X 脚本和规则整理 4 | 5 | #### [English Version](https://github.com/evilbutcher/QuantumultX/blob/master/README_EN.md) 6 | 7 | 绝大多数代码都用到了@chavyleung 的 Env.js 和@Peng-YM 的 OpenAPI.js,感谢! 8 | 9 | ### 如果实际使用下载速度太慢推荐"加速器":[GLaDOS](https://glados.space/landing/3JRG4-KSGZJ-8QPXF-8PPOO)(3JRG4-KSGZJ-8QPXF-8PPOO) 10 | 11 | ## 脚本合集 12 | 13 | ### 【BoxJs】订阅 14 | 15 | https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/evilbutcher.boxjs.json 16 | 17 | ### 【Quantumult X】脚本订阅合集+自己写的去广告 18 | 19 | https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/QuantumultX.rewrite.conf 20 | https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/QuantumultX.task.json 21 | 22 | ### 【Surge】脚本订阅合集 23 | 24 | https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/Surge.tasks.sgmodule 25 | https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/Surge.cookies.sgmodule 26 | 27 | ### 【Loon】脚本订阅合集 28 | 29 | https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/Loon.scripts.conf 30 | 31 | ## 脚本 32 | 33 | ### [微博超话(单账号)](https://github.com/evilbutcher/QuantumultX/tree/master/check_in/weibo) 34 | 35 | #### 功能特点 36 | 37 | 1. 自动获取最新超话列表。 38 | 2. 自动签到。 39 | 3. 如果超话数量大于 100,可以先检查签到情况,未签到才会执行,更好解决签到频繁问题。 40 | 4. 支持 BoxJs。 41 | 42 | ### [自用签到](https://github.com/evilbutcher/QuantumultX/tree/master/check_in/glados) 43 | 44 | #### 功能特点 45 | 46 | 1. 自动签到。 47 | 2. 查看流量信息。 48 | 3. 支持 BoxJs。 49 | 4. checkin_env.js 修改自@Neurogram-R,增加了多平台支持。 50 | 51 | ### [公众号监控](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/wechatsubs/wechatsubs.js) 52 | 53 | #### 功能特点 54 | 55 | 1. 设定关键词监控公众号推送。 56 | 2. 可自定关键词推送间隔。 57 | 58 | ### [热门监控](https://github.com/evilbutcher/QuantumultX/tree/master/check_in/hotsearch/hot.js) 59 | 60 | #### 功能特点 61 | 62 | 1. 可以选择性监控榜单。 63 | 2. 可以分别设定每个榜单的最热内容数量。 64 | 3. 可以选择是否附带话题链接。 65 | 4. 可以自定每个榜单是匹配关键词还是获取最新内容。 66 | 5. 可以自定每个榜单内容独立推送还是合并推送。 67 | 6. 一些榜单单独推送时支持封面。 68 | 7. 支持 BoxJs。 69 | 8. 监控微博热搜关键词。 70 | 9. 监控知乎热榜关键词。 71 | 10. 监控百度风云榜关键词。 72 | 11. 监控 B 站日榜关键词(对应关系:0 全站,1 动画,3 音乐,4 游戏,5 娱乐,36 科技,119 鬼畜,129 舞蹈)。 73 | 12. 监控豆瓣电影关键词。 74 | 13. 监控抖音视频关键词。 75 | 14. 监控 36 氪关键词。 76 | 15. 监控 Kindle 图书关键词。 77 | 16. 监控 RSSHub 订阅,感谢@api-evangelist-[rss2json](https://github.com/api-evangelist/rss2json)。 78 | 17. ~~监控人人影视最新上传,配合捷径[磁力离线](https://www.icloud.com/shortcuts/cfad8390798e459db458d6233d229209)可实现磁力下载,解锁追剧新姿势。~~ 79 | 18. 可自定关键词推送间隔。 80 | 81 | ### [App 价格监控](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/appstore/AppMonitor.js) 82 | 83 | #### 功能特点 84 | 85 | 1. pp 可单独设置区域,未单独设置区域,则采用 reg 默认区域。 86 | 2. 设置区域方式“1443988620:hk,1443988620/us,1443988620-uk,1443988620_jp,1443988620 au”。 87 | 3. 支持 BoxJs by evilbutcher。 88 | 89 | ### [NASA 每日一图](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/nasa/nasapic.js) 90 | 91 | #### 功能特点 92 | 93 | 1. 首先前往https://api.nasa.gov/ 申请一个 API,秒通过。 94 | 2. 将申请好的 API 填入 BoxJs。 95 | 3. 可以选择输出中文还是英文。 96 | 4. 点击通知可以打开浏览器图片-保存。 97 | 98 | ### [iDaily 每日环球视野](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/idaily/idaily.js) 99 | 100 | #### 功能特点 101 | 102 | 1. 可选择随机 or 最新内容。 103 | 104 | ### [Funboat](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/funboat/funboat.js) 105 | 106 | #### 功能特点 107 | 108 | 1. 喜欢 funko 可以关注该微信小程序。 109 | 110 | ### [九木杂物社](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/jiumu/jiumu.js) 111 | 112 | #### 功能特点 113 | 114 | 1. 九木杂物社自动签到。 115 | 116 | ### [酷乐潮玩](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/klcw) 117 | 118 | #### 功能特点 119 | 120 | 1. 酷乐潮玩小程序、App 自动签到。 121 | 122 | ### [信息查询](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/wechatsubs) 123 | 124 | #### 功能特点 125 | 126 | 1. 支持事业单位招聘监控。 127 | 2. 支持高校人才网监控。 128 | 129 | ### [彩票查询](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/ssq/ssq.js) 130 | 131 | #### 功能特点 132 | 133 | 1. 支持双色球、大乐透、福彩 3D、七乐彩。 134 | 2. 支持仅查询当日开奖的彩票。 135 | 136 | ### [华住会](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/hzh/hzh.js) 137 | 138 | #### 功能特点 139 | 140 | 1. 自动签到。 141 | 2. 领取奖励(开发中)。 142 | 143 | ## 规则类 144 | 145 | ### [去广告](https://github.com/evilbutcher/QuantumultX/tree/master/remove_ad) 146 | 147 | #### 功能特点 148 | 149 | [Readme](https://github.com/evilbutcher/QuantumultX/tree/master/remove_ad/README.md) 150 | 151 | ### 免责声明 152 | 153 | 1. 此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 154 | 2. 由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 155 | 3. 请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 156 | 4. 此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 157 | 5. 本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 158 | 6. 如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 159 | 7. 所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 160 | 161 | ### 访问量 162 | 163 | ![](http://profile-counter.glitch.me/evilbutcher/count.svg) 164 | -------------------------------------------------------------------------------- /README_EN.md: -------------------------------------------------------------------------------- 1 | [![Anurag's github stats](https://github-readme-stats.vercel.app/api?username=evilbutcher)](https://github.com/anuraghazra/github-readme-stats) 2 | 3 | #### Recommended "Accelerator" if the actual download speed is too slow: [GLaDOS](https://glados.space/landing/3JRG4-KSGZJ-8QPXF-8PPOO)(3JRG4-KSGZJ-8QPXF-8PPOO) 4 | 5 | # Scripts and Rules Collation 6 | 7 | The majority of the code used Env.js (@chavyleung) and OpenAPI.js (@Peng-YM), thanks! 8 | 9 | ## All Scripts for Different Platforms. 10 | 11 | ### BoxJs 12 | 13 | https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/evilbutcher.boxjs.json 14 | 15 | ### For Quantumult X 16 | 17 | https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/QuantumultX.rewrite.conf 18 | https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/QuantumultX.task.conf (Content needs to be copied to[task_local]) 19 | 20 | ### For Surge 21 | 22 | https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/Surge.tasks.sgmodule 23 | https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/Surge.cookies.sgmodule 24 | 25 | ### For Loon 26 | 27 | https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/Loon.scripts.conf 28 | 29 | ## Scripts 30 | 31 | ### [Weibo Supertalk(single account)](https://github.com/evilbutcher/QuantumultX/tree/master/check_in/weibo) 32 | 33 | #### Features 34 | 35 | 1. Automatically get the latest supertalk list. 36 | 2. Automatic check-in. 37 | 3. If the number of supertalks more than 100, you can turn on the first check the check-in status, will only be executed for unchecked, to better solve the problem of failing check-in. 38 | 4. Supports BoxJs. 39 | 40 | ### [Checkin](https://github.com/evilbutcher/QuantumultX/tree/master/check_in/glados) 41 | 42 | #### Features 43 | 44 | 1. Automatic check-in. 45 | 2. View traffic information. 46 | 3. Support BoxJs. 47 | 4. Checkin_env.js is modified from @Neurogram-R, adding multi-platform support. 48 | 5. GitHub Action has been supported. First, Fork this repo, add CHECKIN_TITLE CHECKIN_URL CHECKIN_EMAIL CHECKIN_PASSWORD four data in the Secrets of the forked repo. Different accounts are separated by &. Both schedule and Star your repo, checkin can be run. Please refer to [pull](https://github.com/wei/pull/blob/master/README.md) on how to keep in sync. 49 | 50 | ### [Wechatsubs](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/wechatsubs/wechatsubs.js) 51 | 52 | #### Features 53 | 54 | 1. You can set keywords to monitor the push of Wechat Subscriptions. 55 | 2. You can customize the keyword push interval. 56 | 57 | ### [Hotlist Monitor](https://github.com/evilbutcher/QuantumultX/tree/master/check_in/hotsearch/hot.js) 58 | 59 | #### Features 60 | 61 | 1. You can selectively monitor the list. 62 | 2. You can set the number of the hottest content in each list. 63 | 3. You can choose whether to attach topic links. 64 | 4. You can decide whether to match keywords or get the latest content for each list. 65 | 5. You can decide whether to split push or merge push the content of each list. 66 | 6. Some lists support cover page when pushed separately. 67 | 7. Support for BoxJs. 68 | 8. Monitor Weibo hotsearch keywords. 69 | 9. Monitoring Zhihu hotlist keywords. 70 | 10. Monitoring the Baidu hotlist keywords. 71 | 11. Monitor Bilibili hotlist keywords (Correspondence: 0 whole site, 1 animation, 3 music, 4 games, 5 entertainment, 36 technology, 119 kichiku, 129 dance). 72 | 12. Monitor Douban movie keywords. 73 | 13. Monitor Tiktok keywords. 74 | 14. Monitor 36Kr keywords. 75 | 15. Monitor Kindle book keywords. 76 | 16. Monitor RSSHub feeds, thanks to @api-evangelist-[rss2json](https://github.com/api-evangelist/rss2json). 77 | 17. ~~Monitor the latest uploads of RenRenTV, with shortcuts [magnetic offline](https://www.icloud.com/shortcuts/cfad8390798e459db458d6233d229209) can achieve magnetic download, unlocking a new way to catch up on dramas.~~ 78 | 18. You can customize the keyword push interval. 79 | 80 | ### [App Price Monitor](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/appstore/AppMonitor.js) 81 | 82 | #### Features 83 | 84 | 1. The app can set the region individually, if not, the default region is reg. 85 | 2. Set the region like "1443988620:hk, 1443988620/us, 1443988620-uk, 1443988620_jp, 1443988620 au". 86 | 3. Support BoxJs by evilbutcher. 87 | 88 | ### [NASA's Picture of the Day](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/nasa/nasapic.js) 89 | 90 | #### Features 91 | 92 | 1. First, go to https://api.nasa.gov/ to apply for an API, which is passed in seconds. 93 | 2. Fill in the applied API into BoxJs. 94 | 3. You can choose to output Chinese or English. 95 | 4. Click on the notification to open the browser image - Save. 96 | 97 | ### [iDaily] (https://github.com/evilbutcher/QuantumultX/blob/master/check_in/idaily/idaily.js) 98 | 99 | ### Features 100 | 101 | 1. Optional random or newest content 102 | 103 | ### [Funboat](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/funboat/funboat.js) 104 | 105 | #### Features 106 | 107 | 1. Who like funko can follow the WeChat app. 108 | 109 | ### [Jiumu](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/jiumu/jiumu.js) 110 | 111 | #### Features 112 | 113 | 1. Automatic check-in. 114 | 115 | ### [KuLeChaoWan](https://github.com/evilbutcher/QuantumultX/blob/master/check_in/klcw) 116 | 117 | #### Features 118 | 119 | 1. Automatic check-in. 120 | 121 | ### Disclaimer 122 | 123 | 1. This script is only used for study and research, and does not guarantee its legitimacy, accuracy, and validity. Please make your own judgment based on the situation. I do not assume any guarantee responsibility for this. 124 | 2. Since this script is only used for learning and research, you must completely delete all content from your computer or mobile phone or any storage device within 24 hours after downloading. I am not responsible for any incidents caused by violation of the regulations. 125 | 3. Please do not use this script for any commercial or illegal purposes. If you violate the regulations, please be responsible for it. 126 | 4. The application involved in this script has nothing to do with me, and I am not responsible for any privacy leakage or other consequences caused by this. 127 | 5. I am not responsible for any problems caused by scripts, including but not limited to any loss and damage caused by script errors. 128 | 6. If any unit or individual believes that this script may be suspected of infringing on their rights, they should promptly notify and provide proof of identity and ownership. We will delete this script after receiving the confirmation of the certification document. 129 | 7. All people who directly or indirectly use or view this script should read this statement carefully. I reserve the right to change or supplement this statement at any time. Once you use or copy this script, you are deemed to have accepted this disclaimer. 130 | 131 | ### Visitors 132 | 133 | ![](http://profile-counter.glitch.me/evilbutcher/count.svg) 134 | -------------------------------------------------------------------------------- /Surge.cookies.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=evilbutcher Cookies Module 2 | #!desc=Cookies 合集模块配置 3 | #!system=ios 4 | 5 | [Script] 6 | Funboat获取签到Cookie = type=http-request,pattern=https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkin,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js 7 | Funboat获取积分Cookie = type=http-request,pattern=https:\/\/h5\.youzan\.com\/wscuser\/membercenter\/stats,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js 8 | GLaDOS获取Cookie = type=http-request,pattern=https:\/\/glados\.rocks\/api\/user\/status, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js 9 | 微博超话获取Cookie = type=http-request,pattern=^https?://m?api\.weibo\.c(n|om)\/2\/(cardlist|page\/button),script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.cookie.js 10 | 11 | [MITM] 12 | hostname = %INSERT%, h5.youzan.com, glados.rocks, api.weibo.cn -------------------------------------------------------------------------------- /Surge.tasks.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=evilbutcher Tasks Module 2 | #!desc=Tasks 合集模块配置 3 | #!system=ios 4 | 5 | [Script] 6 | NASA每日一图 = type=cron,cronexp=0 0 6 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/nasa/nasapic.js 7 | iDaily每日环球视野 = type=cron,cronexp=0 0 6 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/idaily/idaily.js 8 | App价格监控 = type=cron,cronexp=30 7-22 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/appstore/AppMonitor.js 9 | 热门监控 = type=cron,cronexp=30 0 8-22/2 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hotsearch/hot.js 10 | 微博超话 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.js 11 | GLaDOS签到 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js 12 | 机场签到 = type=cron,cronexp=0 1 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/checkin_env.js 13 | 机场签到Cookie = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/checkincookie_env.js 14 | Funboat签到 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-architect -------------------------------------------------------------------------------- /check_in/glados/checkin.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/check_in/glados/checkin.jpeg -------------------------------------------------------------------------------- /check_in/glados/checkincookie.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/check_in/glados/checkincookie.jpeg -------------------------------------------------------------------------------- /check_in/idaily/idaily.js: -------------------------------------------------------------------------------- 1 | /* 2 | 【iDaily】@evilbutcher 3 | 4 | 【仓库地址】https://github.com/evilbutcher/QuantumultX/tree/master(欢迎star🌟) 5 | 6 | 【BoxJs】https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/evilbutcher.boxjs.json 7 | 8 | 【致谢】 9 | 感谢Peng-YM的OpenAPI.js! 10 | 11 | ⚠️【免责声明】 12 | ------------------------------------------ 13 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 14 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 15 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 16 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 17 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 18 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 19 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 20 | 21 | 【Surge】 22 | ----------------- 23 | [Script] 24 | iDaily每日环球视野 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/idaily/idaily.js 25 | 26 | 【Loon】 27 | ----------------- 28 | [Script] 29 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/idaily/idaily.js, tag=iDaily每日环球视野 30 | 31 | 【Quantumult X】 32 | ----------------- 33 | [task_local] 34 | 5 0 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/idaily/idaily.js, tag=iDaily每日环球视野 35 | 36 | 【Icon】 37 | 透明:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/idaily_tran.png 38 | 彩色:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/idaily.png 39 | */ 40 | 41 | const $ = new API("iDaily"); 42 | const ERR = MYERR(); 43 | $.time = (new Date().getTime() / 1000).toFixed(0); 44 | $.random = [true, "true"].includes($.read("random")) || false; 45 | 46 | !(async () => { 47 | await getcontent(); 48 | showmsg(); 49 | })() 50 | .catch((err) => { 51 | if (err instanceof ERR.ParseError) { 52 | $.notify("iDaily", "❌ 解析数据出现错误", err.message); 53 | } else { 54 | $.notify( 55 | "iDaily", 56 | "❌ 出现错误", 57 | JSON.stringify(err, Object.getOwnPropertyNames(err)) 58 | ); 59 | } 60 | }) 61 | .finally(() => $.done()); 62 | 63 | function getcontent() { 64 | const url = `https://idaily-cdn.idailycdn.com/api/list/v3/iphone/zh-hans?page=1&ver=iphone&app_ver=122&app_timestamp=${$.time}`; 65 | const headers = { 66 | Connection: `keep-alive`, 67 | Host: `idaily-cdn.idailycdn.com`, 68 | "Accept-Encoding": `gzip`, 69 | "User-Agent": `CLKit 1.0 rv:1 (iPhone; iOS 13.6.1; zh_CN)`, 70 | "Content-Type": "text/html; charset=utf-8", 71 | }; 72 | const myRequest = { 73 | url: url, 74 | headers: headers, 75 | }; 76 | return $.http.get(myRequest).then((response) => { 77 | $.log(response.body); 78 | if (response.statusCode == 200) { 79 | var obj = JSON.parse(response.body); 80 | $.data = obj; 81 | } else { 82 | $.error(JSON.stringify(response)); 83 | $.notify("iDaily", "", "❌ 未知错误,请查看日志"); 84 | } 85 | }); 86 | } 87 | 88 | function showmsg() { 89 | try { 90 | if ($.random == true) { 91 | var i = Math.round(Math.random() * $.data.length); 92 | } else { 93 | i = 0; 94 | } 95 | $.info(JSON.stringify($.data[i])); 96 | var content = $.data[i].content; 97 | var location = $.data[i].location; 98 | var cover = $.data[i]["cover_landscape_hd"]; 99 | var link = $.data[i]["link_share"]; 100 | var title = $.data[i].title; 101 | var caption = $.data[i]["ui_sets"]["caption_subtitle"]; 102 | var detail = `📍 ${location}\n${content}`; 103 | $.notify(`📅 ${title}`, `⏩ ${caption}`, detail, { 104 | "media-url": cover, 105 | "open-url": link, 106 | }); 107 | } catch (err) { 108 | throw new ERR.ParseError("请稍候重试"); 109 | } 110 | } 111 | 112 | function MYERR() { 113 | class ParseError extends Error { 114 | constructor(message) { 115 | super(message); 116 | this.name = "ParseError"; 117 | } 118 | } 119 | return { 120 | ParseError, 121 | }; 122 | } 123 | 124 | /** 125 | * OpenAPI 126 | * @author: Peng-YM 127 | * https://github.com/Peng-YM/QuanX/blob/master/Tools/OpenAPI/README.md 128 | */ 129 | function ENV() { 130 | const isQX = typeof $task !== "undefined"; 131 | const isLoon = typeof $loon !== "undefined"; 132 | const isSurge = typeof $httpClient !== "undefined" && !isLoon; 133 | const isJSBox = typeof require == "function" && typeof $jsbox != "undefined"; 134 | const isNode = typeof require == "function" && !isJSBox; 135 | const isRequest = typeof $request !== "undefined"; 136 | const isScriptable = typeof importModule !== "undefined"; 137 | return { 138 | isQX, 139 | isLoon, 140 | isSurge, 141 | isNode, 142 | isJSBox, 143 | isRequest, 144 | isScriptable, 145 | }; 146 | } 147 | 148 | function HTTP( 149 | defaultOptions = { 150 | baseURL: "", 151 | } 152 | ) { 153 | const { isQX, isLoon, isSurge, isScriptable, isNode } = ENV(); 154 | const methods = ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"]; 155 | const URL_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/; 156 | 157 | function send(method, options) { 158 | options = 159 | typeof options === "string" 160 | ? { 161 | url: options, 162 | } 163 | : options; 164 | const baseURL = defaultOptions.baseURL; 165 | if (baseURL && !URL_REGEX.test(options.url || "")) { 166 | options.url = baseURL ? baseURL + options.url : options.url; 167 | } 168 | options = { 169 | ...defaultOptions, 170 | ...options, 171 | }; 172 | const timeout = options.timeout; 173 | const events = { 174 | ...{ 175 | onRequest: () => {}, 176 | onResponse: (resp) => resp, 177 | onTimeout: () => {}, 178 | }, 179 | ...options.events, 180 | }; 181 | 182 | events.onRequest(method, options); 183 | 184 | let worker; 185 | if (isQX) { 186 | worker = $task.fetch({ 187 | method, 188 | ...options, 189 | }); 190 | } else if (isLoon || isSurge || isNode) { 191 | worker = new Promise((resolve, reject) => { 192 | const request = isNode ? require("request") : $httpClient; 193 | request[method.toLowerCase()](options, (err, response, body) => { 194 | if (err) reject(err); 195 | else 196 | resolve({ 197 | statusCode: response.status || response.statusCode, 198 | headers: response.headers, 199 | body, 200 | }); 201 | }); 202 | }); 203 | } else if (isScriptable) { 204 | const request = new Request(options.url); 205 | request.method = method; 206 | request.headers = options.headers; 207 | request.body = options.body; 208 | worker = new Promise((resolve, reject) => { 209 | request 210 | .loadString() 211 | .then((body) => { 212 | resolve({ 213 | statusCode: request.response.statusCode, 214 | headers: request.response.headers, 215 | body, 216 | }); 217 | }) 218 | .catch((err) => reject(err)); 219 | }); 220 | } 221 | 222 | let timeoutid; 223 | const timer = timeout 224 | ? new Promise((_, reject) => { 225 | timeoutid = setTimeout(() => { 226 | events.onTimeout(); 227 | return reject( 228 | `${method} URL: ${options.url} exceeds the timeout ${timeout} ms` 229 | ); 230 | }, timeout); 231 | }) 232 | : null; 233 | 234 | return (timer 235 | ? Promise.race([timer, worker]).then((res) => { 236 | clearTimeout(timeoutid); 237 | return res; 238 | }) 239 | : worker 240 | ).then((resp) => events.onResponse(resp)); 241 | } 242 | 243 | const http = {}; 244 | methods.forEach( 245 | (method) => 246 | (http[method.toLowerCase()] = (options) => send(method, options)) 247 | ); 248 | return http; 249 | } 250 | 251 | function API(name = "untitled", debug = false) { 252 | const { isQX, isLoon, isSurge, isNode, isJSBox, isScriptable } = ENV(); 253 | return new (class { 254 | constructor(name, debug) { 255 | this.name = name; 256 | this.debug = debug; 257 | 258 | this.http = HTTP(); 259 | this.env = ENV(); 260 | 261 | this.node = (() => { 262 | if (isNode) { 263 | const fs = require("fs"); 264 | 265 | return { 266 | fs, 267 | }; 268 | } else { 269 | return null; 270 | } 271 | })(); 272 | this.initCache(); 273 | 274 | const delay = (t, v) => 275 | new Promise(function (resolve) { 276 | setTimeout(resolve.bind(null, v), t); 277 | }); 278 | 279 | Promise.prototype.delay = function (t) { 280 | return this.then(function (v) { 281 | return delay(t, v); 282 | }); 283 | }; 284 | } 285 | 286 | // persistence 287 | // initialize cache 288 | initCache() { 289 | if (isQX) this.cache = JSON.parse($prefs.valueForKey(this.name) || "{}"); 290 | if (isLoon || isSurge) 291 | this.cache = JSON.parse($persistentStore.read(this.name) || "{}"); 292 | 293 | if (isNode) { 294 | // create a json for root cache 295 | let fpath = "root.json"; 296 | if (!this.node.fs.existsSync(fpath)) { 297 | this.node.fs.writeFileSync( 298 | fpath, 299 | JSON.stringify({}), 300 | { 301 | flag: "wx", 302 | }, 303 | (err) => console.log(err) 304 | ); 305 | } 306 | this.root = {}; 307 | 308 | // create a json file with the given name if not exists 309 | fpath = `${this.name}.json`; 310 | if (!this.node.fs.existsSync(fpath)) { 311 | this.node.fs.writeFileSync( 312 | fpath, 313 | JSON.stringify({}), 314 | { 315 | flag: "wx", 316 | }, 317 | (err) => console.log(err) 318 | ); 319 | this.cache = {}; 320 | } else { 321 | this.cache = JSON.parse( 322 | this.node.fs.readFileSync(`${this.name}.json`) 323 | ); 324 | } 325 | } 326 | } 327 | 328 | // store cache 329 | persistCache() { 330 | const data = JSON.stringify(this.cache, null, 2); 331 | if (isQX) $prefs.setValueForKey(data, this.name); 332 | if (isLoon || isSurge) $persistentStore.write(data, this.name); 333 | if (isNode) { 334 | this.node.fs.writeFileSync( 335 | `${this.name}.json`, 336 | data, 337 | { 338 | flag: "w", 339 | }, 340 | (err) => console.log(err) 341 | ); 342 | this.node.fs.writeFileSync( 343 | "root.json", 344 | JSON.stringify(this.root, null, 2), 345 | { 346 | flag: "w", 347 | }, 348 | (err) => console.log(err) 349 | ); 350 | } 351 | } 352 | 353 | write(data, key) { 354 | this.log(`SET ${key}`); 355 | if (key.indexOf("#") !== -1) { 356 | key = key.substr(1); 357 | if (isSurge || isLoon) { 358 | return $persistentStore.write(data, key); 359 | } 360 | if (isQX) { 361 | return $prefs.setValueForKey(data, key); 362 | } 363 | if (isNode) { 364 | this.root[key] = data; 365 | } 366 | } else { 367 | this.cache[key] = data; 368 | } 369 | this.persistCache(); 370 | } 371 | 372 | read(key) { 373 | this.log(`READ ${key}`); 374 | if (key.indexOf("#") !== -1) { 375 | key = key.substr(1); 376 | if (isSurge || isLoon) { 377 | return $persistentStore.read(key); 378 | } 379 | if (isQX) { 380 | return $prefs.valueForKey(key); 381 | } 382 | if (isNode) { 383 | return this.root[key]; 384 | } 385 | } else { 386 | return this.cache[key]; 387 | } 388 | } 389 | 390 | delete(key) { 391 | this.log(`DELETE ${key}`); 392 | if (key.indexOf("#") !== -1) { 393 | key = key.substr(1); 394 | if (isSurge || isLoon) { 395 | return $persistentStore.write(null, key); 396 | } 397 | if (isQX) { 398 | return $prefs.removeValueForKey(key); 399 | } 400 | if (isNode) { 401 | delete this.root[key]; 402 | } 403 | } else { 404 | delete this.cache[key]; 405 | } 406 | this.persistCache(); 407 | } 408 | 409 | // notification 410 | notify(title, subtitle = "", content = "", options = {}) { 411 | const openURL = options["open-url"]; 412 | const mediaURL = options["media-url"]; 413 | 414 | if (isQX) $notify(title, subtitle, content, options); 415 | if (isSurge) { 416 | $notification.post( 417 | title, 418 | subtitle, 419 | content + `${mediaURL ? "\n多媒体:" + mediaURL : ""}`, 420 | { 421 | url: openURL, 422 | } 423 | ); 424 | } 425 | if (isLoon) { 426 | let opts = {}; 427 | if (openURL) opts["openUrl"] = openURL; 428 | if (mediaURL) opts["mediaUrl"] = mediaURL; 429 | if (JSON.stringify(opts) === "{}") { 430 | $notification.post(title, subtitle, content); 431 | } else { 432 | $notification.post(title, subtitle, content, opts); 433 | } 434 | } 435 | if (isNode || isScriptable) { 436 | const content_ = 437 | content + 438 | (openURL ? `\n点击跳转: ${openURL}` : "") + 439 | (mediaURL ? `\n多媒体: ${mediaURL}` : ""); 440 | if (isJSBox) { 441 | const push = require("push"); 442 | push.schedule({ 443 | title: title, 444 | body: (subtitle ? subtitle + "\n" : "") + content_, 445 | }); 446 | } else { 447 | console.log(`${title}\n${subtitle}\n${content_}\n\n`); 448 | } 449 | } 450 | } 451 | 452 | // other helper functions 453 | log(msg) { 454 | if (this.debug) console.log(`[${this.name}] LOG: ${this.stringify(msg)}`); 455 | } 456 | 457 | info(msg) { 458 | console.log(`[${this.name}] INFO: ${this.stringify(msg)}`); 459 | } 460 | 461 | error(msg) { 462 | console.log(`[${this.name}] ERROR: ${this.stringify(msg)}`); 463 | } 464 | 465 | wait(millisec) { 466 | return new Promise((resolve) => setTimeout(resolve, millisec)); 467 | } 468 | 469 | done(value = {}) { 470 | if (isQX || isLoon || isSurge) { 471 | $done(value); 472 | } else if (isNode && !isJSBox) { 473 | if (typeof $context !== "undefined") { 474 | $context.headers = value.headers; 475 | $context.statusCode = value.statusCode; 476 | $context.body = value.body; 477 | } 478 | } 479 | } 480 | 481 | stringify(obj_or_str) { 482 | if (typeof obj_or_str === "string" || obj_or_str instanceof String) 483 | return obj_or_str; 484 | else 485 | try { 486 | return JSON.stringify(obj_or_str, null, 2); 487 | } catch (err) { 488 | return "[object Object]"; 489 | } 490 | } 491 | })(name, debug); 492 | } 493 | -------------------------------------------------------------------------------- /check_in/jiumu/jiumu.js: -------------------------------------------------------------------------------- 1 | /* 2 | 【九木杂物社】@evilbutcher 3 | 4 | 【仓库地址】https://github.com/evilbutcher/QuantumultX/tree/master(欢迎star🌟) 5 | 6 | 【BoxJs】https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/evilbutcher.boxjs.json 7 | 8 | 【致谢】 9 | 感谢Peng-YM的OpenAPI.js! 10 | 11 | ⚠️【免责声明】 12 | ------------------------------------------ 13 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 14 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 15 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 16 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 17 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 18 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 19 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 20 | 21 | 22 | 【使用说明】 23 | 微信小程序-九木杂物社-社员中心-每日签到,手动签到获取Cookie即可使用。 24 | 25 | 【Surge】 26 | ----------------- 27 | [Script] 28 | 九木杂物社获取Cookie = http-request, pattern = https:\/\/wxavip\-up\.ezrpro\.cn\/Vip\/SignIn\/SignIn, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js, requires-body=true 29 | 九木杂物社 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js 30 | 31 | 【Loon】 32 | ----------------- 33 | [Script] 34 | http-request https:\/\/wxavip\-up\.ezrpro\.cn\/Vip\/SignIn\/SignIn tag=九木杂物社获取Cookie, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js, requires-body=true 35 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js, tag=九木杂物社 36 | 37 | 【Quantumult X】 38 | ----------------- 39 | [rewrite_local] 40 | https:\/\/wxavip\-up\.ezrpro\.cn\/Vip\/SignIn\/SignIn url script-request-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js 41 | 42 | [task_local] 43 | 5 0 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js, tag=九木杂物社 44 | 45 | 【All App MitM】 46 | hostname = wxavip-up.ezrpro.cn 47 | 48 | 【Icon】 49 | 透明:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/jiumu_tran.png 50 | 彩色:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/jiumu.png 51 | */ 52 | 53 | const $ = new API("Jiumu", true); 54 | const ERR = MYERR(); 55 | $.time = (new Date().getTime() / 1000).toFixed(0); 56 | $.SignStr = $.read("evil_jiumuSignStr"); 57 | $.Referer = $.read("evil_jiumuReferer"); 58 | $.vip = $.read("evil_jiumuVip"); 59 | $.encrypt = $.read("evil_jiumuEncrypt"); 60 | $.body = $.read("evil_jiumuBody"); 61 | 62 | !(async () => { 63 | if (typeof $request != "undefined") { 64 | getCookie(); 65 | return; 66 | } 67 | if ( 68 | $.SignStr != undefined && 69 | $.Referer != undefined && 70 | $.vip != undefined && 71 | $.encrypt != undefined && 72 | $.body != undefined 73 | ) { 74 | await checkin(); 75 | await checkcoupon(); 76 | showmsg(); 77 | } else { 78 | $.notify("九木杂物社", "", "❌ 请先获取Cookie"); 79 | } 80 | })() 81 | .catch((err) => { 82 | if (err instanceof ERR.ParseError) { 83 | $.notify("九木杂物社", "❌ 解析数据出现错误", err.message); 84 | } else if (err instanceof ERR.EventError) { 85 | $.notify("九木杂物社", "❌ 请尝试重新获取Cookie", err.message); 86 | } else { 87 | $.notify( 88 | "九木杂物社", 89 | "❌ 出现错误", 90 | JSON.stringify(err, Object.getOwnPropertyNames(err)) 91 | ); 92 | } 93 | }) 94 | .finally(() => $.done()); 95 | 96 | function checkin() { 97 | const url = `https://wxavip-up.ezrpro.cn/Vip/SignIn/SignIn`; 98 | const headers = { 99 | Connection: `keep-alive`, 100 | "Accept-Encoding": `gzip, deflate, br`, 101 | "ezr-v-ip": $.vip, 102 | timestamp: $.time, 103 | "Content-Type": `application/json`, 104 | SignStr: $.SignStr, 105 | "ezr-encrypt": $.encrypt, 106 | "User-Agent": `Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.18(0x1700122f) NetType/4G Language/zh_CN`, 107 | Referer: $.Referer, 108 | Host: `wxavip-up.ezrpro.cn`, 109 | "Accept-Language": `zh-cn`, 110 | Accept: `*/*`, 111 | }; 112 | const myRequest = { 113 | url: url, 114 | headers: headers, 115 | body: $.body, 116 | }; 117 | 118 | return $.http.post(myRequest).then((response) => { 119 | if (response.statusCode == 200) { 120 | $.data = JSON.parse(response.body); 121 | console.log(JSON.stringify($.data)); 122 | } else { 123 | $.error(JSON.stringify(response)); 124 | throw new ERR.ParseError("签到数据解析错误,请检查日志"); 125 | } 126 | }); 127 | } 128 | 129 | function checkcoupon() { 130 | const url = `https://wxavip-up.ezrpro.cn/Vip/SignIn/GetSignInDtlInfo`; 131 | const headers = { 132 | Connection: `keep-alive`, 133 | "Accept-Encoding": `gzip, deflate, br`, 134 | "ezr-v-ip": $.vip, 135 | timestamp: $.time, 136 | "Content-Type": `application/json`, 137 | SignStr: $.SignStr, 138 | "ezr-encrypt": $.encrypt, 139 | "User-Agent": `Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.18(0x1700122f) NetType/4G Language/zh_CN`, 140 | Referer: $.Referer, 141 | Host: `wxavip-up.ezrpro.cn`, 142 | "Accept-Language": `zh-cn`, 143 | Accept: `*/*`, 144 | }; 145 | const myRequest = { 146 | url: url, 147 | headers: headers, 148 | }; 149 | 150 | return $.http.get(myRequest).then((response) => { 151 | if (response.statusCode == 200) { 152 | $.datacoupon = JSON.parse(response.body); 153 | console.log(JSON.stringify($.datacoupon)); 154 | } else { 155 | $.error(JSON.stringify(response)); 156 | throw new ERR.ParseError("查询优惠券数据解析错误,请检查日志"); 157 | } 158 | }); 159 | } 160 | 161 | function showmsg() { 162 | if ($.data.Result.ErrMsg == "今日已签到") { 163 | var bonus = []; 164 | var coupon = $.datacoupon.Result.StepGiveInfo; 165 | for (var i = 0; i < coupon.length; i++) { 166 | if (coupon[i].IsFinished == true && coupon[i].IsGive == false) { 167 | bonus.push(coupon[i].StepName); 168 | } 169 | } 170 | if (bonus.length == 0) { 171 | $.notify("九木杂物社", "", `今日已签到🎉`); 172 | } else { 173 | bonus = bonus.join(" "); 174 | $.notify("九木杂物社", "今日已签到", `已获得 ${bonus}🎉\n请尽快领取~`); 175 | } 176 | } else if ($.data.Result.ErrMsg != null) { 177 | throw new ERR.EventError( 178 | `签到错误,请检查日志,原因:${$.data.Result.ErrMsg}` 179 | ); 180 | } else { 181 | var msg = $.data.Msg; 182 | var bonus = []; 183 | var coupon = $.datacoupon.Result.StepGiveInfo; 184 | for (var i = 0; i < coupon.length; i++) { 185 | if (coupon[i].IsFinished == true && coupon[i].IsGive == false) { 186 | bonus.push(coupon[i].StepName); 187 | } 188 | } 189 | if (bonus.length == 0) { 190 | $.notify("九木杂物社", "", msg); 191 | } else { 192 | bonus = bonus.join(" "); 193 | $.notify("九木杂物社", msg, `已获得 ${bonus}🎉\n请尽快领取~`); 194 | } 195 | } 196 | } 197 | 198 | function MYERR() { 199 | class ParseError extends Error { 200 | constructor(message) { 201 | super(message); 202 | this.name = "ParseError"; 203 | } 204 | } 205 | class EventError extends Error { 206 | constructor(message) { 207 | super(message); 208 | this.name = "EventError"; 209 | } 210 | } 211 | return { 212 | ParseError, 213 | EventError, 214 | }; 215 | } 216 | 217 | function getCookie() { 218 | if ( 219 | $request && 220 | $request.method != "OPTIONS" && 221 | $request.url.match(/SignIn/) 222 | ) { 223 | const str = $request.headers["SignStr"]; 224 | $.log(str); 225 | $.write(str, "evil_jiumuSignStr"); 226 | const v_ip = $request.headers["ezr-v-ip"]; 227 | $.log(v_ip); 228 | $.write(v_ip, "evil_jiumuVip"); 229 | const e_ncrypt = $request.headers["ezr-encrypt"]; 230 | $.log(e_ncrypt); 231 | $.write(e_ncrypt, "evil_jiumuEncrypt"); 232 | const referer = $request.headers["Referer"]; 233 | $.log(referer); 234 | $.write(referer, "evil_jiumuReferer"); 235 | const body = $request.body; 236 | $.log(body); 237 | $.write(body, "evil_jiumuBody"); 238 | $.notify("九木杂物社", "", "获取签到Cookie成功🎉"); 239 | } 240 | } 241 | 242 | /** 243 | * OpenAPI 244 | * @author: Peng-YM 245 | * https://github.com/Peng-YM/QuanX/blob/master/Tools/OpenAPI/README.md 246 | */ 247 | function ENV() { 248 | const isQX = typeof $task !== "undefined"; 249 | const isLoon = typeof $loon !== "undefined"; 250 | const isSurge = typeof $httpClient !== "undefined" && !isLoon; 251 | const isJSBox = typeof require == "function" && typeof $jsbox != "undefined"; 252 | const isNode = typeof require == "function" && !isJSBox; 253 | const isRequest = typeof $request !== "undefined"; 254 | const isScriptable = typeof importModule !== "undefined"; 255 | return { 256 | isQX, 257 | isLoon, 258 | isSurge, 259 | isNode, 260 | isJSBox, 261 | isRequest, 262 | isScriptable, 263 | }; 264 | } 265 | 266 | function HTTP( 267 | defaultOptions = { 268 | baseURL: "", 269 | } 270 | ) { 271 | const { isQX, isLoon, isSurge, isScriptable, isNode } = ENV(); 272 | const methods = ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"]; 273 | const URL_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/; 274 | 275 | function send(method, options) { 276 | options = 277 | typeof options === "string" 278 | ? { 279 | url: options, 280 | } 281 | : options; 282 | const baseURL = defaultOptions.baseURL; 283 | if (baseURL && !URL_REGEX.test(options.url || "")) { 284 | options.url = baseURL ? baseURL + options.url : options.url; 285 | } 286 | options = { 287 | ...defaultOptions, 288 | ...options, 289 | }; 290 | const timeout = options.timeout; 291 | const events = { 292 | ...{ 293 | onRequest: () => {}, 294 | onResponse: (resp) => resp, 295 | onTimeout: () => {}, 296 | }, 297 | ...options.events, 298 | }; 299 | 300 | events.onRequest(method, options); 301 | 302 | let worker; 303 | if (isQX) { 304 | worker = $task.fetch({ 305 | method, 306 | ...options, 307 | }); 308 | } else if (isLoon || isSurge || isNode) { 309 | worker = new Promise((resolve, reject) => { 310 | const request = isNode ? require("request") : $httpClient; 311 | request[method.toLowerCase()](options, (err, response, body) => { 312 | if (err) reject(err); 313 | else 314 | resolve({ 315 | statusCode: response.status || response.statusCode, 316 | headers: response.headers, 317 | body, 318 | }); 319 | }); 320 | }); 321 | } else if (isScriptable) { 322 | const request = new Request(options.url); 323 | request.method = method; 324 | request.headers = options.headers; 325 | request.body = options.body; 326 | worker = new Promise((resolve, reject) => { 327 | request 328 | .loadString() 329 | .then((body) => { 330 | resolve({ 331 | statusCode: request.response.statusCode, 332 | headers: request.response.headers, 333 | body, 334 | }); 335 | }) 336 | .catch((err) => reject(err)); 337 | }); 338 | } 339 | 340 | let timeoutid; 341 | const timer = timeout 342 | ? new Promise((_, reject) => { 343 | timeoutid = setTimeout(() => { 344 | events.onTimeout(); 345 | return reject( 346 | `${method} URL: ${options.url} exceeds the timeout ${timeout} ms` 347 | ); 348 | }, timeout); 349 | }) 350 | : null; 351 | 352 | return (timer 353 | ? Promise.race([timer, worker]).then((res) => { 354 | clearTimeout(timeoutid); 355 | return res; 356 | }) 357 | : worker 358 | ).then((resp) => events.onResponse(resp)); 359 | } 360 | 361 | const http = {}; 362 | methods.forEach( 363 | (method) => 364 | (http[method.toLowerCase()] = (options) => send(method, options)) 365 | ); 366 | return http; 367 | } 368 | 369 | function API(name = "untitled", debug = false) { 370 | const { isQX, isLoon, isSurge, isNode, isJSBox, isScriptable } = ENV(); 371 | return new (class { 372 | constructor(name, debug) { 373 | this.name = name; 374 | this.debug = debug; 375 | 376 | this.http = HTTP(); 377 | this.env = ENV(); 378 | 379 | this.node = (() => { 380 | if (isNode) { 381 | const fs = require("fs"); 382 | 383 | return { 384 | fs, 385 | }; 386 | } else { 387 | return null; 388 | } 389 | })(); 390 | this.initCache(); 391 | 392 | const delay = (t, v) => 393 | new Promise(function (resolve) { 394 | setTimeout(resolve.bind(null, v), t); 395 | }); 396 | 397 | Promise.prototype.delay = function (t) { 398 | return this.then(function (v) { 399 | return delay(t, v); 400 | }); 401 | }; 402 | } 403 | 404 | // persistence 405 | // initialize cache 406 | initCache() { 407 | if (isQX) this.cache = JSON.parse($prefs.valueForKey(this.name) || "{}"); 408 | if (isLoon || isSurge) 409 | this.cache = JSON.parse($persistentStore.read(this.name) || "{}"); 410 | 411 | if (isNode) { 412 | // create a json for root cache 413 | let fpath = "root.json"; 414 | if (!this.node.fs.existsSync(fpath)) { 415 | this.node.fs.writeFileSync( 416 | fpath, 417 | JSON.stringify({}), 418 | { 419 | flag: "wx", 420 | }, 421 | (err) => console.log(err) 422 | ); 423 | } 424 | this.root = {}; 425 | 426 | // create a json file with the given name if not exists 427 | fpath = `${this.name}.json`; 428 | if (!this.node.fs.existsSync(fpath)) { 429 | this.node.fs.writeFileSync( 430 | fpath, 431 | JSON.stringify({}), 432 | { 433 | flag: "wx", 434 | }, 435 | (err) => console.log(err) 436 | ); 437 | this.cache = {}; 438 | } else { 439 | this.cache = JSON.parse( 440 | this.node.fs.readFileSync(`${this.name}.json`) 441 | ); 442 | } 443 | } 444 | } 445 | 446 | // store cache 447 | persistCache() { 448 | const data = JSON.stringify(this.cache, null, 2); 449 | if (isQX) $prefs.setValueForKey(data, this.name); 450 | if (isLoon || isSurge) $persistentStore.write(data, this.name); 451 | if (isNode) { 452 | this.node.fs.writeFileSync( 453 | `${this.name}.json`, 454 | data, 455 | { 456 | flag: "w", 457 | }, 458 | (err) => console.log(err) 459 | ); 460 | this.node.fs.writeFileSync( 461 | "root.json", 462 | JSON.stringify(this.root, null, 2), 463 | { 464 | flag: "w", 465 | }, 466 | (err) => console.log(err) 467 | ); 468 | } 469 | } 470 | 471 | write(data, key) { 472 | this.log(`SET ${key}`); 473 | if (key.indexOf("#") !== -1) { 474 | key = key.substr(1); 475 | if (isSurge || isLoon) { 476 | return $persistentStore.write(data, key); 477 | } 478 | if (isQX) { 479 | return $prefs.setValueForKey(data, key); 480 | } 481 | if (isNode) { 482 | this.root[key] = data; 483 | } 484 | } else { 485 | this.cache[key] = data; 486 | } 487 | this.persistCache(); 488 | } 489 | 490 | read(key) { 491 | this.log(`READ ${key}`); 492 | if (key.indexOf("#") !== -1) { 493 | key = key.substr(1); 494 | if (isSurge || isLoon) { 495 | return $persistentStore.read(key); 496 | } 497 | if (isQX) { 498 | return $prefs.valueForKey(key); 499 | } 500 | if (isNode) { 501 | return this.root[key]; 502 | } 503 | } else { 504 | return this.cache[key]; 505 | } 506 | } 507 | 508 | delete(key) { 509 | this.log(`DELETE ${key}`); 510 | if (key.indexOf("#") !== -1) { 511 | key = key.substr(1); 512 | if (isSurge || isLoon) { 513 | return $persistentStore.write(null, key); 514 | } 515 | if (isQX) { 516 | return $prefs.removeValueForKey(key); 517 | } 518 | if (isNode) { 519 | delete this.root[key]; 520 | } 521 | } else { 522 | delete this.cache[key]; 523 | } 524 | this.persistCache(); 525 | } 526 | 527 | // notification 528 | notify(title, subtitle = "", content = "", options = {}) { 529 | const openURL = options["open-url"]; 530 | const mediaURL = options["media-url"]; 531 | 532 | if (isQX) $notify(title, subtitle, content, options); 533 | if (isSurge) { 534 | $notification.post( 535 | title, 536 | subtitle, 537 | content + `${mediaURL ? "\n多媒体:" + mediaURL : ""}`, 538 | { 539 | url: openURL, 540 | } 541 | ); 542 | } 543 | if (isLoon) { 544 | let opts = {}; 545 | if (openURL) opts["openUrl"] = openURL; 546 | if (mediaURL) opts["mediaUrl"] = mediaURL; 547 | if (JSON.stringify(opts) === "{}") { 548 | $notification.post(title, subtitle, content); 549 | } else { 550 | $notification.post(title, subtitle, content, opts); 551 | } 552 | } 553 | if (isNode || isScriptable) { 554 | const content_ = 555 | content + 556 | (openURL ? `\n点击跳转: ${openURL}` : "") + 557 | (mediaURL ? `\n多媒体: ${mediaURL}` : ""); 558 | if (isJSBox) { 559 | const push = require("push"); 560 | push.schedule({ 561 | title: title, 562 | body: (subtitle ? subtitle + "\n" : "") + content_, 563 | }); 564 | } else { 565 | console.log(`${title}\n${subtitle}\n${content_}\n\n`); 566 | } 567 | } 568 | } 569 | 570 | // other helper functions 571 | log(msg) { 572 | if (this.debug) console.log(`[${this.name}] LOG: ${this.stringify(msg)}`); 573 | } 574 | 575 | info(msg) { 576 | console.log(`[${this.name}] INFO: ${this.stringify(msg)}`); 577 | } 578 | 579 | error(msg) { 580 | console.log(`[${this.name}] ERROR: ${this.stringify(msg)}`); 581 | } 582 | 583 | wait(millisec) { 584 | return new Promise((resolve) => setTimeout(resolve, millisec)); 585 | } 586 | 587 | done(value = {}) { 588 | if (isQX || isLoon || isSurge) { 589 | $done(value); 590 | } else if (isNode && !isJSBox) { 591 | if (typeof $context !== "undefined") { 592 | $context.headers = value.headers; 593 | $context.statusCode = value.statusCode; 594 | $context.body = value.body; 595 | } 596 | } 597 | } 598 | 599 | stringify(obj_or_str) { 600 | if (typeof obj_or_str === "string" || obj_or_str instanceof String) 601 | return obj_or_str; 602 | else 603 | try { 604 | return JSON.stringify(obj_or_str, null, 2); 605 | } catch (err) { 606 | return "[object Object]"; 607 | } 608 | } 609 | })(name, debug); 610 | } 611 | -------------------------------------------------------------------------------- /check_in/klcw/klcw-app.js: -------------------------------------------------------------------------------- 1 | /* 2 | 【酷乐潮玩App】@evilbutcher 3 | 4 | 【仓库地址】https://github.com/evilbutcher/QuantumultX/tree/master(欢迎star🌟) 5 | 6 | 【BoxJs】https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/evilbutcher.boxjs.json 7 | 8 | 【致谢】 9 | 感谢Peng-YM的OpenAPI.js! 10 | 11 | ⚠️【免责声明】 12 | ------------------------------------------ 13 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 14 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 15 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 16 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 17 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 18 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 19 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 20 | 21 | 22 | 【使用说明】 23 | 酷乐潮玩App-我的-任务中心,手动签到获取Cookie即可使用。 24 | 25 | 【Surge】 26 | ----------------- 27 | [Script] 28 | 酷乐潮玩App获取Cookie = http-request, pattern = https:\/\/app\.klcw\.net\.cn\/omp\_cmanage\/mallgateway, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js, requires-body=true 29 | 酷乐潮玩App = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js 30 | 31 | 【Loon】 32 | ----------------- 33 | [Script] 34 | http-request https:\/\/app\.klcw\.net\.cn\/omp\_cmanage\/mallgateway tag=酷乐潮玩App获取Cookie, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js, requires-body=true 35 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js, tag=酷乐潮玩App 36 | 37 | 【Quantumult X】 38 | ----------------- 39 | [rewrite_local] 40 | https:\/\/app\.klcw\.net\.cn\/omp\_cmanage\/mallgateway url script-request-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js 41 | 42 | [task_local] 43 | 5 0 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js, tag=酷乐潮玩App 44 | 45 | 【All App MitM】 46 | hostname = app.klcw.net.cn 47 | 48 | 【Icon】 49 | 透明:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/klcw_tran.png 50 | 彩色:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/klcw.png 51 | */ 52 | 53 | const $ = new API("klcwapp", true); 54 | const ERR = MYERR(); 55 | var date = new Date(); 56 | var year = date.getFullYear(); 57 | var month = date.getMonth() + 1; 58 | if (month < 10) month = "0" + month; 59 | var day = date.getDate(); 60 | if (day < 10) day = "0" + day; 61 | var hour = date.getHours(); 62 | if (hour < 10) hour = "0" + hour; 63 | var minus = date.getMinutes(); 64 | if (minus < 10) minus = "0" + minus; 65 | var second = date.getSeconds(); 66 | if (second < 10) second = "0" + second; 67 | $.time = year + month + day + hour + minus + second; 68 | $.body = $.read("evil_klcwappBody"); 69 | $.nowbody = JSON.stringify($.body) 70 | .replace(/×tamp=\d+/, `×tamp=${$.time}`) 71 | .replace(/&method\=.*?\&/, `&method=com.xdl.cn.appservice.AppTaskService.signIn&`) 72 | .slice(1, -1); 73 | $.log($.nowbody); 74 | 75 | !(async () => { 76 | if (typeof $request != "undefined") { 77 | getCookie(); 78 | return; 79 | } 80 | if ($.body != undefined) { 81 | await checkin(); 82 | showmsg(); 83 | } else { 84 | $.notify("酷乐潮玩App", "", "❌ 请先获取Cookie"); 85 | } 86 | })() 87 | .catch((err) => { 88 | if (err instanceof ERR.ParseError) { 89 | $.notify("酷乐潮玩App", "❌ 解析数据出现错误", err.message); 90 | } else { 91 | $.notify( 92 | "酷乐潮玩App", 93 | "❌ 出现错误", 94 | JSON.stringify(err, Object.getOwnPropertyNames(err)) 95 | ); 96 | } 97 | }) 98 | .finally(() => $.done()); 99 | 100 | function checkin() { 101 | const url = `https://app.klcw.net.cn/omp_cmanage/mallgateway`; 102 | const headers = { 103 | chnflg: `ios`, 104 | Accept: `*/*`, 105 | Connection: `keep-alive`, 106 | "Content-Type": `application/x-www-form-urlencoded`, 107 | "Accept-Encoding": `gzip, deflate, br`, 108 | Host: `app.klcw.net.cn`, 109 | "User-Agent": `KLMemberMobileApp/2.8.1 (iPhone; iOS 14.4; Scale/2.00)`, 110 | version: `2.8.1`, 111 | "Accept-Language": `zh-Hans-CN;q=1, en-CN;q=0.9`, 112 | }; 113 | const myRequest = { 114 | url: url, 115 | headers: headers, 116 | body: $.nowbody, 117 | }; 118 | 119 | return $.http.post(myRequest).then((response) => { 120 | if (response.statusCode == 200) { 121 | $.data = JSON.parse(response.body); 122 | $.log(JSON.stringify($.data)); 123 | } else { 124 | $.error(JSON.stringify(response)); 125 | $.notify("酷乐潮玩App", "", "❌ 未知错误,请查看日志"); 126 | } 127 | }); 128 | } 129 | 130 | function showmsg() { 131 | if ($.data.code == 0) { 132 | var continuousDays = $.data.data.continuousDays; 133 | var totalDays = $.data.data.totalDays; 134 | var continuousAward = $.data.data.continuousAward; 135 | $.notify( 136 | "酷乐潮玩App", 137 | "签到成功🎉", 138 | `本次签到获得${continuousAward}积分!\n当前签到已连续${continuousDays}天,总计${totalDays}天!` 139 | ); 140 | } else if ($.data.code == 10000001) { 141 | var msg = $.data.message; 142 | $.notify("酷乐潮玩App", "", msg); 143 | } 144 | } 145 | 146 | function MYERR() { 147 | class ParseError extends Error { 148 | constructor(message) { 149 | super(message); 150 | this.name = "ParseError"; 151 | } 152 | } 153 | return { 154 | ParseError, 155 | }; 156 | } 157 | 158 | function getCookie() { 159 | if ( 160 | $request && 161 | $request.method != "OPTIONS" && 162 | $request.url.match(/mallgateway/) && 163 | $request.body.match(/signIn/) 164 | ) { 165 | const body = $request.body; 166 | $.log(body); 167 | $.write(body, "evil_klcwappBody"); 168 | $.notify("酷乐潮玩App", "", "获取签到Cookie成功🎉"); 169 | } 170 | } 171 | 172 | /** 173 | * OpenAPI 174 | * @author: Peng-YM 175 | * https://github.com/Peng-YM/QuanX/blob/master/Tools/OpenAPI/README.md 176 | */ 177 | function ENV() { 178 | const isQX = typeof $task !== "undefined"; 179 | const isLoon = typeof $loon !== "undefined"; 180 | const isSurge = typeof $httpClient !== "undefined" && !isLoon; 181 | const isJSBox = typeof require == "function" && typeof $jsbox != "undefined"; 182 | const isNode = typeof require == "function" && !isJSBox; 183 | const isRequest = typeof $request !== "undefined"; 184 | const isScriptable = typeof importModule !== "undefined"; 185 | return { 186 | isQX, 187 | isLoon, 188 | isSurge, 189 | isNode, 190 | isJSBox, 191 | isRequest, 192 | isScriptable, 193 | }; 194 | } 195 | 196 | function HTTP( 197 | defaultOptions = { 198 | baseURL: "", 199 | } 200 | ) { 201 | const { isQX, isLoon, isSurge, isScriptable, isNode } = ENV(); 202 | const methods = ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"]; 203 | const URL_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/; 204 | 205 | function send(method, options) { 206 | options = 207 | typeof options === "string" 208 | ? { 209 | url: options, 210 | } 211 | : options; 212 | const baseURL = defaultOptions.baseURL; 213 | if (baseURL && !URL_REGEX.test(options.url || "")) { 214 | options.url = baseURL ? baseURL + options.url : options.url; 215 | } 216 | options = { 217 | ...defaultOptions, 218 | ...options, 219 | }; 220 | const timeout = options.timeout; 221 | const events = { 222 | ...{ 223 | onRequest: () => {}, 224 | onResponse: (resp) => resp, 225 | onTimeout: () => {}, 226 | }, 227 | ...options.events, 228 | }; 229 | 230 | events.onRequest(method, options); 231 | 232 | let worker; 233 | if (isQX) { 234 | worker = $task.fetch({ 235 | method, 236 | ...options, 237 | }); 238 | } else if (isLoon || isSurge || isNode) { 239 | worker = new Promise((resolve, reject) => { 240 | const request = isNode ? require("request") : $httpClient; 241 | request[method.toLowerCase()](options, (err, response, body) => { 242 | if (err) reject(err); 243 | else 244 | resolve({ 245 | statusCode: response.status || response.statusCode, 246 | headers: response.headers, 247 | body, 248 | }); 249 | }); 250 | }); 251 | } else if (isScriptable) { 252 | const request = new Request(options.url); 253 | request.method = method; 254 | request.headers = options.headers; 255 | request.body = options.body; 256 | worker = new Promise((resolve, reject) => { 257 | request 258 | .loadString() 259 | .then((body) => { 260 | resolve({ 261 | statusCode: request.response.statusCode, 262 | headers: request.response.headers, 263 | body, 264 | }); 265 | }) 266 | .catch((err) => reject(err)); 267 | }); 268 | } 269 | 270 | let timeoutid; 271 | const timer = timeout 272 | ? new Promise((_, reject) => { 273 | timeoutid = setTimeout(() => { 274 | events.onTimeout(); 275 | return reject( 276 | `${method} URL: ${options.url} exceeds the timeout ${timeout} ms` 277 | ); 278 | }, timeout); 279 | }) 280 | : null; 281 | 282 | return (timer 283 | ? Promise.race([timer, worker]).then((res) => { 284 | clearTimeout(timeoutid); 285 | return res; 286 | }) 287 | : worker 288 | ).then((resp) => events.onResponse(resp)); 289 | } 290 | 291 | const http = {}; 292 | methods.forEach( 293 | (method) => 294 | (http[method.toLowerCase()] = (options) => send(method, options)) 295 | ); 296 | return http; 297 | } 298 | 299 | function API(name = "untitled", debug = false) { 300 | const { isQX, isLoon, isSurge, isNode, isJSBox, isScriptable } = ENV(); 301 | return new (class { 302 | constructor(name, debug) { 303 | this.name = name; 304 | this.debug = debug; 305 | 306 | this.http = HTTP(); 307 | this.env = ENV(); 308 | 309 | this.node = (() => { 310 | if (isNode) { 311 | const fs = require("fs"); 312 | 313 | return { 314 | fs, 315 | }; 316 | } else { 317 | return null; 318 | } 319 | })(); 320 | this.initCache(); 321 | 322 | const delay = (t, v) => 323 | new Promise(function (resolve) { 324 | setTimeout(resolve.bind(null, v), t); 325 | }); 326 | 327 | Promise.prototype.delay = function (t) { 328 | return this.then(function (v) { 329 | return delay(t, v); 330 | }); 331 | }; 332 | } 333 | 334 | // persistence 335 | // initialize cache 336 | initCache() { 337 | if (isQX) this.cache = JSON.parse($prefs.valueForKey(this.name) || "{}"); 338 | if (isLoon || isSurge) 339 | this.cache = JSON.parse($persistentStore.read(this.name) || "{}"); 340 | 341 | if (isNode) { 342 | // create a json for root cache 343 | let fpath = "root.json"; 344 | if (!this.node.fs.existsSync(fpath)) { 345 | this.node.fs.writeFileSync( 346 | fpath, 347 | JSON.stringify({}), 348 | { 349 | flag: "wx", 350 | }, 351 | (err) => console.log(err) 352 | ); 353 | } 354 | this.root = {}; 355 | 356 | // create a json file with the given name if not exists 357 | fpath = `${this.name}.json`; 358 | if (!this.node.fs.existsSync(fpath)) { 359 | this.node.fs.writeFileSync( 360 | fpath, 361 | JSON.stringify({}), 362 | { 363 | flag: "wx", 364 | }, 365 | (err) => console.log(err) 366 | ); 367 | this.cache = {}; 368 | } else { 369 | this.cache = JSON.parse( 370 | this.node.fs.readFileSync(`${this.name}.json`) 371 | ); 372 | } 373 | } 374 | } 375 | 376 | // store cache 377 | persistCache() { 378 | const data = JSON.stringify(this.cache, null, 2); 379 | if (isQX) $prefs.setValueForKey(data, this.name); 380 | if (isLoon || isSurge) $persistentStore.write(data, this.name); 381 | if (isNode) { 382 | this.node.fs.writeFileSync( 383 | `${this.name}.json`, 384 | data, 385 | { 386 | flag: "w", 387 | }, 388 | (err) => console.log(err) 389 | ); 390 | this.node.fs.writeFileSync( 391 | "root.json", 392 | JSON.stringify(this.root, null, 2), 393 | { 394 | flag: "w", 395 | }, 396 | (err) => console.log(err) 397 | ); 398 | } 399 | } 400 | 401 | write(data, key) { 402 | this.log(`SET ${key}`); 403 | if (key.indexOf("#") !== -1) { 404 | key = key.substr(1); 405 | if (isSurge || isLoon) { 406 | return $persistentStore.write(data, key); 407 | } 408 | if (isQX) { 409 | return $prefs.setValueForKey(data, key); 410 | } 411 | if (isNode) { 412 | this.root[key] = data; 413 | } 414 | } else { 415 | this.cache[key] = data; 416 | } 417 | this.persistCache(); 418 | } 419 | 420 | read(key) { 421 | this.log(`READ ${key}`); 422 | if (key.indexOf("#") !== -1) { 423 | key = key.substr(1); 424 | if (isSurge || isLoon) { 425 | return $persistentStore.read(key); 426 | } 427 | if (isQX) { 428 | return $prefs.valueForKey(key); 429 | } 430 | if (isNode) { 431 | return this.root[key]; 432 | } 433 | } else { 434 | return this.cache[key]; 435 | } 436 | } 437 | 438 | delete(key) { 439 | this.log(`DELETE ${key}`); 440 | if (key.indexOf("#") !== -1) { 441 | key = key.substr(1); 442 | if (isSurge || isLoon) { 443 | return $persistentStore.write(null, key); 444 | } 445 | if (isQX) { 446 | return $prefs.removeValueForKey(key); 447 | } 448 | if (isNode) { 449 | delete this.root[key]; 450 | } 451 | } else { 452 | delete this.cache[key]; 453 | } 454 | this.persistCache(); 455 | } 456 | 457 | // notification 458 | notify(title, subtitle = "", content = "", options = {}) { 459 | const openURL = options["open-url"]; 460 | const mediaURL = options["media-url"]; 461 | 462 | if (isQX) $notify(title, subtitle, content, options); 463 | if (isSurge) { 464 | $notification.post( 465 | title, 466 | subtitle, 467 | content + `${mediaURL ? "\n多媒体:" + mediaURL : ""}`, 468 | { 469 | url: openURL, 470 | } 471 | ); 472 | } 473 | if (isLoon) { 474 | let opts = {}; 475 | if (openURL) opts["openUrl"] = openURL; 476 | if (mediaURL) opts["mediaUrl"] = mediaURL; 477 | if (JSON.stringify(opts) === "{}") { 478 | $notification.post(title, subtitle, content); 479 | } else { 480 | $notification.post(title, subtitle, content, opts); 481 | } 482 | } 483 | if (isNode || isScriptable) { 484 | const content_ = 485 | content + 486 | (openURL ? `\n点击跳转: ${openURL}` : "") + 487 | (mediaURL ? `\n多媒体: ${mediaURL}` : ""); 488 | if (isJSBox) { 489 | const push = require("push"); 490 | push.schedule({ 491 | title: title, 492 | body: (subtitle ? subtitle + "\n" : "") + content_, 493 | }); 494 | } else { 495 | console.log(`${title}\n${subtitle}\n${content_}\n\n`); 496 | } 497 | } 498 | } 499 | 500 | // other helper functions 501 | log(msg) { 502 | if (this.debug) console.log(`[${this.name}] LOG: ${this.stringify(msg)}`); 503 | } 504 | 505 | info(msg) { 506 | console.log(`[${this.name}] INFO: ${this.stringify(msg)}`); 507 | } 508 | 509 | error(msg) { 510 | console.log(`[${this.name}] ERROR: ${this.stringify(msg)}`); 511 | } 512 | 513 | wait(millisec) { 514 | return new Promise((resolve) => setTimeout(resolve, millisec)); 515 | } 516 | 517 | done(value = {}) { 518 | if (isQX || isLoon || isSurge) { 519 | $done(value); 520 | } else if (isNode && !isJSBox) { 521 | if (typeof $context !== "undefined") { 522 | $context.headers = value.headers; 523 | $context.statusCode = value.statusCode; 524 | $context.body = value.body; 525 | } 526 | } 527 | } 528 | 529 | stringify(obj_or_str) { 530 | if (typeof obj_or_str === "string" || obj_or_str instanceof String) 531 | return obj_or_str; 532 | else 533 | try { 534 | return JSON.stringify(obj_or_str, null, 2); 535 | } catch (err) { 536 | return "[object Object]"; 537 | } 538 | } 539 | })(name, debug); 540 | } 541 | -------------------------------------------------------------------------------- /check_in/nasa/nasapic.js: -------------------------------------------------------------------------------- 1 | /* 2 | 【NASA每日一图】@evilbutcher 3 | 4 | 【仓库地址】https://github.com/evilbutcher/QuantumultX/tree/master(欢迎star🌟) 5 | 6 | 【BoxJs】https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/evilbutcher.boxjs.json 7 | 8 | 【致谢】 9 | 感谢Peng-YM的OpenAPI.js! 10 | 11 | ⚠️【免责声明】 12 | ------------------------------------------ 13 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 14 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 15 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 16 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 17 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 18 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 19 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 20 | 21 | 【配置使用】 22 | 1. 首先前往https://api.nasa.gov/ 申请一个 API,秒通过。 23 | 2. 将申请好的 API 填入 BoxJs即可。 24 | 25 | 【Surge】 26 | ----------------- 27 | [Script] 28 | NASA每日一图 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/nasa/nasapic.js 29 | 30 | 【Loon】 31 | ----------------- 32 | [Script] 33 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/nasa/nasapic.js, tag=NASA每日一图 34 | 35 | 【Quantumult X】 36 | ----------------- 37 | [task_local] 38 | 5 0 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/nasa/nasapic.js, tag=NASA每日一图 39 | 40 | 【Icon】 41 | 透明:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/nasa_tran.png 42 | 彩色:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/nasa.png 43 | */ 44 | 45 | const $ = new API("NASA"); 46 | const ERR = MYERR(); 47 | const translate = [true, "true"].includes($.read("translate")) || false; 48 | 49 | !(async () => { 50 | if (!$.read("nasaapi")) { 51 | throw new ERR.TokenError("❌ 未获取或填写NASA API"); 52 | } else { 53 | await getpic(); 54 | if (translate == true) await translatetitle(); 55 | if (translate == true) await translateexp(); 56 | showmsg(); 57 | } 58 | })() 59 | .catch((err) => { 60 | if (err instanceof ERR.TokenError) { 61 | $.notify("NASA - API 错误", "", err.message, { 62 | "open-url": "https://api.nasa.gov/", 63 | }); 64 | } else if (err instanceof ERR.TimeError) { 65 | $.notify("NASA - 暂无图片", "", err.message); 66 | } else { 67 | $.notify( 68 | "NASA", 69 | "❌ 出现错误", 70 | JSON.stringify(err, Object.getOwnPropertyNames(err)) 71 | ); 72 | } 73 | }) 74 | .finally(() => $.done()); 75 | 76 | function getpic() { 77 | const url = `https://api.nasa.gov/planetary/apod?api_key=${$.read( 78 | "nasaapi" 79 | )}`; 80 | return $.http.get(url).then((response) => { 81 | $.log(response); 82 | if (response.statusCode == 200) { 83 | var obj = JSON.parse(response.body); 84 | $.data = obj; 85 | $.info(response.body); 86 | } else if (response.statusCode == 404) { 87 | throw new ERR.TimeError( 88 | "❌ 暂无图片,内容在更新,请稍等呦~\n北京时间8:00-13:00为NASA更新时间段。" 89 | ); 90 | //$.notify("NASA", "", "暂无图片更新,晚点再来看看吧~"); 91 | } else { 92 | $.error(JSON.stringify(response)); 93 | $.notify("NASA", "", "❌ 未知错误,请查看日志"); 94 | } 95 | }); 96 | } 97 | 98 | async function translateexp() { 99 | var wtext = encodeURI($.data.explanation) || "无"; 100 | const tranexp = { 101 | url: `http://translate.google.com/translate_a/single?client=gtx&dt=t&dj=1&ie=UTF-8&sl=auto&tl=zh_cn&q=${wtext}`, 102 | }; 103 | return $.http.get(tranexp).then((response) => { 104 | $.transexp = JSON.parse(response.body).sentences; 105 | $.log($.transexp); 106 | }); 107 | } 108 | 109 | async function translatetitle() { 110 | var wtitle = encodeURI($.data.title) || "无"; 111 | const trantitle = { 112 | url: `http://translate.google.com/translate_a/single?client=gtx&dt=t&dj=1&ie=UTF-8&sl=auto&tl=zh_cn&q=${wtitle}`, 113 | }; 114 | return $.http.get(trantitle).then((response) => { 115 | $.transtitle = JSON.parse(response.body).sentences; 116 | $.log($.transtitle); 117 | }); 118 | } 119 | 120 | function showmsg() { 121 | var exp = ""; 122 | if (translate == true) { 123 | for (var i = 0; i < $.transexp.length; i++) { 124 | exp += $.transexp[i].trans; 125 | } 126 | var title = $.transtitle[0].trans; 127 | var time = $.data.date || "无"; 128 | var copyright = $.data.copyright || "无"; 129 | var detail = `©️版权:${copyright}\n⌚️时间:${time}\n${exp}`; 130 | } else { 131 | exp = $.data.explanation || "None"; 132 | title = $.data.title || "None"; 133 | time = $.data.date || "None"; 134 | copyright = $.data.copyright || "None"; 135 | detail = `©️Copyright:${copyright}\n⌚️Date:${time}\n${exp}`; 136 | } 137 | var cover = $.data.url; 138 | $.notify("NASA", title, detail, { "media-url": cover, "open-url": cover }); 139 | } 140 | 141 | function MYERR() { 142 | class TokenError extends Error { 143 | constructor(message) { 144 | super(message); 145 | this.name = "TokenError"; 146 | } 147 | } 148 | class TimeError extends Error { 149 | constructor(message) { 150 | super(message); 151 | this.name = "TimeError"; 152 | } 153 | } 154 | return { 155 | TokenError, 156 | TimeError, 157 | }; 158 | } 159 | 160 | /** 161 | * OpenAPI 162 | * @author: Peng-YM 163 | * https://github.com/Peng-YM/QuanX/blob/master/Tools/OpenAPI/README.md 164 | */ 165 | function ENV() { 166 | const isQX = typeof $task !== "undefined"; 167 | const isLoon = typeof $loon !== "undefined"; 168 | const isSurge = typeof $httpClient !== "undefined" && !isLoon; 169 | const isJSBox = typeof require == "function" && typeof $jsbox != "undefined"; 170 | const isNode = typeof require == "function" && !isJSBox; 171 | const isRequest = typeof $request !== "undefined"; 172 | const isScriptable = typeof importModule !== "undefined"; 173 | return { 174 | isQX, 175 | isLoon, 176 | isSurge, 177 | isNode, 178 | isJSBox, 179 | isRequest, 180 | isScriptable, 181 | }; 182 | } 183 | 184 | function HTTP( 185 | defaultOptions = { 186 | baseURL: "", 187 | } 188 | ) { 189 | const { isQX, isLoon, isSurge, isScriptable, isNode } = ENV(); 190 | const methods = ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"]; 191 | const URL_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/; 192 | 193 | function send(method, options) { 194 | options = 195 | typeof options === "string" 196 | ? { 197 | url: options, 198 | } 199 | : options; 200 | const baseURL = defaultOptions.baseURL; 201 | if (baseURL && !URL_REGEX.test(options.url || "")) { 202 | options.url = baseURL ? baseURL + options.url : options.url; 203 | } 204 | options = { 205 | ...defaultOptions, 206 | ...options, 207 | }; 208 | const timeout = options.timeout; 209 | const events = { 210 | ...{ 211 | onRequest: () => {}, 212 | onResponse: (resp) => resp, 213 | onTimeout: () => {}, 214 | }, 215 | ...options.events, 216 | }; 217 | 218 | events.onRequest(method, options); 219 | 220 | let worker; 221 | if (isQX) { 222 | worker = $task.fetch({ 223 | method, 224 | ...options, 225 | }); 226 | } else if (isLoon || isSurge || isNode) { 227 | worker = new Promise((resolve, reject) => { 228 | const request = isNode ? require("request") : $httpClient; 229 | request[method.toLowerCase()](options, (err, response, body) => { 230 | if (err) reject(err); 231 | else 232 | resolve({ 233 | statusCode: response.status || response.statusCode, 234 | headers: response.headers, 235 | body, 236 | }); 237 | }); 238 | }); 239 | } else if (isScriptable) { 240 | const request = new Request(options.url); 241 | request.method = method; 242 | request.headers = options.headers; 243 | request.body = options.body; 244 | worker = new Promise((resolve, reject) => { 245 | request 246 | .loadString() 247 | .then((body) => { 248 | resolve({ 249 | statusCode: request.response.statusCode, 250 | headers: request.response.headers, 251 | body, 252 | }); 253 | }) 254 | .catch((err) => reject(err)); 255 | }); 256 | } 257 | 258 | let timeoutid; 259 | const timer = timeout 260 | ? new Promise((_, reject) => { 261 | timeoutid = setTimeout(() => { 262 | events.onTimeout(); 263 | return reject( 264 | `${method} URL: ${options.url} exceeds the timeout ${timeout} ms` 265 | ); 266 | }, timeout); 267 | }) 268 | : null; 269 | 270 | return (timer 271 | ? Promise.race([timer, worker]).then((res) => { 272 | clearTimeout(timeoutid); 273 | return res; 274 | }) 275 | : worker 276 | ).then((resp) => events.onResponse(resp)); 277 | } 278 | 279 | const http = {}; 280 | methods.forEach( 281 | (method) => 282 | (http[method.toLowerCase()] = (options) => send(method, options)) 283 | ); 284 | return http; 285 | } 286 | 287 | function API(name = "untitled", debug = false) { 288 | const { isQX, isLoon, isSurge, isNode, isJSBox, isScriptable } = ENV(); 289 | return new (class { 290 | constructor(name, debug) { 291 | this.name = name; 292 | this.debug = debug; 293 | 294 | this.http = HTTP(); 295 | this.env = ENV(); 296 | 297 | this.node = (() => { 298 | if (isNode) { 299 | const fs = require("fs"); 300 | 301 | return { 302 | fs, 303 | }; 304 | } else { 305 | return null; 306 | } 307 | })(); 308 | this.initCache(); 309 | 310 | const delay = (t, v) => 311 | new Promise(function (resolve) { 312 | setTimeout(resolve.bind(null, v), t); 313 | }); 314 | 315 | Promise.prototype.delay = function (t) { 316 | return this.then(function (v) { 317 | return delay(t, v); 318 | }); 319 | }; 320 | } 321 | 322 | // persistence 323 | // initialize cache 324 | initCache() { 325 | if (isQX) this.cache = JSON.parse($prefs.valueForKey(this.name) || "{}"); 326 | if (isLoon || isSurge) 327 | this.cache = JSON.parse($persistentStore.read(this.name) || "{}"); 328 | 329 | if (isNode) { 330 | // create a json for root cache 331 | let fpath = "root.json"; 332 | if (!this.node.fs.existsSync(fpath)) { 333 | this.node.fs.writeFileSync( 334 | fpath, 335 | JSON.stringify({}), 336 | { 337 | flag: "wx", 338 | }, 339 | (err) => console.log(err) 340 | ); 341 | } 342 | this.root = {}; 343 | 344 | // create a json file with the given name if not exists 345 | fpath = `${this.name}.json`; 346 | if (!this.node.fs.existsSync(fpath)) { 347 | this.node.fs.writeFileSync( 348 | fpath, 349 | JSON.stringify({}), 350 | { 351 | flag: "wx", 352 | }, 353 | (err) => console.log(err) 354 | ); 355 | this.cache = {}; 356 | } else { 357 | this.cache = JSON.parse( 358 | this.node.fs.readFileSync(`${this.name}.json`) 359 | ); 360 | } 361 | } 362 | } 363 | 364 | // store cache 365 | persistCache() { 366 | const data = JSON.stringify(this.cache, null, 2); 367 | if (isQX) $prefs.setValueForKey(data, this.name); 368 | if (isLoon || isSurge) $persistentStore.write(data, this.name); 369 | if (isNode) { 370 | this.node.fs.writeFileSync( 371 | `${this.name}.json`, 372 | data, 373 | { 374 | flag: "w", 375 | }, 376 | (err) => console.log(err) 377 | ); 378 | this.node.fs.writeFileSync( 379 | "root.json", 380 | JSON.stringify(this.root, null, 2), 381 | { 382 | flag: "w", 383 | }, 384 | (err) => console.log(err) 385 | ); 386 | } 387 | } 388 | 389 | write(data, key) { 390 | this.log(`SET ${key}`); 391 | if (key.indexOf("#") !== -1) { 392 | key = key.substr(1); 393 | if (isSurge || isLoon) { 394 | return $persistentStore.write(data, key); 395 | } 396 | if (isQX) { 397 | return $prefs.setValueForKey(data, key); 398 | } 399 | if (isNode) { 400 | this.root[key] = data; 401 | } 402 | } else { 403 | this.cache[key] = data; 404 | } 405 | this.persistCache(); 406 | } 407 | 408 | read(key) { 409 | this.log(`READ ${key}`); 410 | if (key.indexOf("#") !== -1) { 411 | key = key.substr(1); 412 | if (isSurge || isLoon) { 413 | return $persistentStore.read(key); 414 | } 415 | if (isQX) { 416 | return $prefs.valueForKey(key); 417 | } 418 | if (isNode) { 419 | return this.root[key]; 420 | } 421 | } else { 422 | return this.cache[key]; 423 | } 424 | } 425 | 426 | delete(key) { 427 | this.log(`DELETE ${key}`); 428 | if (key.indexOf("#") !== -1) { 429 | key = key.substr(1); 430 | if (isSurge || isLoon) { 431 | return $persistentStore.write(null, key); 432 | } 433 | if (isQX) { 434 | return $prefs.removeValueForKey(key); 435 | } 436 | if (isNode) { 437 | delete this.root[key]; 438 | } 439 | } else { 440 | delete this.cache[key]; 441 | } 442 | this.persistCache(); 443 | } 444 | 445 | // notification 446 | notify(title, subtitle = "", content = "", options = {}) { 447 | const openURL = options["open-url"]; 448 | const mediaURL = options["media-url"]; 449 | 450 | if (isQX) $notify(title, subtitle, content, options); 451 | if (isSurge) { 452 | $notification.post( 453 | title, 454 | subtitle, 455 | content + `${mediaURL ? "\n多媒体:" + mediaURL : ""}`, 456 | { 457 | url: openURL, 458 | } 459 | ); 460 | } 461 | if (isLoon) { 462 | let opts = {}; 463 | if (openURL) opts["openUrl"] = openURL; 464 | if (mediaURL) opts["mediaUrl"] = mediaURL; 465 | if (JSON.stringify(opts) === "{}") { 466 | $notification.post(title, subtitle, content); 467 | } else { 468 | $notification.post(title, subtitle, content, opts); 469 | } 470 | } 471 | if (isNode || isScriptable) { 472 | const content_ = 473 | content + 474 | (openURL ? `\n点击跳转: ${openURL}` : "") + 475 | (mediaURL ? `\n多媒体: ${mediaURL}` : ""); 476 | if (isJSBox) { 477 | const push = require("push"); 478 | push.schedule({ 479 | title: title, 480 | body: (subtitle ? subtitle + "\n" : "") + content_, 481 | }); 482 | } else { 483 | console.log(`${title}\n${subtitle}\n${content_}\n\n`); 484 | } 485 | } 486 | } 487 | 488 | // other helper functions 489 | log(msg) { 490 | if (this.debug) console.log(`[${this.name}] LOG: ${this.stringify(msg)}`); 491 | } 492 | 493 | info(msg) { 494 | console.log(`[${this.name}] INFO: ${this.stringify(msg)}`); 495 | } 496 | 497 | error(msg) { 498 | console.log(`[${this.name}] ERROR: ${this.stringify(msg)}`); 499 | } 500 | 501 | wait(millisec) { 502 | return new Promise((resolve) => setTimeout(resolve, millisec)); 503 | } 504 | 505 | done(value = {}) { 506 | if (isQX || isLoon || isSurge) { 507 | $done(value); 508 | } else if (isNode && !isJSBox) { 509 | if (typeof $context !== "undefined") { 510 | $context.headers = value.headers; 511 | $context.statusCode = value.statusCode; 512 | $context.body = value.body; 513 | } 514 | } 515 | } 516 | 517 | stringify(obj_or_str) { 518 | if (typeof obj_or_str === "string" || obj_or_str instanceof String) 519 | return obj_or_str; 520 | else 521 | try { 522 | return JSON.stringify(obj_or_str, null, 2); 523 | } catch (err) { 524 | return "[object Object]"; 525 | } 526 | } 527 | })(name, debug); 528 | } 529 | -------------------------------------------------------------------------------- /check_in/taobao/tb-name.js: -------------------------------------------------------------------------------- 1 | /* 2 | 【淘宝监控-标题版】@evilbutcher 3 | 4 | 【仓库地址】https://github.com/evilbutcher/QuantumultX/tree/master(欢迎star🌟) 5 | 6 | 【BoxJs】https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/evilbutcher.boxjs.json 7 | 8 | 【致谢】 9 | 感谢Peng-YM的OpenAPI.js! 10 | 11 | ⚠️【免责声明】 12 | ------------------------------------------ 13 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 14 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 15 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 16 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 17 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 18 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 19 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 20 | 21 | 22 | 【使用说明】 23 | 在淘宝App对商品进行分享,拷贝链接用Safari打开,自动获取Cookie、监控链接,即可使用。该脚本对应的是对标题变动监控。 24 | 25 | 【Surge】 26 | ----------------- 27 | [Script] 28 | 淘宝监控获取Cookie = http-request, pattern = https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdetail, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb-name.js, requires-body=false 29 | 淘宝监控-标题版 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb-name.js 30 | 31 | 【Loon】 32 | ----------------- 33 | [Script] 34 | http-request https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdetail tag=淘宝监控获取Cookie, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb-name.js, requires-body=false 35 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hzh/taobao/tb-name.js, tag=淘宝监控-标题版 36 | 37 | 【Quantumult X】 38 | ----------------- 39 | [rewrite_local] 40 | https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdetail url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb-name.js 41 | 42 | [task_local] 43 | 5 0 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb-name.js, tag=淘宝监控-标题版 44 | 45 | 【All App MitM】 46 | hostname =h5api.m.taobao.com 47 | 48 | 【Icon】 49 | 透明:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/tb_tran.png 50 | 彩色:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/tb.png 51 | */ 52 | 53 | const $ = new API("taobao-name", true); 54 | const ERR = MYERR(); 55 | $.cookie = $.read("evil_tbnamecookie"); 56 | $.url = $.read("evil_tbnameurl"); 57 | $.record = $.read("evil_tbnamerecord") || ""; 58 | $.price = $.read("evil_tbnameprice") || ""; 59 | 60 | !(async () => { 61 | if (typeof $request != "undefined") { 62 | getCookie(); 63 | return; 64 | } 65 | if ($.url != undefined && $.cookie != undefined) { 66 | await checkin(); 67 | } else { 68 | $.notify("淘宝监控-标题版", "", "❌ 请先获取Cookie"); 69 | } 70 | })() 71 | .catch((err) => { 72 | if (err instanceof ERR.ParseError) { 73 | $.notify("淘宝监控-标题版", "❌ 解析数据出现错误", err.message); 74 | } else { 75 | $.notify( 76 | "淘宝监控-标题版", 77 | "❌ 出现错误", 78 | JSON.stringify(err, Object.getOwnPropertyNames(err)) 79 | ); 80 | } 81 | }) 82 | .finally(() => $.done()); 83 | 84 | function checkin() { 85 | const url = $.url; 86 | const headers = { 87 | Cookie: $.cookie, 88 | Accept: `*/*`, 89 | Connection: `keep-alive`, 90 | Referer: `https://h5.m.taobao.com/`, 91 | "Accept-Encoding": `gzip, deflate, br`, 92 | Host: `h5api.m.taobao.com`, 93 | "User-Agent": `Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Mobile/15E148 Safari/604.1`, 94 | "Accept-Language": `zh-CN,zh-Hans;q=0.9`, 95 | }; 96 | 97 | const myRequest = { 98 | url: url, 99 | headers: headers, 100 | }; 101 | 102 | return $.http.get(myRequest).then((response) => { 103 | if (response.statusCode == 200) { 104 | var getinfo = /\itemId\"\:\"\d+\"\,\"title\"\:\".*?\"\,/; 105 | var body = response.body.slice(11, -1); 106 | var obj = JSON.parse(body); 107 | var data = obj.data; 108 | var preinfo = JSON.stringify(data).match(getinfo); 109 | var id = JSON.stringify(preinfo).slice(13, 25); 110 | var link = "https://h5.m.taobao.com/awp/core/detail.htm?id=" + id; 111 | var title = JSON.stringify(preinfo).slice(40, -5); 112 | $.log(title); 113 | $.log(id); 114 | var getprice = /priceText\\"\:\\\".*?\\/; 115 | var preprice = JSON.stringify(data).match(getprice); 116 | var price = JSON.stringify(preprice).slice(20, -4); 117 | $.log(price); 118 | if (title != $.record) { 119 | $.record = title; 120 | $.write($.record, "evil_tbnamerecord"); 121 | $.notify("淘宝监控-标题版", "标题更新", title, { "open-url": link }); 122 | } else { 123 | $.log("暂未发现标题更新"); 124 | } 125 | if (JSON.stringify(price) != $.price) { 126 | $.price = price; 127 | $.write(JSON.stringify($.price), "evil_tbnameprice"); 128 | $.notify("淘宝监控-标题版", "价格更新", "新价格为" + price, { 129 | "open-url": link, 130 | }); 131 | } else { 132 | $.log("暂未发现价格更新"); 133 | } 134 | } else { 135 | $.error(JSON.stringify(response)); 136 | throw new ERR.ParseError("数据解析错误,请检查日志"); 137 | } 138 | }); 139 | } 140 | 141 | function getCookie() { 142 | if ( 143 | $request && 144 | $request.method != "OPTIONS" && 145 | $request.url.match(/mtop.taobao.detail.getdetail/) 146 | ) { 147 | const cookie = $request.headers["Cookie"]; 148 | $.log(cookie); 149 | $.write(cookie, "evil_tbnamecookie"); 150 | const url = $request.url; 151 | $.log(url); 152 | $.write(url, "evil_tbnameurl"); 153 | $.notify("淘宝监控-标题版", "", "获取Cookie成功🎉"); 154 | } 155 | } 156 | 157 | function MYERR() { 158 | class ParseError extends Error { 159 | constructor(message) { 160 | super(message); 161 | this.name = "ParseError"; 162 | } 163 | } 164 | return { 165 | ParseError, 166 | }; 167 | } 168 | 169 | /** 170 | * OpenAPI 171 | * @author: Peng-YM 172 | * https://github.com/Peng-YM/QuanX/blob/master/Tools/OpenAPI/README.md 173 | */ 174 | function ENV() { 175 | const isQX = typeof $task !== "undefined"; 176 | const isLoon = typeof $loon !== "undefined"; 177 | const isSurge = typeof $httpClient !== "undefined" && !isLoon; 178 | const isJSBox = typeof require == "function" && typeof $jsbox != "undefined"; 179 | const isNode = typeof require == "function" && !isJSBox; 180 | const isRequest = typeof $request !== "undefined"; 181 | const isScriptable = typeof importModule !== "undefined"; 182 | return { 183 | isQX, 184 | isLoon, 185 | isSurge, 186 | isNode, 187 | isJSBox, 188 | isRequest, 189 | isScriptable, 190 | }; 191 | } 192 | 193 | function HTTP( 194 | defaultOptions = { 195 | baseURL: "", 196 | } 197 | ) { 198 | const { isQX, isLoon, isSurge, isScriptable, isNode } = ENV(); 199 | const methods = ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"]; 200 | const URL_REGEX = 201 | /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/; 202 | 203 | function send(method, options) { 204 | options = 205 | typeof options === "string" 206 | ? { 207 | url: options, 208 | } 209 | : options; 210 | const baseURL = defaultOptions.baseURL; 211 | if (baseURL && !URL_REGEX.test(options.url || "")) { 212 | options.url = baseURL ? baseURL + options.url : options.url; 213 | } 214 | if (options.body && options.headers && !options.headers["Content-Type"]) { 215 | options.headers["Content-Type"] = "application/x-www-form-urlencoded"; 216 | } 217 | options = { 218 | ...defaultOptions, 219 | ...options, 220 | }; 221 | const timeout = options.timeout; 222 | const events = { 223 | ...{ 224 | onRequest: () => {}, 225 | onResponse: (resp) => resp, 226 | onTimeout: () => {}, 227 | }, 228 | ...options.events, 229 | }; 230 | 231 | events.onRequest(method, options); 232 | 233 | let worker; 234 | if (isQX) { 235 | worker = $task.fetch({ 236 | method, 237 | ...options, 238 | }); 239 | } else if (isLoon || isSurge || isNode) { 240 | worker = new Promise((resolve, reject) => { 241 | const request = isNode ? require("request") : $httpClient; 242 | request[method.toLowerCase()](options, (err, response, body) => { 243 | if (err) reject(err); 244 | else 245 | resolve({ 246 | statusCode: response.status || response.statusCode, 247 | headers: response.headers, 248 | body, 249 | }); 250 | }); 251 | }); 252 | } else if (isScriptable) { 253 | const request = new Request(options.url); 254 | request.method = method; 255 | request.headers = options.headers; 256 | request.body = options.body; 257 | worker = new Promise((resolve, reject) => { 258 | request 259 | .loadString() 260 | .then((body) => { 261 | resolve({ 262 | statusCode: request.response.statusCode, 263 | headers: request.response.headers, 264 | body, 265 | }); 266 | }) 267 | .catch((err) => reject(err)); 268 | }); 269 | } 270 | 271 | let timeoutid; 272 | const timer = timeout 273 | ? new Promise((_, reject) => { 274 | timeoutid = setTimeout(() => { 275 | events.onTimeout(); 276 | return reject( 277 | `${method} URL: ${options.url} exceeds the timeout ${timeout} ms` 278 | ); 279 | }, timeout); 280 | }) 281 | : null; 282 | 283 | return ( 284 | timer 285 | ? Promise.race([timer, worker]).then((res) => { 286 | clearTimeout(timeoutid); 287 | return res; 288 | }) 289 | : worker 290 | ).then((resp) => events.onResponse(resp)); 291 | } 292 | 293 | const http = {}; 294 | methods.forEach( 295 | (method) => 296 | (http[method.toLowerCase()] = (options) => send(method, options)) 297 | ); 298 | return http; 299 | } 300 | 301 | function API(name = "untitled", debug = false) { 302 | const { isQX, isLoon, isSurge, isNode, isJSBox, isScriptable } = ENV(); 303 | return new (class { 304 | constructor(name, debug) { 305 | this.name = name; 306 | this.debug = debug; 307 | 308 | this.http = HTTP(); 309 | this.env = ENV(); 310 | 311 | this.node = (() => { 312 | if (isNode) { 313 | const fs = require("fs"); 314 | 315 | return { 316 | fs, 317 | }; 318 | } else { 319 | return null; 320 | } 321 | })(); 322 | this.initCache(); 323 | 324 | const delay = (t, v) => 325 | new Promise(function (resolve) { 326 | setTimeout(resolve.bind(null, v), t); 327 | }); 328 | 329 | Promise.prototype.delay = function (t) { 330 | return this.then(function (v) { 331 | return delay(t, v); 332 | }); 333 | }; 334 | } 335 | 336 | // persistence 337 | // initialize cache 338 | initCache() { 339 | if (isQX) this.cache = JSON.parse($prefs.valueForKey(this.name) || "{}"); 340 | if (isLoon || isSurge) 341 | this.cache = JSON.parse($persistentStore.read(this.name) || "{}"); 342 | 343 | if (isNode) { 344 | // create a json for root cache 345 | let fpath = "root.json"; 346 | if (!this.node.fs.existsSync(fpath)) { 347 | this.node.fs.writeFileSync( 348 | fpath, 349 | JSON.stringify({}), 350 | { 351 | flag: "wx", 352 | }, 353 | (err) => console.log(err) 354 | ); 355 | } 356 | this.root = {}; 357 | 358 | // create a json file with the given name if not exists 359 | fpath = `${this.name}.json`; 360 | if (!this.node.fs.existsSync(fpath)) { 361 | this.node.fs.writeFileSync( 362 | fpath, 363 | JSON.stringify({}), 364 | { 365 | flag: "wx", 366 | }, 367 | (err) => console.log(err) 368 | ); 369 | this.cache = {}; 370 | } else { 371 | this.cache = JSON.parse( 372 | this.node.fs.readFileSync(`${this.name}.json`) 373 | ); 374 | } 375 | } 376 | } 377 | 378 | // store cache 379 | persistCache() { 380 | const data = JSON.stringify(this.cache, null, 2); 381 | if (isQX) $prefs.setValueForKey(data, this.name); 382 | if (isLoon || isSurge) $persistentStore.write(data, this.name); 383 | if (isNode) { 384 | this.node.fs.writeFileSync( 385 | `${this.name}.json`, 386 | data, 387 | { 388 | flag: "w", 389 | }, 390 | (err) => console.log(err) 391 | ); 392 | this.node.fs.writeFileSync( 393 | "root.json", 394 | JSON.stringify(this.root, null, 2), 395 | { 396 | flag: "w", 397 | }, 398 | (err) => console.log(err) 399 | ); 400 | } 401 | } 402 | 403 | write(data, key) { 404 | this.log(`SET ${key}`); 405 | if (key.indexOf("#") !== -1) { 406 | key = key.substr(1); 407 | if (isSurge || isLoon) { 408 | return $persistentStore.write(data, key); 409 | } 410 | if (isQX) { 411 | return $prefs.setValueForKey(data, key); 412 | } 413 | if (isNode) { 414 | this.root[key] = data; 415 | } 416 | } else { 417 | this.cache[key] = data; 418 | } 419 | this.persistCache(); 420 | } 421 | 422 | read(key) { 423 | this.log(`READ ${key}`); 424 | if (key.indexOf("#") !== -1) { 425 | key = key.substr(1); 426 | if (isSurge || isLoon) { 427 | return $persistentStore.read(key); 428 | } 429 | if (isQX) { 430 | return $prefs.valueForKey(key); 431 | } 432 | if (isNode) { 433 | return this.root[key]; 434 | } 435 | } else { 436 | return this.cache[key]; 437 | } 438 | } 439 | 440 | delete(key) { 441 | this.log(`DELETE ${key}`); 442 | if (key.indexOf("#") !== -1) { 443 | key = key.substr(1); 444 | if (isSurge || isLoon) { 445 | return $persistentStore.write(null, key); 446 | } 447 | if (isQX) { 448 | return $prefs.removeValueForKey(key); 449 | } 450 | if (isNode) { 451 | delete this.root[key]; 452 | } 453 | } else { 454 | delete this.cache[key]; 455 | } 456 | this.persistCache(); 457 | } 458 | 459 | // notification 460 | notify(title, subtitle = "", content = "", options = {}) { 461 | const openURL = options["open-url"]; 462 | const mediaURL = options["media-url"]; 463 | 464 | if (isQX) $notify(title, subtitle, content, options); 465 | if (isSurge) { 466 | $notification.post( 467 | title, 468 | subtitle, 469 | content + `${mediaURL ? "\n多媒体:" + mediaURL : ""}`, 470 | { 471 | url: openURL, 472 | } 473 | ); 474 | } 475 | if (isLoon) { 476 | let opts = {}; 477 | if (openURL) opts["openUrl"] = openURL; 478 | if (mediaURL) opts["mediaUrl"] = mediaURL; 479 | if (JSON.stringify(opts) === "{}") { 480 | $notification.post(title, subtitle, content); 481 | } else { 482 | $notification.post(title, subtitle, content, opts); 483 | } 484 | } 485 | if (isNode || isScriptable) { 486 | const content_ = 487 | content + 488 | (openURL ? `\n点击跳转: ${openURL}` : "") + 489 | (mediaURL ? `\n多媒体: ${mediaURL}` : ""); 490 | if (isJSBox) { 491 | const push = require("push"); 492 | push.schedule({ 493 | title: title, 494 | body: (subtitle ? subtitle + "\n" : "") + content_, 495 | }); 496 | } else { 497 | console.log(`${title}\n${subtitle}\n${content_}\n\n`); 498 | } 499 | } 500 | } 501 | 502 | // other helper functions 503 | log(msg) { 504 | if (this.debug) console.log(`[${this.name}] LOG: ${this.stringify(msg)}`); 505 | } 506 | 507 | info(msg) { 508 | console.log(`[${this.name}] INFO: ${this.stringify(msg)}`); 509 | } 510 | 511 | error(msg) { 512 | console.log(`[${this.name}] ERROR: ${this.stringify(msg)}`); 513 | } 514 | 515 | wait(millisec) { 516 | return new Promise((resolve) => setTimeout(resolve, millisec)); 517 | } 518 | 519 | done(value = {}) { 520 | if (isQX || isLoon || isSurge) { 521 | $done(value); 522 | } else if (isNode && !isJSBox) { 523 | if (typeof $context !== "undefined") { 524 | $context.headers = value.headers; 525 | $context.statusCode = value.statusCode; 526 | $context.body = value.body; 527 | } 528 | } 529 | } 530 | 531 | stringify(obj_or_str) { 532 | if (typeof obj_or_str === "string" || obj_or_str instanceof String) 533 | return obj_or_str; 534 | else 535 | try { 536 | return JSON.stringify(obj_or_str, null, 2); 537 | } catch (err) { 538 | return "[object Object]"; 539 | } 540 | } 541 | })(name, debug); 542 | } 543 | -------------------------------------------------------------------------------- /check_in/taobao/tb.js: -------------------------------------------------------------------------------- 1 | /* 2 | 【淘宝监控】@evilbutcher 3 | 4 | 【仓库地址】https://github.com/evilbutcher/QuantumultX/tree/master(欢迎star🌟) 5 | 6 | 【BoxJs】https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/evilbutcher.boxjs.json 7 | 8 | 【致谢】 9 | 感谢Peng-YM的OpenAPI.js! 10 | 11 | ⚠️【免责声明】 12 | ------------------------------------------ 13 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 14 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 15 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 16 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 17 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 18 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 19 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 20 | 21 | 22 | 【使用说明】 23 | 在淘宝App对商品进行分享,拷贝链接用Safari打开,自动获取Cookie、监控链接,即可使用。该脚本对应的是对颜色分类变动监控。 24 | 25 | 【Surge】 26 | ----------------- 27 | [Script] 28 | 淘宝监控获取Cookie = http-request, pattern = https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdesc, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb.js, requires-body=false 29 | 淘宝监控 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb.js 30 | 31 | 【Loon】 32 | ----------------- 33 | [Script] 34 | http-request https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdesc tag=淘宝监控获取Cookie, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb.js, requires-body=false 35 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hzh/taobao/tb.js, tag=淘宝监控 36 | 37 | 【Quantumult X】 38 | ----------------- 39 | [rewrite_local] 40 | https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdesc url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb.js 41 | 42 | [task_local] 43 | 5 0 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb.js, tag=淘宝监控 44 | 45 | 【All App MitM】 46 | hostname =h5api.m.taobao.com 47 | 48 | 【Icon】 49 | 透明:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/tb_tran.png 50 | 彩色:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/tb.png 51 | */ 52 | 53 | const $ = new API("taobao", true); 54 | const ERR = MYERR(); 55 | $.cookie = $.read("evil_tbcookie"); 56 | $.url = $.read("evil_tburl"); 57 | $.record = $.read("evil_tbrecord") || []; 58 | 59 | !(async () => { 60 | if (typeof $request != "undefined") { 61 | getCookie(); 62 | return; 63 | } 64 | if ($.url != undefined && $.cookie != undefined) { 65 | await checkin(); 66 | } else { 67 | $.notify("淘宝监控", "", "❌ 请先获取Cookie"); 68 | } 69 | })() 70 | .catch((err) => { 71 | if (err instanceof ERR.ParseError) { 72 | $.notify("淘宝监控", "❌ 解析数据出现错误", err.message); 73 | } else { 74 | $.notify( 75 | "淘宝监控", 76 | "❌ 出现错误", 77 | JSON.stringify(err, Object.getOwnPropertyNames(err)) 78 | ); 79 | } 80 | }) 81 | .finally(() => $.done()); 82 | 83 | function checkin() { 84 | const url = $.url; 85 | const headers = { 86 | Cookie: $.cookie, 87 | Accept: `*/*`, 88 | Connection: `keep-alive`, 89 | Referer: `https://h5.m.taobao.com/`, 90 | "Accept-Encoding": `gzip, deflate, br`, 91 | Host: `h5api.m.taobao.com`, 92 | "User-Agent": `Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Mobile/15E148 Safari/604.1`, 93 | "Accept-Language": `zh-CN,zh-Hans;q=0.9`, 94 | }; 95 | 96 | const myRequest = { 97 | url: url, 98 | headers: headers, 99 | }; 100 | 101 | return $.http.get(myRequest).then((response) => { 102 | if (response.statusCode == 200) { 103 | var getid = /id%22%3A%22\d+%22/; 104 | var preid = $.url.match(getid); 105 | var id = JSON.stringify(preid).slice(13, -5); 106 | var link = "https://h5.m.taobao.com/awp/core/detail.htm?id=" + id; 107 | var body = response.body.slice(11, -1); 108 | var obj = JSON.parse(body); 109 | var data = obj.data.itemProperties; 110 | var detail; 111 | for (i = 0; i < data.length; i++) { 112 | if (data[i].name == "颜色分类") { 113 | detail = data[i].value; 114 | } 115 | } 116 | var item = detail.split(","); 117 | for (j = 0; j < item.length; j++) { 118 | if ($.record.indexOf(item[j]) == -1) { 119 | $.record.push(item[j]); 120 | $.notify("淘宝监控", "", "新增" + item[j], { "open-url": link }); 121 | } else { 122 | $.log("暂未发现更新"); 123 | } 124 | } 125 | $.write($.record, "evil_tbrecord"); 126 | } else { 127 | $.error(JSON.stringify(response)); 128 | throw new ERR.ParseError("数据解析错误,请检查日志"); 129 | } 130 | }); 131 | } 132 | 133 | function getCookie() { 134 | if ( 135 | $request && 136 | $request.method != "OPTIONS" && 137 | $request.url.match(/mtop.taobao.detail.getdesc/) 138 | ) { 139 | const cookie = $request.headers["Cookie"]; 140 | $.log(cookie); 141 | $.write(cookie, "evil_tbcookie"); 142 | const url = $request.url; 143 | $.log(url); 144 | $.write(url, "evil_tburl"); 145 | $.notify("淘宝监控", "", "获取Cookie成功🎉"); 146 | } 147 | } 148 | 149 | function MYERR() { 150 | class ParseError extends Error { 151 | constructor(message) { 152 | super(message); 153 | this.name = "ParseError"; 154 | } 155 | } 156 | return { 157 | ParseError, 158 | }; 159 | } 160 | 161 | /** 162 | * OpenAPI 163 | * @author: Peng-YM 164 | * https://github.com/Peng-YM/QuanX/blob/master/Tools/OpenAPI/README.md 165 | */ 166 | function ENV() { 167 | const isQX = typeof $task !== "undefined"; 168 | const isLoon = typeof $loon !== "undefined"; 169 | const isSurge = typeof $httpClient !== "undefined" && !isLoon; 170 | const isJSBox = typeof require == "function" && typeof $jsbox != "undefined"; 171 | const isNode = typeof require == "function" && !isJSBox; 172 | const isRequest = typeof $request !== "undefined"; 173 | const isScriptable = typeof importModule !== "undefined"; 174 | return { 175 | isQX, 176 | isLoon, 177 | isSurge, 178 | isNode, 179 | isJSBox, 180 | isRequest, 181 | isScriptable, 182 | }; 183 | } 184 | 185 | function HTTP( 186 | defaultOptions = { 187 | baseURL: "", 188 | } 189 | ) { 190 | const { isQX, isLoon, isSurge, isScriptable, isNode } = ENV(); 191 | const methods = ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"]; 192 | const URL_REGEX = 193 | /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/; 194 | 195 | function send(method, options) { 196 | options = 197 | typeof options === "string" 198 | ? { 199 | url: options, 200 | } 201 | : options; 202 | const baseURL = defaultOptions.baseURL; 203 | if (baseURL && !URL_REGEX.test(options.url || "")) { 204 | options.url = baseURL ? baseURL + options.url : options.url; 205 | } 206 | if (options.body && options.headers && !options.headers["Content-Type"]) { 207 | options.headers["Content-Type"] = "application/x-www-form-urlencoded"; 208 | } 209 | options = { 210 | ...defaultOptions, 211 | ...options, 212 | }; 213 | const timeout = options.timeout; 214 | const events = { 215 | ...{ 216 | onRequest: () => {}, 217 | onResponse: (resp) => resp, 218 | onTimeout: () => {}, 219 | }, 220 | ...options.events, 221 | }; 222 | 223 | events.onRequest(method, options); 224 | 225 | let worker; 226 | if (isQX) { 227 | worker = $task.fetch({ 228 | method, 229 | ...options, 230 | }); 231 | } else if (isLoon || isSurge || isNode) { 232 | worker = new Promise((resolve, reject) => { 233 | const request = isNode ? require("request") : $httpClient; 234 | request[method.toLowerCase()](options, (err, response, body) => { 235 | if (err) reject(err); 236 | else 237 | resolve({ 238 | statusCode: response.status || response.statusCode, 239 | headers: response.headers, 240 | body, 241 | }); 242 | }); 243 | }); 244 | } else if (isScriptable) { 245 | const request = new Request(options.url); 246 | request.method = method; 247 | request.headers = options.headers; 248 | request.body = options.body; 249 | worker = new Promise((resolve, reject) => { 250 | request 251 | .loadString() 252 | .then((body) => { 253 | resolve({ 254 | statusCode: request.response.statusCode, 255 | headers: request.response.headers, 256 | body, 257 | }); 258 | }) 259 | .catch((err) => reject(err)); 260 | }); 261 | } 262 | 263 | let timeoutid; 264 | const timer = timeout 265 | ? new Promise((_, reject) => { 266 | timeoutid = setTimeout(() => { 267 | events.onTimeout(); 268 | return reject( 269 | `${method} URL: ${options.url} exceeds the timeout ${timeout} ms` 270 | ); 271 | }, timeout); 272 | }) 273 | : null; 274 | 275 | return ( 276 | timer 277 | ? Promise.race([timer, worker]).then((res) => { 278 | clearTimeout(timeoutid); 279 | return res; 280 | }) 281 | : worker 282 | ).then((resp) => events.onResponse(resp)); 283 | } 284 | 285 | const http = {}; 286 | methods.forEach( 287 | (method) => 288 | (http[method.toLowerCase()] = (options) => send(method, options)) 289 | ); 290 | return http; 291 | } 292 | 293 | function API(name = "untitled", debug = false) { 294 | const { isQX, isLoon, isSurge, isNode, isJSBox, isScriptable } = ENV(); 295 | return new (class { 296 | constructor(name, debug) { 297 | this.name = name; 298 | this.debug = debug; 299 | 300 | this.http = HTTP(); 301 | this.env = ENV(); 302 | 303 | this.node = (() => { 304 | if (isNode) { 305 | const fs = require("fs"); 306 | 307 | return { 308 | fs, 309 | }; 310 | } else { 311 | return null; 312 | } 313 | })(); 314 | this.initCache(); 315 | 316 | const delay = (t, v) => 317 | new Promise(function (resolve) { 318 | setTimeout(resolve.bind(null, v), t); 319 | }); 320 | 321 | Promise.prototype.delay = function (t) { 322 | return this.then(function (v) { 323 | return delay(t, v); 324 | }); 325 | }; 326 | } 327 | 328 | // persistence 329 | // initialize cache 330 | initCache() { 331 | if (isQX) this.cache = JSON.parse($prefs.valueForKey(this.name) || "{}"); 332 | if (isLoon || isSurge) 333 | this.cache = JSON.parse($persistentStore.read(this.name) || "{}"); 334 | 335 | if (isNode) { 336 | // create a json for root cache 337 | let fpath = "root.json"; 338 | if (!this.node.fs.existsSync(fpath)) { 339 | this.node.fs.writeFileSync( 340 | fpath, 341 | JSON.stringify({}), 342 | { 343 | flag: "wx", 344 | }, 345 | (err) => console.log(err) 346 | ); 347 | } 348 | this.root = {}; 349 | 350 | // create a json file with the given name if not exists 351 | fpath = `${this.name}.json`; 352 | if (!this.node.fs.existsSync(fpath)) { 353 | this.node.fs.writeFileSync( 354 | fpath, 355 | JSON.stringify({}), 356 | { 357 | flag: "wx", 358 | }, 359 | (err) => console.log(err) 360 | ); 361 | this.cache = {}; 362 | } else { 363 | this.cache = JSON.parse( 364 | this.node.fs.readFileSync(`${this.name}.json`) 365 | ); 366 | } 367 | } 368 | } 369 | 370 | // store cache 371 | persistCache() { 372 | const data = JSON.stringify(this.cache, null, 2); 373 | if (isQX) $prefs.setValueForKey(data, this.name); 374 | if (isLoon || isSurge) $persistentStore.write(data, this.name); 375 | if (isNode) { 376 | this.node.fs.writeFileSync( 377 | `${this.name}.json`, 378 | data, 379 | { 380 | flag: "w", 381 | }, 382 | (err) => console.log(err) 383 | ); 384 | this.node.fs.writeFileSync( 385 | "root.json", 386 | JSON.stringify(this.root, null, 2), 387 | { 388 | flag: "w", 389 | }, 390 | (err) => console.log(err) 391 | ); 392 | } 393 | } 394 | 395 | write(data, key) { 396 | this.log(`SET ${key}`); 397 | if (key.indexOf("#") !== -1) { 398 | key = key.substr(1); 399 | if (isSurge || isLoon) { 400 | return $persistentStore.write(data, key); 401 | } 402 | if (isQX) { 403 | return $prefs.setValueForKey(data, key); 404 | } 405 | if (isNode) { 406 | this.root[key] = data; 407 | } 408 | } else { 409 | this.cache[key] = data; 410 | } 411 | this.persistCache(); 412 | } 413 | 414 | read(key) { 415 | this.log(`READ ${key}`); 416 | if (key.indexOf("#") !== -1) { 417 | key = key.substr(1); 418 | if (isSurge || isLoon) { 419 | return $persistentStore.read(key); 420 | } 421 | if (isQX) { 422 | return $prefs.valueForKey(key); 423 | } 424 | if (isNode) { 425 | return this.root[key]; 426 | } 427 | } else { 428 | return this.cache[key]; 429 | } 430 | } 431 | 432 | delete(key) { 433 | this.log(`DELETE ${key}`); 434 | if (key.indexOf("#") !== -1) { 435 | key = key.substr(1); 436 | if (isSurge || isLoon) { 437 | return $persistentStore.write(null, key); 438 | } 439 | if (isQX) { 440 | return $prefs.removeValueForKey(key); 441 | } 442 | if (isNode) { 443 | delete this.root[key]; 444 | } 445 | } else { 446 | delete this.cache[key]; 447 | } 448 | this.persistCache(); 449 | } 450 | 451 | // notification 452 | notify(title, subtitle = "", content = "", options = {}) { 453 | const openURL = options["open-url"]; 454 | const mediaURL = options["media-url"]; 455 | 456 | if (isQX) $notify(title, subtitle, content, options); 457 | if (isSurge) { 458 | $notification.post( 459 | title, 460 | subtitle, 461 | content + `${mediaURL ? "\n多媒体:" + mediaURL : ""}`, 462 | { 463 | url: openURL, 464 | } 465 | ); 466 | } 467 | if (isLoon) { 468 | let opts = {}; 469 | if (openURL) opts["openUrl"] = openURL; 470 | if (mediaURL) opts["mediaUrl"] = mediaURL; 471 | if (JSON.stringify(opts) === "{}") { 472 | $notification.post(title, subtitle, content); 473 | } else { 474 | $notification.post(title, subtitle, content, opts); 475 | } 476 | } 477 | if (isNode || isScriptable) { 478 | const content_ = 479 | content + 480 | (openURL ? `\n点击跳转: ${openURL}` : "") + 481 | (mediaURL ? `\n多媒体: ${mediaURL}` : ""); 482 | if (isJSBox) { 483 | const push = require("push"); 484 | push.schedule({ 485 | title: title, 486 | body: (subtitle ? subtitle + "\n" : "") + content_, 487 | }); 488 | } else { 489 | console.log(`${title}\n${subtitle}\n${content_}\n\n`); 490 | } 491 | } 492 | } 493 | 494 | // other helper functions 495 | log(msg) { 496 | if (this.debug) console.log(`[${this.name}] LOG: ${this.stringify(msg)}`); 497 | } 498 | 499 | info(msg) { 500 | console.log(`[${this.name}] INFO: ${this.stringify(msg)}`); 501 | } 502 | 503 | error(msg) { 504 | console.log(`[${this.name}] ERROR: ${this.stringify(msg)}`); 505 | } 506 | 507 | wait(millisec) { 508 | return new Promise((resolve) => setTimeout(resolve, millisec)); 509 | } 510 | 511 | done(value = {}) { 512 | if (isQX || isLoon || isSurge) { 513 | $done(value); 514 | } else if (isNode && !isJSBox) { 515 | if (typeof $context !== "undefined") { 516 | $context.headers = value.headers; 517 | $context.statusCode = value.statusCode; 518 | $context.body = value.body; 519 | } 520 | } 521 | } 522 | 523 | stringify(obj_or_str) { 524 | if (typeof obj_or_str === "string" || obj_or_str instanceof String) 525 | return obj_or_str; 526 | else 527 | try { 528 | return JSON.stringify(obj_or_str, null, 2); 529 | } catch (err) { 530 | return "[object Object]"; 531 | } 532 | } 533 | })(name, debug); 534 | } 535 | -------------------------------------------------------------------------------- /check_in/wechatsubs/gxrcw.js: -------------------------------------------------------------------------------- 1 | /* 2 | 【高校人才网招聘监控】@evilbutcher 3 | 4 | 【仓库地址】https://github.com/evilbutcher/QuantumultX/tree/master(欢迎star🌟) 5 | 6 | 【BoxJs】https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/evilbutcher.boxjs.json 7 | 8 | 【致谢】 9 | 感谢Peng-YM的OpenAPI.js! 10 | 11 | ⚠️【免责声明】 12 | ------------------------------------------ 13 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 14 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 15 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 16 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 17 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 18 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 19 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 20 | 21 | 22 | 【使用说明】 23 | 添加任务即可使用 24 | 25 | 【Surge】 26 | ----------------- 27 | [Script] 28 | 高校人才网招聘监控 = type=cron,cronexp=5 * * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/gxrcw.js 29 | 30 | 【Loon】 31 | ----------------- 32 | [Script] 33 | cron "5 * * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/gxrcw.js, tag=高校人才网招聘监控 34 | 35 | 【Quantumult X】 36 | ----------------- 37 | [task_local] 38 | 5 * * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/gxrcw.js, tag=高校人才网招聘监控 39 | 40 | 【Icon】 41 | 透明:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/gxrcw_tran.png 42 | 彩色:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/gxrcw.png 43 | */ 44 | 45 | const $ = new API("gxrcw", true); 46 | const ERR = MYERR(); 47 | $.refreshtime = 6; //重复内容默认在6小时内不再通知,之后清空,可自行修改 48 | $.saveditem = []; 49 | 50 | !(async () => { 51 | init(); 52 | await check($.saveditem); 53 | })() 54 | .catch((err) => { 55 | if (err instanceof ERR.ParseError) { 56 | $.notify("高校人才网招聘监控", "❌ 解析数据出现错误", err.message); 57 | } else { 58 | $.notify( 59 | "高校人才网招聘监控", 60 | "❌ 出现错误", 61 | JSON.stringify(err, Object.getOwnPropertyNames(err)) 62 | ); 63 | } 64 | }) 65 | .finally(() => $.done()); 66 | 67 | function check(saveditem) { 68 | const url = `http://m.gaoxiaojob.com/list.php?tid=93`; 69 | const headers = { 70 | Accept: `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`, 71 | "Accept-Encoding": `gzip, deflate`, 72 | Connection: `keep-alive`, 73 | Referer: `http://www.gaoxiaojob.com/zhaopin/diqu/beijing/`, 74 | Host: `m.gaoxiaojob.com`, 75 | "User-Agent": `Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1`, 76 | "Upgrade-Insecure-Requests": `1`, 77 | "Accept-Language": `zh-cn`, 78 | }; 79 | 80 | const myRequest = { 81 | url: url, 82 | headers: headers, 83 | }; 84 | 85 | return $.http.post(myRequest).then((response) => { 86 | if (response.statusCode == 200) { 87 | $.data = response.body; 88 | var getitem = /href=\"view.*?\<\/a/g; 89 | var geturl = /view.*?\\/; 90 | var gettitle = /\>.*?\ $.refreshtime * 3600000) { 120 | $.info("达到设定时间清空本地记录并更新时间"); 121 | $.write(JSON.stringify($.nowtime), "gxrcwsavedtime"); 122 | $.write("[]", "gxrcwsaveditem"); 123 | } 124 | if ($.read("gxrcwsaveditem") != undefined && $.read("gxrcwsaveditem") != "") { 125 | var storeitem = JSON.parse($.read("gxrcwsaveditem")); 126 | } else { 127 | storeitem = []; 128 | } 129 | for (var i = 0; i < storeitem.length; i++) { 130 | $.saveditem.push(storeitem[i]); 131 | } 132 | if ($.saveditem.length != 0) { 133 | $.info("\n刷新时间内不再通知的内容👇\n" + $.saveditem + "\n"); 134 | } 135 | } 136 | 137 | function MYERR() { 138 | class ParseError extends Error { 139 | constructor(message) { 140 | super(message); 141 | this.name = "ParseError"; 142 | } 143 | } 144 | return { 145 | ParseError, 146 | }; 147 | } 148 | 149 | /** 150 | * OpenAPI 151 | * @author: Peng-YM 152 | * https://github.com/Peng-YM/QuanX/blob/master/Tools/OpenAPI/README.md 153 | */ 154 | function ENV() { 155 | const isQX = typeof $task !== "undefined"; 156 | const isLoon = typeof $loon !== "undefined"; 157 | const isSurge = typeof $httpClient !== "undefined" && !isLoon; 158 | const isJSBox = typeof require == "function" && typeof $jsbox != "undefined"; 159 | const isNode = typeof require == "function" && !isJSBox; 160 | const isRequest = typeof $request !== "undefined"; 161 | const isScriptable = typeof importModule !== "undefined"; 162 | return { 163 | isQX, 164 | isLoon, 165 | isSurge, 166 | isNode, 167 | isJSBox, 168 | isRequest, 169 | isScriptable, 170 | }; 171 | } 172 | 173 | function HTTP( 174 | defaultOptions = { 175 | baseURL: "", 176 | } 177 | ) { 178 | const { isQX, isLoon, isSurge, isScriptable, isNode } = ENV(); 179 | const methods = ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"]; 180 | const URL_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/; 181 | 182 | function send(method, options) { 183 | options = 184 | typeof options === "string" 185 | ? { 186 | url: options, 187 | } 188 | : options; 189 | const baseURL = defaultOptions.baseURL; 190 | if (baseURL && !URL_REGEX.test(options.url || "")) { 191 | options.url = baseURL ? baseURL + options.url : options.url; 192 | } 193 | options = { 194 | ...defaultOptions, 195 | ...options, 196 | }; 197 | const timeout = options.timeout; 198 | const events = { 199 | ...{ 200 | onRequest: () => {}, 201 | onResponse: (resp) => resp, 202 | onTimeout: () => {}, 203 | }, 204 | ...options.events, 205 | }; 206 | 207 | events.onRequest(method, options); 208 | 209 | let worker; 210 | if (isQX) { 211 | worker = $task.fetch({ 212 | method, 213 | ...options, 214 | }); 215 | } else if (isLoon || isSurge || isNode) { 216 | worker = new Promise((resolve, reject) => { 217 | const request = isNode ? require("request") : $httpClient; 218 | request[method.toLowerCase()](options, (err, response, body) => { 219 | if (err) reject(err); 220 | else 221 | resolve({ 222 | statusCode: response.status || response.statusCode, 223 | headers: response.headers, 224 | body, 225 | }); 226 | }); 227 | }); 228 | } else if (isScriptable) { 229 | const request = new Request(options.url); 230 | request.method = method; 231 | request.headers = options.headers; 232 | request.body = options.body; 233 | worker = new Promise((resolve, reject) => { 234 | request 235 | .loadString() 236 | .then((body) => { 237 | resolve({ 238 | statusCode: request.response.statusCode, 239 | headers: request.response.headers, 240 | body, 241 | }); 242 | }) 243 | .catch((err) => reject(err)); 244 | }); 245 | } 246 | 247 | let timeoutid; 248 | const timer = timeout 249 | ? new Promise((_, reject) => { 250 | timeoutid = setTimeout(() => { 251 | events.onTimeout(); 252 | return reject( 253 | `${method} URL: ${options.url} exceeds the timeout ${timeout} ms` 254 | ); 255 | }, timeout); 256 | }) 257 | : null; 258 | 259 | return (timer 260 | ? Promise.race([timer, worker]).then((res) => { 261 | clearTimeout(timeoutid); 262 | return res; 263 | }) 264 | : worker 265 | ).then((resp) => events.onResponse(resp)); 266 | } 267 | 268 | const http = {}; 269 | methods.forEach( 270 | (method) => 271 | (http[method.toLowerCase()] = (options) => send(method, options)) 272 | ); 273 | return http; 274 | } 275 | 276 | function API(name = "untitled", debug = false) { 277 | const { isQX, isLoon, isSurge, isNode, isJSBox, isScriptable } = ENV(); 278 | return new (class { 279 | constructor(name, debug) { 280 | this.name = name; 281 | this.debug = debug; 282 | 283 | this.http = HTTP(); 284 | this.env = ENV(); 285 | 286 | this.node = (() => { 287 | if (isNode) { 288 | const fs = require("fs"); 289 | 290 | return { 291 | fs, 292 | }; 293 | } else { 294 | return null; 295 | } 296 | })(); 297 | this.initCache(); 298 | 299 | const delay = (t, v) => 300 | new Promise(function (resolve) { 301 | setTimeout(resolve.bind(null, v), t); 302 | }); 303 | 304 | Promise.prototype.delay = function (t) { 305 | return this.then(function (v) { 306 | return delay(t, v); 307 | }); 308 | }; 309 | } 310 | 311 | // persistence 312 | // initialize cache 313 | initCache() { 314 | if (isQX) this.cache = JSON.parse($prefs.valueForKey(this.name) || "{}"); 315 | if (isLoon || isSurge) 316 | this.cache = JSON.parse($persistentStore.read(this.name) || "{}"); 317 | 318 | if (isNode) { 319 | // create a json for root cache 320 | let fpath = "root.json"; 321 | if (!this.node.fs.existsSync(fpath)) { 322 | this.node.fs.writeFileSync( 323 | fpath, 324 | JSON.stringify({}), 325 | { 326 | flag: "wx", 327 | }, 328 | (err) => console.log(err) 329 | ); 330 | } 331 | this.root = {}; 332 | 333 | // create a json file with the given name if not exists 334 | fpath = `${this.name}.json`; 335 | if (!this.node.fs.existsSync(fpath)) { 336 | this.node.fs.writeFileSync( 337 | fpath, 338 | JSON.stringify({}), 339 | { 340 | flag: "wx", 341 | }, 342 | (err) => console.log(err) 343 | ); 344 | this.cache = {}; 345 | } else { 346 | this.cache = JSON.parse( 347 | this.node.fs.readFileSync(`${this.name}.json`) 348 | ); 349 | } 350 | } 351 | } 352 | 353 | // store cache 354 | persistCache() { 355 | const data = JSON.stringify(this.cache, null, 2); 356 | if (isQX) $prefs.setValueForKey(data, this.name); 357 | if (isLoon || isSurge) $persistentStore.write(data, this.name); 358 | if (isNode) { 359 | this.node.fs.writeFileSync( 360 | `${this.name}.json`, 361 | data, 362 | { 363 | flag: "w", 364 | }, 365 | (err) => console.log(err) 366 | ); 367 | this.node.fs.writeFileSync( 368 | "root.json", 369 | JSON.stringify(this.root, null, 2), 370 | { 371 | flag: "w", 372 | }, 373 | (err) => console.log(err) 374 | ); 375 | } 376 | } 377 | 378 | write(data, key) { 379 | this.log(`SET ${key}`); 380 | if (key.indexOf("#") !== -1) { 381 | key = key.substr(1); 382 | if (isSurge || isLoon) { 383 | return $persistentStore.write(data, key); 384 | } 385 | if (isQX) { 386 | return $prefs.setValueForKey(data, key); 387 | } 388 | if (isNode) { 389 | this.root[key] = data; 390 | } 391 | } else { 392 | this.cache[key] = data; 393 | } 394 | this.persistCache(); 395 | } 396 | 397 | read(key) { 398 | this.log(`READ ${key}`); 399 | if (key.indexOf("#") !== -1) { 400 | key = key.substr(1); 401 | if (isSurge || isLoon) { 402 | return $persistentStore.read(key); 403 | } 404 | if (isQX) { 405 | return $prefs.valueForKey(key); 406 | } 407 | if (isNode) { 408 | return this.root[key]; 409 | } 410 | } else { 411 | return this.cache[key]; 412 | } 413 | } 414 | 415 | delete(key) { 416 | this.log(`DELETE ${key}`); 417 | if (key.indexOf("#") !== -1) { 418 | key = key.substr(1); 419 | if (isSurge || isLoon) { 420 | return $persistentStore.write(null, key); 421 | } 422 | if (isQX) { 423 | return $prefs.removeValueForKey(key); 424 | } 425 | if (isNode) { 426 | delete this.root[key]; 427 | } 428 | } else { 429 | delete this.cache[key]; 430 | } 431 | this.persistCache(); 432 | } 433 | 434 | // notification 435 | notify(title, subtitle = "", content = "", options = {}) { 436 | const openURL = options["open-url"]; 437 | const mediaURL = options["media-url"]; 438 | 439 | if (isQX) $notify(title, subtitle, content, options); 440 | if (isSurge) { 441 | $notification.post( 442 | title, 443 | subtitle, 444 | content + `${mediaURL ? "\n多媒体:" + mediaURL : ""}`, 445 | { 446 | url: openURL, 447 | } 448 | ); 449 | } 450 | if (isLoon) { 451 | let opts = {}; 452 | if (openURL) opts["openUrl"] = openURL; 453 | if (mediaURL) opts["mediaUrl"] = mediaURL; 454 | if (JSON.stringify(opts) === "{}") { 455 | $notification.post(title, subtitle, content); 456 | } else { 457 | $notification.post(title, subtitle, content, opts); 458 | } 459 | } 460 | if (isNode || isScriptable) { 461 | const content_ = 462 | content + 463 | (openURL ? `\n点击跳转: ${openURL}` : "") + 464 | (mediaURL ? `\n多媒体: ${mediaURL}` : ""); 465 | if (isJSBox) { 466 | const push = require("push"); 467 | push.schedule({ 468 | title: title, 469 | body: (subtitle ? subtitle + "\n" : "") + content_, 470 | }); 471 | } else { 472 | console.log(`${title}\n${subtitle}\n${content_}\n\n`); 473 | } 474 | } 475 | } 476 | 477 | // other helper functions 478 | log(msg) { 479 | if (this.debug) console.log(`[${this.name}] LOG: ${this.stringify(msg)}`); 480 | } 481 | 482 | info(msg) { 483 | console.log(`[${this.name}] INFO: ${this.stringify(msg)}`); 484 | } 485 | 486 | error(msg) { 487 | console.log(`[${this.name}] ERROR: ${this.stringify(msg)}`); 488 | } 489 | 490 | wait(millisec) { 491 | return new Promise((resolve) => setTimeout(resolve, millisec)); 492 | } 493 | 494 | done(value = {}) { 495 | if (isQX || isLoon || isSurge) { 496 | $done(value); 497 | } else if (isNode && !isJSBox) { 498 | if (typeof $context !== "undefined") { 499 | $context.headers = value.headers; 500 | $context.statusCode = value.statusCode; 501 | $context.body = value.body; 502 | } 503 | } 504 | } 505 | 506 | stringify(obj_or_str) { 507 | if (typeof obj_or_str === "string" || obj_or_str instanceof String) 508 | return obj_or_str; 509 | else 510 | try { 511 | return JSON.stringify(obj_or_str, null, 2); 512 | } catch (err) { 513 | return "[object Object]"; 514 | } 515 | } 516 | })(name, debug); 517 | } 518 | -------------------------------------------------------------------------------- /check_in/wechatsubs/wechatsubs.js: -------------------------------------------------------------------------------- 1 | /* 2 | 【公众号监控】@evilbutcher 3 | 4 | 【仓库地址】https://github.com/evilbutcher/QuantumultX/tree/master(欢迎star🌟) 5 | 6 | 【BoxJs】https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/evilbutcher.boxjs.json 7 | 8 | 【致谢】 9 | 感谢Peng-YM的OpenAPI.js! 10 | 11 | ⚠️【免责声明】 12 | ------------------------------------------ 13 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 14 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 15 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 16 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 17 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 18 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 19 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 20 | 21 | 22 | 【使用说明】 23 | 脚本或BoxJs填入要监控的关键词即可,以中文逗号“,”分隔。 24 | 25 | 【Surge】 26 | ----------------- 27 | [Script] 28 | 公众号监控 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/wechatsubs.js 29 | 30 | 【Loon】 31 | ----------------- 32 | [Script] 33 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/wechatsubs.js, tag=公众号监控 34 | 35 | 【Quantumult X】 36 | ----------------- 37 | [task_local] 38 | 5 0 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/wechatsubs.js, tag=公众号监控 39 | 40 | 【Icon】 41 | 透明:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/wechat_tran.png 42 | 彩色:https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/wechat.png 43 | */ 44 | 45 | const $ = new API("Wechatsubs", true); 46 | const ERR = MYERR(); 47 | 48 | var keyword1 = [""]; //👈本地关键词在这里设置。 49 | var keyword2 = [""]; 50 | $.refreshtime = 6; //重复内容默认在6小时内不再通知,之后清空,可自行修改 51 | $.saveditem = []; 52 | 53 | !(async () => { 54 | init(); 55 | await checkall(keyword1, keyword2); 56 | })() 57 | .catch((err) => { 58 | if (err instanceof ERR.ParseError) { 59 | $.notify("公众号监控", "❌ 解析数据出现错误", err.message); 60 | } else { 61 | $.notify( 62 | "公众号监控", 63 | "❌ 出现错误", 64 | JSON.stringify(err, Object.getOwnPropertyNames(err)) 65 | ); 66 | } 67 | }) 68 | .finally(() => $.done()); 69 | 70 | async function checkall(group1, group2) { 71 | for (var i = 0; i < group1.length; i++) { 72 | for (var j = 0; j < group2.length; j++) { 73 | await check(group1[i], group2[j], $.saveditem); 74 | } 75 | } 76 | $.write(JSON.stringify($.saveditem), "wechatsaveditem"); 77 | } 78 | 79 | function check(word1, word2, saveditem) { 80 | const url = `https://wx.sogou.com/weixin?type=2&query=${encodeURIComponent( 81 | word1 82 | )}+${encodeURIComponent(word2)}`; 83 | const headers = { 84 | Accept: `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`, 85 | Connection: `keep-alive`, 86 | Referer: `https://wx.sogou.com/`, 87 | "Accept-Encoding": `gzip, deflate, br`, 88 | Host: `wx.sogou.com`, 89 | "User-Agent": `Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1`, 90 | "Accept-Language": `zh-cn`, 91 | }; 92 | const myRequest = { 93 | url: url, 94 | headers: headers, 95 | }; 96 | $.log(myRequest); 97 | return $.http.get(myRequest).then((response) => { 98 | if (response.statusCode == 200) { 99 | var geturl = /a\starget\=\\\"\_blank\\\"\shref\=\\\"\/.*?\\\"/; 100 | var gettitle = /article\_title\_0\\\"\>.*?\<\/a/; 101 | var getdescription = /summary\_0\\\"\>.*?\<\/p/; 102 | $.data = JSON.stringify(response.body); 103 | var pretitle = $.data.match(gettitle); 104 | var preurl = $.data.match(geturl); 105 | var predescription = $.data.match(getdescription); 106 | var title = JSON.stringify(pretitle) 107 | .replace(new RegExp(/\\n/, "gm"), "") 108 | .replace(new RegExp(/\s/, "gm"), "") 109 | .replace(new RegExp(/\<.*?\>/, "gm"), "") 110 | .replace(new RegExp(/“/, "gm"), "“") 111 | .replace(new RegExp(/”/, "gm"), "”") 112 | .replace(new RegExp(/·/, "gm"), "·") 113 | .replace(new RegExp(/•/, "gm"), "•") 114 | .replace(new RegExp(/—/, "gm"), "—") 115 | .replace(new RegExp(/…/, "gm"), "…") 116 | .slice(22, -5); 117 | var description = JSON.stringify(predescription) 118 | .replace(new RegExp(/\\n/, "gm"), "") 119 | .replace(new RegExp(/\s/, "gm"), "") 120 | .replace(new RegExp(/\<.*?\>/, "gm"), "") 121 | .replace(new RegExp(/“/, "gm"), "“") 122 | .replace(new RegExp(/”/, "gm"), "”") 123 | .replace(new RegExp(/·/, "gm"), "·") 124 | .replace(new RegExp(/•/, "gm"), "•") 125 | .replace(new RegExp(/—/, "gm"), "—") 126 | .replace(new RegExp(/…/, "gm"), "…") 127 | .slice(16, -5); 128 | var url = 129 | "https://wx.sogou.com/" + 130 | JSON.stringify(preurl) 131 | .slice(36, -6) 132 | .replace(new RegExp(/\s/, "gm"), ""); 133 | $.info(title); 134 | $.log(description); 135 | $.log(url); 136 | if (saveditem.indexOf(title) == -1) { 137 | $.notify("公众号监控", title, description, { "open-url": url }); 138 | saveditem.push(title); 139 | } 140 | } else { 141 | $.error(JSON.stringify(response)); 142 | $.notify("公众号监控", "", "❌ 未知错误,请查看日志"); 143 | } 144 | }); 145 | } 146 | 147 | function init() { 148 | if ($.read("wechatkeyword1") != "" && $.read("wechatkeyword1") != undefined) { 149 | keyword1 = $.read("wechatkeyword1").split(","); 150 | } 151 | if ($.read("wechatkeyword2") != "" && $.read("wechatkeyword2") != undefined) { 152 | keyword2 = $.read("wechatkeyword2").split(","); 153 | } 154 | $.nowtime = new Date().getTime(); 155 | if ( 156 | $.read("wechatsavedtime") != undefined && 157 | $.read("wechatsavedtime") != "" 158 | ) { 159 | $.savedtime = $.read("wechatsavedtime"); //读取保存时间 160 | } else { 161 | $.savedtime = new Date().getTime(); //保存时间为空时,保存时间=当前时间 162 | $.write(JSON.stringify($.nowtime), "wechatsavedtime"); //写入时间记录 163 | $.write("[]", "wechatsaveditem"); //写入本地记录 164 | } 165 | $.refreshtime = $.read("wechatrefreshtime") || $.refreshtime; 166 | var minus = $.nowtime - $.savedtime; //判断时间 167 | if (minus > $.refreshtime * 3600000) { 168 | $.info("达到设定时间清空本地记录并更新时间"); 169 | $.write(JSON.stringify($.nowtime), "wechatsavedtime"); 170 | $.write("[]", "wechatsaveditem"); 171 | } 172 | if ( 173 | $.read("wechatsaveditem") != undefined && 174 | $.read("wechatsaveditem") != "" 175 | ) { 176 | var storeitem = JSON.parse($.read("wechatsaveditem")); 177 | } else { 178 | storeitem = []; 179 | } 180 | for (var i = 0; i < storeitem.length; i++) { 181 | $.saveditem.push(storeitem[i]); 182 | } 183 | $.info(`关键词:${keyword1}和${keyword2}`); 184 | if ($.saveditem.length != 0) { 185 | $.info("\n刷新时间内不再通知的内容👇\n" + $.saveditem + "\n"); 186 | } 187 | } 188 | 189 | function MYERR() { 190 | class ParseError extends Error { 191 | constructor(message) { 192 | super(message); 193 | this.name = "ParseError"; 194 | } 195 | } 196 | return { 197 | ParseError, 198 | }; 199 | } 200 | 201 | /** 202 | * OpenAPI 203 | * @author: Peng-YM 204 | * https://github.com/Peng-YM/QuanX/blob/master/Tools/OpenAPI/README.md 205 | */ 206 | function ENV() { 207 | const isQX = typeof $task !== "undefined"; 208 | const isLoon = typeof $loon !== "undefined"; 209 | const isSurge = typeof $httpClient !== "undefined" && !isLoon; 210 | const isJSBox = typeof require == "function" && typeof $jsbox != "undefined"; 211 | const isNode = typeof require == "function" && !isJSBox; 212 | const isRequest = typeof $request !== "undefined"; 213 | const isScriptable = typeof importModule !== "undefined"; 214 | return { 215 | isQX, 216 | isLoon, 217 | isSurge, 218 | isNode, 219 | isJSBox, 220 | isRequest, 221 | isScriptable, 222 | }; 223 | } 224 | 225 | function HTTP( 226 | defaultOptions = { 227 | baseURL: "", 228 | } 229 | ) { 230 | const { isQX, isLoon, isSurge, isScriptable, isNode } = ENV(); 231 | const methods = ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"]; 232 | const URL_REGEX = 233 | /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/; 234 | 235 | function send(method, options) { 236 | options = 237 | typeof options === "string" 238 | ? { 239 | url: options, 240 | } 241 | : options; 242 | const baseURL = defaultOptions.baseURL; 243 | if (baseURL && !URL_REGEX.test(options.url || "")) { 244 | options.url = baseURL ? baseURL + options.url : options.url; 245 | } 246 | options = { 247 | ...defaultOptions, 248 | ...options, 249 | }; 250 | const timeout = options.timeout; 251 | const events = { 252 | ...{ 253 | onRequest: () => {}, 254 | onResponse: (resp) => resp, 255 | onTimeout: () => {}, 256 | }, 257 | ...options.events, 258 | }; 259 | 260 | events.onRequest(method, options); 261 | 262 | let worker; 263 | if (isQX) { 264 | worker = $task.fetch({ 265 | method, 266 | ...options, 267 | }); 268 | } else if (isLoon || isSurge || isNode) { 269 | worker = new Promise((resolve, reject) => { 270 | const request = isNode ? require("request") : $httpClient; 271 | request[method.toLowerCase()](options, (err, response, body) => { 272 | if (err) reject(err); 273 | else 274 | resolve({ 275 | statusCode: response.status || response.statusCode, 276 | headers: response.headers, 277 | body, 278 | }); 279 | }); 280 | }); 281 | } else if (isScriptable) { 282 | const request = new Request(options.url); 283 | request.method = method; 284 | request.headers = options.headers; 285 | request.body = options.body; 286 | worker = new Promise((resolve, reject) => { 287 | request 288 | .loadString() 289 | .then((body) => { 290 | resolve({ 291 | statusCode: request.response.statusCode, 292 | headers: request.response.headers, 293 | body, 294 | }); 295 | }) 296 | .catch((err) => reject(err)); 297 | }); 298 | } 299 | 300 | let timeoutid; 301 | const timer = timeout 302 | ? new Promise((_, reject) => { 303 | timeoutid = setTimeout(() => { 304 | events.onTimeout(); 305 | return reject( 306 | `${method} URL: ${options.url} exceeds the timeout ${timeout} ms` 307 | ); 308 | }, timeout); 309 | }) 310 | : null; 311 | 312 | return ( 313 | timer 314 | ? Promise.race([timer, worker]).then((res) => { 315 | clearTimeout(timeoutid); 316 | return res; 317 | }) 318 | : worker 319 | ).then((resp) => events.onResponse(resp)); 320 | } 321 | 322 | const http = {}; 323 | methods.forEach( 324 | (method) => 325 | (http[method.toLowerCase()] = (options) => send(method, options)) 326 | ); 327 | return http; 328 | } 329 | 330 | function API(name = "untitled", debug = false) { 331 | const { isQX, isLoon, isSurge, isNode, isJSBox, isScriptable } = ENV(); 332 | return new (class { 333 | constructor(name, debug) { 334 | this.name = name; 335 | this.debug = debug; 336 | 337 | this.http = HTTP(); 338 | this.env = ENV(); 339 | 340 | this.node = (() => { 341 | if (isNode) { 342 | const fs = require("fs"); 343 | 344 | return { 345 | fs, 346 | }; 347 | } else { 348 | return null; 349 | } 350 | })(); 351 | this.initCache(); 352 | 353 | const delay = (t, v) => 354 | new Promise(function (resolve) { 355 | setTimeout(resolve.bind(null, v), t); 356 | }); 357 | 358 | Promise.prototype.delay = function (t) { 359 | return this.then(function (v) { 360 | return delay(t, v); 361 | }); 362 | }; 363 | } 364 | 365 | // persistence 366 | // initialize cache 367 | initCache() { 368 | if (isQX) this.cache = JSON.parse($prefs.valueForKey(this.name) || "{}"); 369 | if (isLoon || isSurge) 370 | this.cache = JSON.parse($persistentStore.read(this.name) || "{}"); 371 | 372 | if (isNode) { 373 | // create a json for root cache 374 | let fpath = "root.json"; 375 | if (!this.node.fs.existsSync(fpath)) { 376 | this.node.fs.writeFileSync( 377 | fpath, 378 | JSON.stringify({}), 379 | { 380 | flag: "wx", 381 | }, 382 | (err) => console.log(err) 383 | ); 384 | } 385 | this.root = {}; 386 | 387 | // create a json file with the given name if not exists 388 | fpath = `${this.name}.json`; 389 | if (!this.node.fs.existsSync(fpath)) { 390 | this.node.fs.writeFileSync( 391 | fpath, 392 | JSON.stringify({}), 393 | { 394 | flag: "wx", 395 | }, 396 | (err) => console.log(err) 397 | ); 398 | this.cache = {}; 399 | } else { 400 | this.cache = JSON.parse( 401 | this.node.fs.readFileSync(`${this.name}.json`) 402 | ); 403 | } 404 | } 405 | } 406 | 407 | // store cache 408 | persistCache() { 409 | const data = JSON.stringify(this.cache, null, 2); 410 | if (isQX) $prefs.setValueForKey(data, this.name); 411 | if (isLoon || isSurge) $persistentStore.write(data, this.name); 412 | if (isNode) { 413 | this.node.fs.writeFileSync( 414 | `${this.name}.json`, 415 | data, 416 | { 417 | flag: "w", 418 | }, 419 | (err) => console.log(err) 420 | ); 421 | this.node.fs.writeFileSync( 422 | "root.json", 423 | JSON.stringify(this.root, null, 2), 424 | { 425 | flag: "w", 426 | }, 427 | (err) => console.log(err) 428 | ); 429 | } 430 | } 431 | 432 | write(data, key) { 433 | this.log(`SET ${key}`); 434 | if (key.indexOf("#") !== -1) { 435 | key = key.substr(1); 436 | if (isSurge || isLoon) { 437 | return $persistentStore.write(data, key); 438 | } 439 | if (isQX) { 440 | return $prefs.setValueForKey(data, key); 441 | } 442 | if (isNode) { 443 | this.root[key] = data; 444 | } 445 | } else { 446 | this.cache[key] = data; 447 | } 448 | this.persistCache(); 449 | } 450 | 451 | read(key) { 452 | this.log(`READ ${key}`); 453 | if (key.indexOf("#") !== -1) { 454 | key = key.substr(1); 455 | if (isSurge || isLoon) { 456 | return $persistentStore.read(key); 457 | } 458 | if (isQX) { 459 | return $prefs.valueForKey(key); 460 | } 461 | if (isNode) { 462 | return this.root[key]; 463 | } 464 | } else { 465 | return this.cache[key]; 466 | } 467 | } 468 | 469 | delete(key) { 470 | this.log(`DELETE ${key}`); 471 | if (key.indexOf("#") !== -1) { 472 | key = key.substr(1); 473 | if (isSurge || isLoon) { 474 | return $persistentStore.write(null, key); 475 | } 476 | if (isQX) { 477 | return $prefs.removeValueForKey(key); 478 | } 479 | if (isNode) { 480 | delete this.root[key]; 481 | } 482 | } else { 483 | delete this.cache[key]; 484 | } 485 | this.persistCache(); 486 | } 487 | 488 | // notification 489 | notify(title, subtitle = "", content = "", options = {}) { 490 | const openURL = options["open-url"]; 491 | const mediaURL = options["media-url"]; 492 | 493 | if (isQX) $notify(title, subtitle, content, options); 494 | if (isSurge) { 495 | $notification.post( 496 | title, 497 | subtitle, 498 | content + `${mediaURL ? "\n多媒体:" + mediaURL : ""}`, 499 | { 500 | url: openURL, 501 | } 502 | ); 503 | } 504 | if (isLoon) { 505 | let opts = {}; 506 | if (openURL) opts["openUrl"] = openURL; 507 | if (mediaURL) opts["mediaUrl"] = mediaURL; 508 | if (JSON.stringify(opts) === "{}") { 509 | $notification.post(title, subtitle, content); 510 | } else { 511 | $notification.post(title, subtitle, content, opts); 512 | } 513 | } 514 | if (isNode || isScriptable) { 515 | const content_ = 516 | content + 517 | (openURL ? `\n点击跳转: ${openURL}` : "") + 518 | (mediaURL ? `\n多媒体: ${mediaURL}` : ""); 519 | if (isJSBox) { 520 | const push = require("push"); 521 | push.schedule({ 522 | title: title, 523 | body: (subtitle ? subtitle + "\n" : "") + content_, 524 | }); 525 | } else { 526 | console.log(`${title}\n${subtitle}\n${content_}\n\n`); 527 | } 528 | } 529 | } 530 | 531 | // other helper functions 532 | log(msg) { 533 | if (this.debug) console.log(`[${this.name}] LOG: ${this.stringify(msg)}`); 534 | } 535 | 536 | info(msg) { 537 | console.log(`[${this.name}] INFO: ${this.stringify(msg)}`); 538 | } 539 | 540 | error(msg) { 541 | console.log(`[${this.name}] ERROR: ${this.stringify(msg)}`); 542 | } 543 | 544 | wait(millisec) { 545 | return new Promise((resolve) => setTimeout(resolve, millisec)); 546 | } 547 | 548 | done(value = {}) { 549 | if (isQX || isLoon || isSurge) { 550 | $done(value); 551 | } else if (isNode && !isJSBox) { 552 | if (typeof $context !== "undefined") { 553 | $context.headers = value.headers; 554 | $context.statusCode = value.statusCode; 555 | $context.body = value.body; 556 | } 557 | } 558 | } 559 | 560 | stringify(obj_or_str) { 561 | if (typeof obj_or_str === "string" || obj_or_str instanceof String) 562 | return obj_or_str; 563 | else 564 | try { 565 | return JSON.stringify(obj_or_str, null, 2); 566 | } catch (err) { 567 | return "[object Object]"; 568 | } 569 | } 570 | })(name, debug); 571 | } 572 | -------------------------------------------------------------------------------- /check_in/weibo/获取Cookie指南.MOV: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/check_in/weibo/获取Cookie指南.MOV -------------------------------------------------------------------------------- /picture/10th.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/10th.png -------------------------------------------------------------------------------- /picture/11th.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/11th.png -------------------------------------------------------------------------------- /picture/13th.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/13th.png -------------------------------------------------------------------------------- /picture/alyp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/alyp.png -------------------------------------------------------------------------------- /picture/bill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/bill.png -------------------------------------------------------------------------------- /picture/bill_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/bill_tran.png -------------------------------------------------------------------------------- /picture/doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/doc.png -------------------------------------------------------------------------------- /picture/funko.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/funko.png -------------------------------------------------------------------------------- /picture/funko_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/funko_tran.png -------------------------------------------------------------------------------- /picture/gjb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/gjb.png -------------------------------------------------------------------------------- /picture/gjb_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/gjb_tran.png -------------------------------------------------------------------------------- /picture/gxrcw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/gxrcw.png -------------------------------------------------------------------------------- /picture/gxrcw_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/gxrcw_tran.png -------------------------------------------------------------------------------- /picture/hzh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/hzh.png -------------------------------------------------------------------------------- /picture/hzh_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/hzh_tran.png -------------------------------------------------------------------------------- /picture/idaily.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/idaily.png -------------------------------------------------------------------------------- /picture/idaily_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/idaily_tran.png -------------------------------------------------------------------------------- /picture/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/img.png -------------------------------------------------------------------------------- /picture/jiumu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/jiumu.png -------------------------------------------------------------------------------- /picture/jiumu_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/jiumu_tran.png -------------------------------------------------------------------------------- /picture/klcw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/klcw.png -------------------------------------------------------------------------------- /picture/klcw_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/klcw_tran.png -------------------------------------------------------------------------------- /picture/mindstyle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/mindstyle.png -------------------------------------------------------------------------------- /picture/mindstyle_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/mindstyle_tran.png -------------------------------------------------------------------------------- /picture/nasa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/nasa.png -------------------------------------------------------------------------------- /picture/nasa_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/nasa_tran.png -------------------------------------------------------------------------------- /picture/photo.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/photo.jpeg -------------------------------------------------------------------------------- /picture/ssq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/ssq.png -------------------------------------------------------------------------------- /picture/ssq_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/ssq_tran.png -------------------------------------------------------------------------------- /picture/sydw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/sydw.png -------------------------------------------------------------------------------- /picture/sydw_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/sydw_tran.png -------------------------------------------------------------------------------- /picture/tb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/tb.png -------------------------------------------------------------------------------- /picture/tb_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/tb_tran.png -------------------------------------------------------------------------------- /picture/timepop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/timepop.png -------------------------------------------------------------------------------- /picture/timepop_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/timepop_tran.png -------------------------------------------------------------------------------- /picture/wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/wechat.png -------------------------------------------------------------------------------- /picture/wechat_tran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/wechat_tran.png -------------------------------------------------------------------------------- /picture/zouswu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evilbutcher/QuantumultX/402960c4b70ba29566e215a9a9a54a022cfbe2b8/picture/zouswu.png -------------------------------------------------------------------------------- /profiles/Loon/Loon.scripts.conf: -------------------------------------------------------------------------------- 1 | # evilbutcher 脚本集合 2 | 3 | hostname = h5.youzan.com, glados.rocks, api.weibo.cn, mapi.weibo.com, wxavip-up.ezrpro.cn, wxavip-tp.ezrpro.cn, app.klcw.net.cn, hweb-mbf.huazhu.com, h5api.m.taobao.com 4 | 5 | 6 | http-request ^https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkin\.json\?checkin\_id\=.*?app\_id\=wx9b5caf9d1669dc96, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js, tag=Funboat获取签到Cookie 7 | http-request ^https:\/\/h5\.youzan\.com\/wscuser\/membercenter\/stats\.json\?app\_id\=wx9b5caf9d1669dc96, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js, tag=Funboat获取积分Cookie 8 | ^https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkin\.json\?checkin\_id\=.*?app\_id\=wx4a1af22a88a99386, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/timepop/timepop.js, tag=Timepop获取签到Cookie 9 | ^https:\/\/h5\.youzan\.com\/wscuser\/membercenter\/stats\.json\?app\_id\=wx4a1af22a88a99386, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/timepop/timepop.js, tag=Timepop获取积分Cookie 10 | http-request https:\/\/glados\.rocks\/api\/user\/checkin, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js, tag=GLaDOS获取Cookie 11 | http-request ^https?://m?api\.weibo\.c(n|om)\/2\/(cardlist|page\/button|page) script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.cookie.js,requires-body=false, tag=微博超话获取Cookie 12 | http-request https:\/\/wxavip\-up\.ezrpro\.cn\/Vip\/SignIn\/SignIn tag=九木杂物社获取Cookie, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js, requires-body=true 13 | http-request https:\/\/wxavip\-tp\.ezrpro\.cn\/Vip\/SignIn\/SignIn tag=酷乐潮玩小程序获取签到Cookie, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw.js, requires-body=true 14 | http-request https:\/\/app\.klcw\.net\.cn\/omp\_cmanage\/mallgateway tag=酷乐潮玩App获取Cookie, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js, requires-body=true 15 | http-request https:\/\/hweb-mbf\.huazhu\.com\/api\/signIn tag=华住会获取签到Cookie, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hzh/hzh.js, requires-body=false 16 | http-request https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdetail tag=淘宝监控获取Cookie, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb-name.js, requires-body=false 17 | http-request https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdesc tag=淘宝监控获取Cookie, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb.js, requires-body=false 18 | 19 | cron "0 6 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/nasa/nasapic.js, tag=NASA每日一图 20 | cron "0 6 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/idaily/idaily.js, tag=iDaily每日环球视野 21 | cron "30 7-22 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/appstore/AppMonitor.js, tag=App价格监控 22 | cron "30 0 8-22/2 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hotsearch/hot.js, tag=热门监控 23 | cron "45 3 8 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.js, tag=微博超话 24 | cron "25 4 8 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js, tag=GLaDOS签到 25 | cron "45 4 8 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/checkin_env.js, tag=机场签到 26 | cron "0 5 8 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/checkincookie_env.js, tag=机场签到Cookie版 27 | cron "0 4 8 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js, tag=Funboat签到 28 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/timepop/timepop.js, tag=Timepop签到 29 | cron "25 4 8 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js, tag=九木杂物社 30 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw.js, tag=酷乐潮玩小程序 31 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js, tag=酷乐潮玩App 32 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/wechatsubs.js, tag=公众号监控 33 | cron "5 * * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/sydwzp.js, tag=事业单位招聘监控 34 | cron "5 * * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/gxrcw.js, tag=高校人才网招聘监控 35 | cron "0 30 21 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/ssq/ssq.js, tag=彩票监控 36 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hzh/hzh.js, tag=华住会 37 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hzh/taobao/tb-name.js, tag=淘宝监控-标题版 38 | cron "5 0 * * *" script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hzh/taobao/tb.js, tag=淘宝监控 -------------------------------------------------------------------------------- /profiles/QuantumultX/QuantumultX.rewrite.conf: -------------------------------------------------------------------------------- 1 | # @evilbutcher 脚本集合 2 | 3 | hostname = h5.youzan.com, glados.rocks, api.weibo.cn, api.weibo.com, mapi.weibo.com, 10086.online-cmcc.cn, 121.43.19.216, sapi.beingfine.cn, mobilebj.cn, api.gotokeep.com, wxavip-up.ezrpro.cn, wxavip-tp.ezrpro.cn, app.klcw.net.cn, hweb-mbf.huazhu.com, h5api.m.taobao.com 4 | 5 | #淘宝监控获取Cookie 6 | https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdesc url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb.js 7 | https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdetail url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb-name.js 8 | 9 | #Timepop获取Cookie 10 | ^https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkin\.json\?checkin\_id\=.*?app\_id\=wx4a1af22a88a99386 url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/timepop/timepop.js 11 | ^https:\/\/h5\.youzan\.com\/wscuser\/membercenter\/stats\.json\?app\_id\=wx4a1af22a88a99386 url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/timepop/timepop.js 12 | 13 | #华住会获取签到Cookie 14 | https:\/\/hweb-mbf\.huazhu\.com\/api\/signIn url script-request-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hzh/hzh.js 15 | 16 | #酷乐潮玩小程序获取签到Cookie 17 | https:\/\/wxavip\-tp\.ezrpro\.cn\/Vip\/SignIn\/SignIn url script-request-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw.js 18 | #酷乐潮玩App获取Cookie 19 | https:\/\/app\.klcw\.net\.cn\/omp\_cmanage\/mallgateway url script-request-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js 20 | 21 | #九木杂物社获取Cookie 22 | https:\/\/wxavip\-up\.ezrpro\.cn\/Vip\/SignIn\/SignIn url script-request-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js 23 | 24 | #Funboat获取Cookie 25 | ^https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkin\.json\?checkin\_id\=.*?app\_id\=wx9b5caf9d1669dc96 url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js 26 | ^https:\/\/h5\.youzan\.com\/wscuser\/membercenter\/stats\.json\?app\_id\=wx9b5caf9d1669dc96 url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js 27 | 28 | #GLaDOS获取Cookie 29 | https:\/\/glados\.rocks\/api\/user\/checkin url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js 30 | 31 | #微博超话获取Cookie 32 | ^https?://m?api\.weibo\.c(n|om)\/2\/(cardlist|page\/button|page) url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.cookie.js 33 | 34 | #10086去开屏广告 35 | https:\/\/10086\.online\-cmcc\.cn\:20010\/gfms\/front\/hn\/busi3\!getAdvert url script-response-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/remove_ad/10086.js 36 | 37 | #不背单词解锁 38 | ^https:\/\/sapi\.beingfine\.cn\/v3\/report\/launch\/ url script-response-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/remove_ad/bbdc.js 39 | 40 | #北京移动去开屏广告 41 | https:\/\/mobilebj\.cn\/app\/appBasicInfo? url script-response-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/remove_ad/bjyd.js 42 | 43 | #微博去广告 44 | https:\/\/api\.weibo\.com\/oauth2\/getaid url reject 45 | 46 | #keep去开屏广告 47 | https:\/\/api\.gotokeep\.com\/ads\/v1\/ads\?spotIds url reject 48 | -------------------------------------------------------------------------------- /profiles/QuantumultX/QuantumultX.task.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@evilbutcher 脚本集合", 3 | "description": "Quantumult X Task Galllery by evilbutcher", 4 | "task": [ 5 | "0 0 6 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/nasa/nasapic.js, tag=NASA每日一图, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/nasa.png, enabled=true", 6 | "0 0 6 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/idaily/idaily.js, tag=iDaily每日环球视野, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/idaily.png, enabled=true", 7 | "30 7-22 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/appstore/AppMonitor.js, tag=App价格监控, img-url=https://raw.githubusercontent.com/Orz-3/mini/master/Color/appstore.png, enabled=true", 8 | "30 0 8-22/2 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hotsearch/hot.js, tag=热门监控, img-url=https://raw.githubusercontent.com/58xinian/icon/master/hot.png, enabled=true", 9 | { 10 | "config": "45 3 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.js, tag=微博超话, img-url=https://raw.githubusercontent.com/Orz-3/mini/master/Color/weibo.png, enabled=true", 11 | "addons": "https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/profiles/QuantumultX/addons/weibo.conf, tag = 微博超话获取Cookie" 12 | }, 13 | { 14 | "config": "25 4 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js, tag=GLaDOS, img-url=https://raw.githubusercontent.com/58xinian/icon/master/glados1.png, enabled=true", 15 | "addons": "https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/profiles/QuantumultX/addons/glados.conf, tag = GLaDOS获取Cookie" 16 | }, 17 | "45 4 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/checkin_env.js, tag=机场签到, img-url=https://raw.githubusercontent.com/Orz-3/mini/master/Color/airport.png, enabled=true", 18 | "0 5 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master//check_in/glados/checkincookie_env.js, tag=机场签到Cookie版, img-url=https://raw.githubusercontent.com/58xinian/icon/master/glados.png, enabled=true", 19 | { 20 | "config": "0 4 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js, tag=Funboat, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/funko.png, enabled=true", 21 | "addons": "https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/profiles/QuantumultX/addons/funboat.conf, tag = Funboat获取Cookie" 22 | }, 23 | { 24 | "config": "0 4 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/timepop/timepop.js, tag=Timepop, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/timepop.png, enabled=true", 25 | "addons": "https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/profiles/QuantumultX/addons/timepop.conf, tag = Timepop获取Cookie" 26 | }, 27 | { 28 | "config": "25 4 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js, tag=九木杂物社, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/jiumu.png, enabled=true", 29 | "addons": "https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/profiles/QuantumultX/addons/jiumu.conf, tag = 九木杂物社获取Cookie" 30 | }, 31 | { 32 | "config": "30 4 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw.js, tag=酷乐潮玩小程序, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/klcw.png", 33 | "addons": "https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/profiles/QuantumultX/addons/klcw.conf, tag = 酷乐潮玩小程序获取Cookie" 34 | }, 35 | { 36 | "config": "5 0 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js, tag=酷乐潮玩App, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/klcw.png", 37 | "addons": "https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/profiles/QuantumultX/addons/klcw-app.conf, tag = 酷乐潮玩App获取Cookie" 38 | }, 39 | "0 5 8 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/wechatsubs.js, tag=公众号监控, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/wechat.png", 40 | "0 5 * * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/sydwzp.js, tag=事业单位招聘监控, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/sydw.png", 41 | "0 5 * * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/gxrcw.js, tag=高校人才网招聘监控, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/gxrcw.png", 42 | "0 30 21 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/ssq/ssq.js, tag=彩票监控, img-url=https://raw.githubusercontent.com/58xinian/icon/master/Two_color_ball.png", 43 | { 44 | "config": "5 0 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hzh/hzh.js, tag=华住会, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/hzh.png", 45 | "addons": "https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/profiles/QuantumultX/addons/hzh.conf, tag = 华住会获取签到Cookie" 46 | }, 47 | { 48 | "config": "5 0 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb-name.js, tag=淘宝监控-标题版, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/tb.png", 49 | "addons": "https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/profiles/QuantumultX/addons/taobao.conf, tag = 淘宝监控获取Cookie" 50 | }, 51 | { 52 | "config": "5 0 * * * https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb.js, tag=淘宝监控, img-url=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/picture/tb.png", 53 | "addons": "https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/profiles/QuantumultX/addons/taobao.conf, tag = 淘宝监控获取Cookie" 54 | } 55 | ] 56 | } 57 | -------------------------------------------------------------------------------- /profiles/QuantumultX/addons/funboat.conf: -------------------------------------------------------------------------------- 1 | # Funboat获取Cookie 2 | hostname = h5.youzan.com 3 | ^https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkin\.json\?checkin\_id\=.*?app\_id\=wx9b5caf9d1669dc96 url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js 4 | ^https:\/\/h5\.youzan\.com\/wscuser\/membercenter\/stats\.json\?app\_id\=wx9b5caf9d1669dc96 url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js -------------------------------------------------------------------------------- /profiles/QuantumultX/addons/glados.conf: -------------------------------------------------------------------------------- 1 | # GLaDOS获取Cookie 2 | hostname = glados.rocks 3 | https:\/\/glados\.rocks\/api\/user\/checkin url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js -------------------------------------------------------------------------------- /profiles/QuantumultX/addons/hzh.conf: -------------------------------------------------------------------------------- 1 | hostname = hweb-mbf.huazhu.com 2 | https:\/\/hweb-mbf\.huazhu\.com\/api\/signIn url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hzh/hzh.js -------------------------------------------------------------------------------- /profiles/QuantumultX/addons/jiumu.conf: -------------------------------------------------------------------------------- 1 | # 九木杂物社获取Cookie 2 | hostname = wxavip-up.ezrpro.cn 3 | https:\/\/wxavip\-up\.ezrpro\.cn\/Vip\/SignIn\/SignIn url script-request-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js -------------------------------------------------------------------------------- /profiles/QuantumultX/addons/klcw-app.conf: -------------------------------------------------------------------------------- 1 | # 酷乐潮玩App获取Cookie 2 | hostname = app.klcw.net.cn 3 | https:\/\/app\.klcw\.net\.cn\/omp\_cmanage\/mallgateway url script-request-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js -------------------------------------------------------------------------------- /profiles/QuantumultX/addons/klcw.conf: -------------------------------------------------------------------------------- 1 | # 酷乐潮玩小程序获取Cookie 2 | hostname = wxavip-tp.ezrpro.cn 3 | https:\/\/wxavip\-tp\.ezrpro\.cn\/Vip\/SignIn\/SignIn url script-request-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw.js -------------------------------------------------------------------------------- /profiles/QuantumultX/addons/taobao.conf: -------------------------------------------------------------------------------- 1 | # 淘宝监控获取Cookie 2 | hostname = h5api.m.taobao.com 3 | https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdesc url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb.js 4 | https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdetail url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb-name.js -------------------------------------------------------------------------------- /profiles/QuantumultX/addons/timepop.conf: -------------------------------------------------------------------------------- 1 | # Timepop获取Cookie 2 | hostname = h5.youzan.com 3 | ^https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkin\.json\?checkin\_id\=.*?app\_id\=wx4a1af22a88a99386 url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/timepop/timepop.js 4 | ^https:\/\/h5\.youzan\.com\/wscuser\/membercenter\/stats\.json\?app\_id\=wx4a1af22a88a99386 url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/timepop/timepop.js -------------------------------------------------------------------------------- /profiles/QuantumultX/addons/weibo.conf: -------------------------------------------------------------------------------- 1 | # 微博超话获取Cookie 2 | hostname = api.weibo.cn, mapi.weibo.com 3 | ^https?://m?api\.weibo\.c(n|om)\/2\/(cardlist|page\/button) url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.cookie.js -------------------------------------------------------------------------------- /profiles/QuantumultX/evil.conf: -------------------------------------------------------------------------------- 1 | hostname = weixin.bj.sgcc.com.cn, wxgzpt.hn.sgcc.com.cn, p.kuaidi100.com, h5.youzan.com, passport.iqiyi.com, appgw.huazhu.com, wxavip-up.ezrpro.cn, app.klcw.net.cn, wxavip-tp.ezrpro.cn, glados.rocks, api.weibo.com, mapi.weibo.com, mobilebj.cn, 10086.online-cmcc.cn, home.mi.com, m.weibo.cn, apimboom2.globaldelight.net, ms.jr.jd.com, me-api.jd.com, api.m.jd.com, passport.iqiyi.com, c.tieba.baidu.com, guide-acs.m.taobao.com, oia.zhihu.com, link.zhihu.com, www.zhihu.com, pan.baidu.com, m.client.10010.com, mp.weixin.qq.com, m.jd.com, www.zhihu.com, zhuanlan.zhihu.com, client.app.coc.10086.cn, pgdt.ugdtimg.com, auth.aliyundrive.com 2 | 3 | # evilbutcher 4 | # 国网电费 5 | #北京 6 | http:\/\/weixin.bj.sgcc.com.cn\/ott\/\/app\/elec\/account\/query url script-request-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/energybill/bill.js 7 | #湖南 8 | https:\/\/wxgzpt.hn.sgcc.com.cn\/wxapp\_dlsh\/wx url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/energybill/billhn.js 9 | https:\/\/wxgzpt.hn.sgcc.com.cn\/hndlGateway\/payment\/payment\/balance url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/energybill/billhn.js 10 | # 淘宝监控 11 | https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdetail url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb-name.js 12 | https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdesc url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb.js 13 | # Timepop 14 | ^https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkin\.json\?checkin\_id\=.*?app\_id\=wx4a1af22a88a99386 url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/timepop/timepop.js 15 | ^https:\/\/h5\.youzan\.com\/wscuser\/membercenter\/stats\.json\?app\_id\=wx4a1af22a88a99386 url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/timepop/timepop.js 16 | # 华住会 17 | https:\/\/appgw\.huazhu\.com\/game\/sign_header url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/main/check_in/hzh/hzh.js 18 | # 酷乐潮玩 19 | https:\/\/wxavip\-tp\.ezrpro\.cn\/Vip\/SignIn\/SignIn url script-request-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw.js 20 | https:\/\/app\.klcw\.net\.cn\/omp\_cmanage\/mallgateway url script-request-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js 21 | # MINDstyle 22 | ^https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkinV2\.json\?checkinId\=.*?app\_id\=wx78a583887733efd0 url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funko/mindstyle.js 23 | # Funboat 24 | ^https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkin\.json\?checkin\_id\=.*?app\_id\=wx9b5caf9d1669dc96 url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funko/funboat.js 25 | ^https:\/\/h5\.youzan\.com\/wscuser\/membercenter\/stats\.json\?app\_id\=wx9b5caf9d1669dc96 url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funko/funboat.js 26 | # GLaDOS 27 | https:\/\/glados\.rocks\/api\/user\/checkin url script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js 28 | # 微博超话签到 29 | ^https?://m?api\.weibo\.c(n|om)\/2\/(cardlist|page\/button|page) - script-request-header https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.cookie.js 30 | # 九木杂物社 31 | https:\/\/wxavip\-up\.ezrpro\.cn\/Vip\/SignIn\/SignIn url script-request-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js 32 | # Weibo去广告 33 | https:\/\/api\.weibo\.com\/oauth2\/getaid url reject 34 | # 北京移动去开屏广告 35 | https:\/\/mobilebj\.cn\/app\/appBasicInfo? url reject-200 36 | # 10086_remove_ad 37 | https:\/\/10086\.online\-cmcc\.cn\:20010\/gfms\/front\/hn\/busi3\!getAdvert url script-response-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/remove_ad/10086.js 38 | # 米家 39 | https:\/\/home\.mi\.com\/cgi-op\/api\/v1\/recommendation url reject 40 | https:\/\/home\.mi\.com\/newoperation\/recommendNames url reject 41 | https:\/\/api2\.mina\.mi\.com\/banner\/get url reject 42 | # 快递100 43 | https:\/\/p\.kuaidi100\.com\/mobile\/mobileapi\.do\?method\=mainprofile\&pos\=wechat\_mine\_card url reject 44 | # 中国移动 45 | ^https?:\/\/client.app\.coc\.10086\.cn\/biz-orange\/DN\/init\/startInit url reject-200 46 | # 便了么 47 | ^https:\/\/pgdt\.ugdtimg\.com url reject 48 | # 微博轻享版 49 | api.weibo.cn\/2\/ad\/weibointl url reject 50 | # pk 51 | https://billing.peakcloud.org/billing/2/user/me url script-response-body https://raw.githubusercontent.com/evilbutcher/QuantumultX/main/remove_ad/pk.js 52 | 53 | # zZPiglet 54 | # 微博通知 55 | ^https:\/\/m\.weibo\.cn\/feed\/ url script-request-header https://raw.githubusercontent.com/zZPiglet/Task/master/Weibo/Weibo.js 56 | # 微博网页跳转登陆屏蔽 57 | https://m\.weibo\.cn/comments/hotflow.*max_id=.* url reject-dict 58 | 59 | # NobyDa 60 | # Get JingDong cookie. QX 1.0.5(188+): 61 | ^https:\/\/(api\.m|me-api)\.jd\.com\/(client\.action\?functionId=signBean|user_new\/info\/GetJDUserInfoUnion\?) url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js 62 | ^https:\/\/ms\.jr\.jd\.com\/gw\/generic\/hy\/h5\/m\/appSign\? url script-request-body https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js 63 | # Get iQIYI cookie 64 | ^https:\/\/passport\.iqiyi\.com\/apis\/user\/ url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js 65 | 66 | # Peng-YM 67 | # 淘票票豆瓣评分 68 | ^https:\/\/guide-acs\.m\.taobao\.com\/gw\/mtop\.film\.mtopshowapi\.getextendshowbyid url script-response-body https://raw.githubusercontent.com/Peng-YM/QuanX/master/Rewrites/TaoPiaoPiao/taopiaopiao.js 69 | 70 | # lowking 71 | # 阿里云盘签到 72 | https:\/\/auth.aliyundrive.com\/v2\/account\/token url script-response-body https://raw.githubusercontent.com/lowking/Scripts/master/ali/aliYunPanCheckIn.js -------------------------------------------------------------------------------- /profiles/QuantumultX/evilbuther.list: -------------------------------------------------------------------------------- 1 | # > 知乎 2 | # 知乎去广告,以下规则请放置在filter_local最顶部 3 | IP-CIDR,118.89.204.198/32,REJECT 4 | IP6-CIDR,2402:4e00:1200:ed00:0:9089:6dac:96b6/128,REJECT 5 | HOST,118.89.204.198,REJECT 6 | # 知乎去广告,以下规则的位置越前方越好 7 | HOST,appcloud2.in.zhihu.com,REJECT 8 | HOST,mqtt.zhihu.com,reject 9 | HOST,sugar.zhihu.com,reject 10 | USER-AGENT,AVOS*,REJECT 11 | 12 | # 小米 13 | HOST,data.mistat.xiaomi.com, reject 14 | HOST,tracking.intl.miui.com, reject 15 | 16 | # QQ音乐广告 17 | HOST,tmeadcomm.y.qq.com, reject 18 | HOST,ad.tencentmusic.com, reject 19 | HOST,adstats.tencentmusic.com, reject 20 | HOST,tmead.y.qq.com, reject 21 | HOST-SUFFIX,rqd.qq.com, reject 22 | HOST-SUFFIX,wup.imtt.qq.com, reject 23 | HOST-SUFFIX,gdt.qq.com, reject 24 | HOST-SUFFIX,android.rqd.qq.com, reject 25 | HOST-SUFFIX,e.qq.com, reject 26 | HOST-SUFFIX,beacon.qq.com, reject 27 | HOST-SUFFIX,v.gdt.qq.com, reject 28 | 29 | # 高德 30 | HOST-SUFFIX,adiu.amap.com,REJECT 31 | HOST,aboard.apilocate.amap.com,REJECT 32 | HOST,apiinit.amap.com,REJECT 33 | HOST,icloud-amap.com,REJECT 34 | HOST,logs.amap.com,REJECT 35 | HOST-SUFFIX,dualstack-logs.amap.com,REJECT 36 | HOST-SUFFIX,logs.amap.com,REJECT 37 | HOST-SUFFIX,optimus-ads.amap.com,REJECT 38 | HOST-SUFFIX,page.amap.com,REJECT 39 | HOST,optimus-ads.amap.com, reject 40 | HOST,optimus-ads.amap.com.w.alikunlun.com, reject 41 | HOST-SUFFIX, shouji.sougou.com, reject 42 | HOST, u51.me, reject 43 | HOST-SUFFIX, u51.me, reject 44 | 45 | # 美团 46 | HOST, flowplus.meituan.net, reject 47 | HOST-SUFFIX, analytics.meituan.net, reject 48 | HOST-SUFFIX, meituan.xn--io0a7i, reject 49 | HOST-SUFFIX, meituan.yoga, reject 50 | HOST-SUFFIX, meituangov.cn, reject 51 | HOST-SUFFIX, report.meituan.com, reject 52 | HOST-SUFFIX, wmlog.meituan.com, reject 53 | 54 | # 交管12123 55 | host, static.122.gov.cn, reject 56 | ip-cidr, 203.107.1.1/24, reject 57 | HOST-SUFFIX, v3.fstats.xyz, reject 58 | HOST-SUFFIX, wss.haoyundmn.com, reject 59 | HOST-SUFFIX, new.xiongzhangad.com, reject 60 | HOST-SUFFIX, alexametrics.com, reject 61 | HOST-KEYWORD, in-page-push, reject 62 | 63 | # > 优酷 64 | HOST-SUFFIX,atm.youku.com, reject 65 | HOST,ad.mobile.youku.com, reject 66 | HOST,iyes.youku.com, reject 67 | HOST,pl.cp31.ott.cibntv.net, reject 68 | 69 | # > 百度 70 | HOST-SUFFIX,duapps.com, reject 71 | HOST-SUFFIX,cpro.baidu.com, reject 72 | HOST-SUFFIX,pos.baidu.com, reject 73 | HOST,afd.baidu.com, reject 74 | HOST,als.baidu.com, reject 75 | HOST,duclick.baidu.com, reject 76 | HOST,mobads.baidu.com, reject 77 | HOST,mobads-logs.baidu.com, reject 78 | HOST,nadvideo2.baidu.com, reject 79 | HOST,nsclick.baidu.com, reject 80 | HOST-SUFFIX,bce.baidu.com, reject 81 | HOST-SUFFIX,bar.baidu.com, reject 82 | HOST-SUFFIX,baiduyubaidu.com, reject 83 | HOST-SUFFIX,baidutv.baidu.com, reject 84 | HOST-SUFFIX,baichuan.baidu.com, reject 85 | HOST-SUFFIX,appc.baidu.com, reject 86 | HOST-SUFFIX,anquan.baidu.com, reject 87 | HOST-SUFFIX,adscdn.baidu.com, reject 88 | HOST-SUFFIX,adm.baidu.com, reject 89 | HOST-SUFFIX,ad.player.baidu.com, reject 90 | HOST-SUFFIX,a.baidu.com, reject 91 | HOST-SUFFIX,antivirus.baidu.com, reject 92 | HOST-SUFFIX,baifen.music.baidu.com, reject 93 | HOST-SUFFIX,banlv.baidu.com, reject 94 | HOST-SUFFIX,cm.baidu.com, reject 95 | HOST-SUFFIX,cpro.zhidao.baidu.com, reject 96 | HOST-SUFFIX,cleaner.baidu.com, reject 97 | HOST-SUFFIX,cjhq.baidu.com, reject 98 | HOST-SUFFIX,cb.baidu.com, reject 99 | HOST-SUFFIX,c.baidu.com, reject 100 | HOST-SUFFIX,btlaunch.baidu.com, reject 101 | HOST-SUFFIX,bdplus.baidu.com, reject 102 | HOST-SUFFIX,cbjs.baidu.com, reject 103 | HOST-SUFFIX,cpro2.baidu.com, reject 104 | HOST-SUFFIX,cpu-admin.baidu.com, reject 105 | 106 | # >爱奇艺 107 | HOST,t7z.cupid.iqiyi.com, reject 108 | HOST,t7z.cupid.ptqy.gitv.tv, reject 109 | IP-CIDR,203.107.63.154/32, reject 110 | IP-CIDR,101.227.97.240/32, reject 111 | IP-CIDR,101.227.200.11/32, reject 112 | IP-CIDR,101.227.200.28/32, reject 113 | IP-CIDR,124.192.153.42/32, reject 114 | 115 | # > 字节跳动 116 | HOST-SUFFIX,pangolin-sdk-toutiao.com, reject 117 | HOST-SUFFIX,pangolin-sdk-toutiao-b.com, reject 118 | HOST-SUFFIX,api-access.pangolin-sdk-toutiao-b.com, reject 119 | HOST,ad.toutiao.com, reject 120 | HOST,dsp.toutiao.com, reject 121 | host-keyword,pangolin.snssdk.com, reject 122 | 123 | # > 谷歌 124 | HOST-SUFFIX,google-analytics.com, reject 125 | HOST,safebrowsing.googleapis.com, reject 126 | HOST-SUFFIX,doubleclick.net, reject 127 | HOST-SUFFIX,googleadservices.com, reject 128 | HOST-SUFFIX,googleadsserving.cn, reject 129 | HOST-SUFFIX,googlesyndication.com, reject 130 | HOST-SUFFIX,googletagservices.com, reject 131 | HOST-SUFFIX,googletagmanager.com, reject 132 | HOST-SUFFIX,video-ad-stats.googlesyndication.com, reject 133 | HOST-SUFFIX,tpc.googlesyndication.com, reject 134 | HOST-SUFFIX,pagead.google.com, reject 135 | HOST-SUFFIX,pagead.l.google.com, reject 136 | HOST-SUFFIX,pagead2.googlesyndication.com, reject 137 | HOST-SUFFIX,pagead-tpc.l.google.com, reject 138 | HOST-SUFFIX,mobileads.google.com, reject 139 | HOST-SUFFIX,googlecommerce.com, reject 140 | HOST-SUFFIX,blaaaa12.googlecode.com, reject 141 | HOST-SUFFIX,badad.googleplex.com, reject 142 | HOST-SUFFIX,afs.googlesyndication.com, reject 143 | HOST-SUFFIX,afd.l.google.com, reject 144 | HOST-SUFFIX,www.googleadservices.com, reject 145 | HOST-SUFFIX,www.google-analytics.com, reject 146 | HOST,ads.youtube.com, reject 147 | 148 | # > 微软 149 | HOST-SUFFIX,ads.msn.com, reject 150 | HOST-SUFFIX,ads1.msn.com, reject 151 | HOST-SUFFIX,ads2.msn.com, reject 152 | HOST-SUFFIX,bingads.microsoft.com, reject 153 | HOST-SUFFIX,rads.msn.com, reject 154 | HOST,mobileads.msn.com, reject 155 | 156 | # > 腾讯视频 157 | host-suffix, tetrack.qq.com, reject 158 | host-suffix, tpns.tencent.com, reject 159 | host-suffix, api.poll.video.qq.com, reject 160 | host-suffix, static-res.qq.com, reject 161 | host-suffix, stat.tpns.tencent.com, reject 162 | host, h.trace.qq.com, reject 163 | 164 | # > 爱奇艺 165 | host, cr-status.iqiyi.com, reject 166 | host-suffix, cupid.iqiyi.com, reject 167 | host, f74f7f7765f8a2f6.ngaa.net.cn, reject 168 | host, ef-dongfeng.tanx.com, reject 169 | host, iqiyim.adtrack.enlightent.cn, reject 170 | HOST,dig.bdurl.net, reject 171 | HOST,ads3-normal-lq.zijieapi.com, reject 172 | HOST,ads5-normal-lq.zijieapi.com, reject 173 | 174 | # > 腾讯 175 | HOST-SUFFIX,news.ssp.qq.com, reject 176 | HOST-SUFFIX,news.l.qq.com, reject 177 | HOST-SUFFIX,activeqq.3g.qq.com, reject 178 | HOST-SUFFIX,ad.qq.com, reject 179 | HOST-SUFFIX,adping.qq.com, reject 180 | HOST-SUFFIX,adpm.app.qq.com, reject 181 | HOST-SUFFIX,adrdir.qq.com, reject 182 | HOST-SUFFIX,adsclick.qq.com, reject 183 | HOST-SUFFIX,adsense.html5.qq.com, reject 184 | HOST-SUFFIX,adsfile.qq.com, reject 185 | HOST-SUFFIX,adsgroup.qq.com, reject 186 | HOST-SUFFIX,adshmct.qq.com, reject 187 | HOST-SUFFIX,adshmmsg.qq.com, reject 188 | HOST-SUFFIX,adslvfile.qq.com, reject 189 | HOST-SUFFIX,adslvseed.qq.com, reject 190 | HOST-SUFFIX,adsolution.imtt.qq.com, reject 191 | HOST-SUFFIX,adsqqclick.qq.com, reject 192 | HOST-SUFFIX,adstextview.qq.com, reject 193 | HOST-SUFFIX,adsview.qq.com, reject 194 | HOST-SUFFIX,adsview2.qq.com, reject 195 | HOST-SUFFIX,adv.app.qq.com, reject 196 | HOST-SUFFIX,adver.qq.com, reject 197 | HOST-SUFFIX,aeventlog.beacon.qq.com, reject 198 | HOST-SUFFIX,analy.qq.com, reject 199 | HOST-SUFFIX,astrategy.beacon.qq.com, reject 200 | HOST-SUFFIX,c.gdt.qq.com, reject 201 | HOST-SUFFIX,c.gj.qq.com, reject 202 | HOST-SUFFIX,canvas.gdt.qq.com, reject 203 | HOST-SUFFIX,d.gdt.qq.com, reject 204 | HOST-SUFFIX,d3g.qq.com, reject 205 | HOST-SUFFIX,download.sj.qq.com, reject 206 | HOST-SUFFIX,dp3.qq.com, reject 207 | HOST-SUFFIX,eventlog.beacon.qq.com, reject 208 | HOST-SUFFIX,game.html5.qq.com, reject 209 | HOST-SUFFIX,ggmmqq.com, reject 210 | HOST-SUFFIX,j.wit.qq.com, reject 211 | HOST-SUFFIX,jqmt.qq.com, reject 212 | HOST-SUFFIX,jrlt.beacon.qq.com, reject 213 | HOST-SUFFIX,jsqmt.qq.com, reject 214 | HOST-SUFFIX,lives.l.qq.com, reject 215 | HOST-SUFFIX,livep.l.qq.com, reject 216 | HOST-SUFFIX,mi.gdt.qq.com, reject 217 | HOST-SUFFIX,livep.l.ott.video.qq.com, reject 218 | HOST-SUFFIX,lives.l.ott.video.qq.com, reject 219 | HOST-SUFFIX,masdk.3g.qq.com, reject 220 | HOST-SUFFIX,mfm.video.qq.com, reject 221 | HOST-SUFFIX,mini2015.qq.com, reject 222 | HOST-SUFFIX,monitor.uu.qq.com, reject 223 | HOST-SUFFIX,mqqad.cs0309.html5.qq.com, reject 224 | HOST-SUFFIX,mqqad.html5.qq.com, reject 225 | HOST-SUFFIX,mqqadr.reader.qq.com, reject 226 | HOST-SUFFIX,nc.gdt.qq.com, reject 227 | HOST-SUFFIX,news.mpush.qq.com, reject 228 | HOST-SUFFIX,news-l.play.ott.video.qq.com, reject 229 | HOST-SUFFIX,novelsns.html5.qq.com, reject 230 | HOST-SUFFIX,oth.update.mdt.qq.com, reject 231 | HOST-SUFFIX,pcbrowser.dd.qq.com, reject 232 | HOST-SUFFIX,pmir.3g.qq.com, reject 233 | HOST-SUFFIX,pvstat.html5.qq.com, reject 234 | HOST-SUFFIX,q.i.gdt.qq.com, reject 235 | HOST-SUFFIX,qqshow2-item.qq.com, reject 236 | HOST-SUFFIX,rm.gdt.qq.com, reject 237 | HOST-SUFFIX,scdown.qq.com, reject 238 | HOST-SUFFIX,setting.snswin.qq.com, reject 239 | HOST-SUFFIX,sngmta.qq.com, reject 240 | HOST-SUFFIX,strategy.beacon.qq.com, reject 241 | HOST-SUFFIX,t.gdt.qq.com, reject 242 | HOST-SUFFIX,t.sj.qq.com, reject 243 | HOST-SUFFIX,ta.qq.com, reject 244 | HOST-SUFFIX,tcss.qq.com, reject 245 | HOST-SUFFIX,tpush.html5.qq.com, reject 246 | HOST-SUFFIX,updatecenter.qq.com, reject 247 | HOST-SUFFIX,video.ureport.push.qq.com, reject 248 | HOST-SUFFIX,video.wap.mpush.qq.com, reject 249 | HOST-SUFFIX,vlive.qqvideo.tc.qq.com, reject 250 | HOST-SUFFIX,wap.mpush.qq.com, reject 251 | HOST-SUFFIX,win.gdt.qq.com, reject 252 | HOST-SUFFIX,ws.sj.qq.com, reject 253 | HOST-SUFFIX,wxsnsdy.tc.qq.com, reject 254 | HOST-SUFFIX,wxsnsdy.video.qq.com, reject 255 | HOST-SUFFIX,adsmind.tc.qq.com, reject 256 | HOST-SUFFIX,btrace.qq.com, reject 257 | HOST-SUFFIX,mtrace.qq.com, reject 258 | HOST-SUFFIX,pingma.qq.com, reject 259 | HOST-SUFFIX,pingtcss.qq.com, reject 260 | HOST-SUFFIX,tajs.qq.com, reject 261 | HOST-SUFFIX,wxsnsdy.wxs.qq.com, reject 262 | HOST-SUFFIX,wxsnsdythumb.wxs.qq.com, reject 263 | HOST-SUFFIX,fusion.qq.com, reject 264 | HOST-SUFFIX,ios.bugly.qq.com, reject 265 | HOST,safebrowsing.urlsec.qq.com, reject 266 | HOST-SUFFIX,oth.str.mdt.qq.com, reject 267 | HOST-SUFFIX,l.qq.com, reject 268 | HOST,adsmind.apdcdn.tc.qq.com, reject 269 | HOST,adsmind.tc.qq.com, reject 270 | HOST,adsmind.ugdtimg.com, reject 271 | HOST,livep.l.t002.ottcn.com, reject 272 | HOST,pgdt.ugdtimg.com, reject 273 | HOST,splashqqlive.gtimg.com, reject 274 | HOST,vv.video.qq.com, reject 275 | HOST,wa.gtimg.com, reject 276 | # HOST,wxsnsdy.wxs.qq.com, reject 277 | # HOST,wxsnsdythumb.wxs.qq.com, reject 278 | 279 | # > 微博 280 | HOST-KEYWORD,fastimage.uve.weibo.com, reject 281 | HOST-KEYWORD,adimg.uve.weibo.com, reject 282 | HOST-SUFFIX,adimg.vue.weibo.com, reject 283 | HOST-SUFFIX,zymo.mps.weibo.com, reject 284 | HOST-SUFFIX,weibomingzi.com, reject 285 | HOST-SUFFIX,sdkapp.uve.weibo.com, reject 286 | HOST-SUFFIX,s.alitui.weibo.com, reject 287 | HOST-SUFFIX,promote.biz.weibo.cn, reject 288 | HOST-SUFFIX,gw5.push.mcp.weibo.cn, reject 289 | HOST-SUFFIX,game.weibo.cn, reject 290 | HOST-SUFFIX,biz.weibo.com, reject 291 | HOST-SUFFIX,adimg.uve.weibo.com, reject 292 | HOST-SUFFIX,game.weibo.com, reject 293 | HOST-SUFFIX,gw6.push.mcp.weibo.cn, reject 294 | HOST-KEYWORD,ads.viber.com, reject 295 | HOST-KEYWORD,ads-d.viber.com, reject 296 | HOST-KEYWORD,ads.aws.viber.com, reject 297 | HOST-SUFFIX,alitui.weibo.com, reject 298 | HOST,adimg.uve.weibo.com, reject 299 | HOST,adimg.vue.weibo.com, reject 300 | HOST-KEYWORD,adimg.uve.weibo.com,REJECT 301 | HOST-KEYWORD,alitui.weibo.com,REJECT 302 | HOST-KEYWORD,biz.weibo.com,REJECT 303 | HOST-KEYWORD,game.weibo.cn,REJECT 304 | HOST-KEYWORD,game.weibo.com,REJECT 305 | HOST-KEYWORD,gw5.push.mcp.weibo.cn,REJECT 306 | HOST-KEYWORD,gw6.push.mcp.weibo.cn,REJECT 307 | HOST-KEYWORD,promote.biz.weibo.cn,REJECT 308 | HOST-KEYWORD,s.alitui.weibo.com,REJECT 309 | HOST-KEYWORD,sdkapp.uve.weibo.com,REJECT 310 | HOST-KEYWORD,weibomingzi.com,REJECT 311 | HOST-KEYWORD,zymo.mps.weibo.com,REJECT 312 | HOST-KEYWORD,adimg.vue.weibo.com,REJECT 313 | HOST-KEYWORD,dp.im.weibo.cn,REJECT 314 | HOST-KEYWORD,m.game.weibo.cn,REJECT 315 | HOST-KEYWORD,c.biz.weibo.com,REJECT 316 | HOST-KEYWORD,c.wcpt.biz.weibo.com,REJECT 317 | HOST-KEYWORD,click.uve.weibo.com,REJECT 318 | HOST-KEYWORD,wax.weibo.com,REJECT 319 | HOST-KEYWORD,wbapp.uve.weibo.com,REJECT 320 | HOST-KEYWORD,widget.weibo.com,REJECT 321 | HOST-KEYWORD,zc.biz.weibo.com,REJECT 322 | HOST-KEYWORD,dsp.edm.weibo.cn,REJECT 323 | HOST-KEYWORD,alitui.weibo.com.cn,REJECT 324 | HOST-KEYWORD,biz.weibo.com.cn,REJECT 325 | HOST-KEYWORD,game.weibo.com.cn,REJECT 326 | HOST-KEYWORD,tui.weibo.com,REJECT 327 | HOST-KEYWORD,wax.weibo.com.cn,REJECT 328 | HOST-KEYWORD,ad.weibo.com,REJECT 329 | HOST-KEYWORD,adstrategy.biz.weibo.com,REJECT 330 | HOST-KEYWORD,s.weibo.com,REJECT 331 | HOST-KEYWORD,vs.biz.weibo.com,REJECT 332 | 333 | # > 喜马拉雅 334 | HOST,ad.ximalaya.com, reject 335 | HOST,adbs.ximalaya.com, reject 336 | HOST,adse.ximalaya.com, reject 337 | HOST,adse.wsa.ximalaya.com, reject 338 | HOST,adbehavior.wsa.ximalaya.com, reject 339 | HOST,adbehavior.ximalaya.com, reject 340 | HOST,adsebs.ximalaya.com, reject 341 | HOST,adwbs.ximalaya.com, reject 342 | 343 | # >小红书 344 | HOST,ads-img-qc.xhscdn.com, reject 345 | HOST,ads-video-al.xhscdn.com, reject 346 | HOST,ads-video-qc.xhscdn.com, reject 347 | HOST,t-ads.xiaohongshu.com, reject 348 | 349 | # > 淘宝 350 | HOST-SUFFIX,apoll.m.taobao.com, reject 351 | HOST-SUFFIX,h-adashx.ut.taobao.com, reject 352 | HOST-SUFFIX,w.m.taobao.com, reject 353 | HOST,tunion-api.m.taobao.com, reject 354 | HOST-SUFFIX,ai.m.taobao.com, reject 355 | HOST-SUFFIX,re.m.taobao.com, reject 356 | HOST-SUFFIX,agoodm.m.taobao.com, reject 357 | HOST-SUFFIX,ai.taobao.com, reject 358 | HOST-SUFFIX,api.waptest.taobao.com, reject 359 | HOST-SUFFIX,dsp.simba.taobao.com, reject 360 | HOST-SUFFIX,fav.simba.taobao.com, reject 361 | HOST-SUFFIX,m.simba.taobao.com, reject 362 | HOST-SUFFIX,mclick.simba.taobao.com, reject 363 | HOST-SUFFIX,re.taobao.com, reject 364 | HOST-SUFFIX,redirect.simba.taobao.com, reject 365 | HOST-SUFFIX,simba.m.taobao.com, reject 366 | HOST-SUFFIX,srd.simba.taobao.com, reject 367 | HOST-SUFFIX,temai.taobao.com, reject 368 | HOST-SUFFIX,textlink.simba.taobao.com, reject 369 | HOST-SUFFIX,unitacs.m.taobao.com, reject 370 | HOST-SUFFIX,acs4baichuan.m.taobao.com, reject 371 | HOST-SUFFIX,adashbc.ut.taobao.com, reject 372 | HOST-SUFFIX,adash-c.ut.taobao.com, reject 373 | HOST-SUFFIX,adashxgc.ut.taobao.com, reject 374 | HOST-SUFFIX,adashx4yt.m.taobao.com, reject 375 | HOST-SUFFIX,tunion-api.m.taobao.com, reject 376 | HOST-SUFFIX,tns.simba.taobao.com, reject 377 | HOST-SUFFIX,click.mz.simba.taobao.com, reject 378 | HOST-SUFFIX,click.simba.taobao.com, reject 379 | HOST-SUFFIX,click.tz.simba.taobao.com, reject 380 | HOST-SUFFIX,stat.simba.taobao.com, reject 381 | HOST-SUFFIX,m-adash.m.taobao.com, reject 382 | HOST-SUFFIX,adashbc.m.taobao.com, reject 383 | 384 | # > 铁路12306 385 | HOST, ad.12306.cn, REJECT 386 | 387 | # > 威锋 388 | host-keyword, p3-be-pack-sign.pglstatp-toutiao.com, reject 389 | host-keyword, sf3-be-pack.pglstatp-toutiao.com, reject 390 | host-keyword,sf1-be-pack.pglstatp-toutiao.com, reject 391 | host-keyword,sf1-fe-tos.pglstatp-toutiao.com, reject 392 | host-keyword,sf1-ttcdn-tos.pstatp.com, reject 393 | host-keyword,sf3-fe-tos.pglstatp-toutiao.com, reject 394 | host-keyword,sf3-ttcdn-tos.pstatp.com, reject 395 | host-keyword,sf6-fe-tos.pglstatp-toutiao.com, reject 396 | host-keyword,s3-fe-scm.pglstatp-toutiao.com, reject 397 | host-keyword,sf6-be-pack.pglstatp-toutiao.com, reject 398 | host-keyword,p9-be-pack-sign.pglstatp-toutiao.com, reject 399 | -------------------------------------------------------------------------------- /profiles/Surge/Surge.cookies.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=evilbutcher Cookies Module 2 | #!desc=Cookies 合集模块配置 3 | #!system=ios 4 | 5 | [Script] 6 | Funboat获取签到Cookie = http-request,pattern=^https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkin\.json\?checkin\_id\=.*?app\_id\=wx9b5caf9d1669dc96,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js 7 | Funboat获取积分Cookie = http-request,pattern=^https:\/\/h5\.youzan\.com\/wscuser\/membercenter\/stats\.json\?app\_id\=wx9b5caf9d1669dc96,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js 8 | Timepop获取签到Cookie = http-request,pattern=^https:\/\/h5\.youzan\.com\/wscump\/checkin\/checkin\.json\?checkin\_id\=.*?app\_id\=wx4a1af22a88a99386,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/timepop/timepop.js 9 | Timepop获取积分Cookie = http-request,pattern=^https:\/\/h5\.youzan\.com\/wscuser\/membercenter\/stats\.json\?app\_id\=wx4a1af22a88a99386,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/timepop/timepop.js 10 | GLaDOS获取Cookie = http-request,pattern=https:\/\/glados\.rocks\/api\/user\/checkin, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js 11 | 微博超话获取Cookie = http-request,pattern=^https?://m?api\.weibo\.c(n|om)\/2\/(cardlist|page\/button), script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.cookie.js 12 | 九木杂物社获取Cookie = http-request, pattern = https:\/\/wxavip\-up\.ezrpro\.cn\/Vip\/SignIn\/SignIn, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js, requires-body=true 13 | 酷乐潮玩小程序获取签到Cookie = http-request, pattern = https:\/\/wxavip\-tp\.ezrpro\.cn\/Vip\/SignIn\/SignIn, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw.js, requires-body=true 14 | 酷乐潮玩App获取Cookie = http-request, pattern = https:\/\/app\.klcw\.net\.cn\/omp\_cmanage\/mallgateway, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js, requires-body=true 15 | 华住会获取签到Cookie = http-request, pattern = https:\/\/hweb-mbf\.huazhu\.com\/api\/signIn, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hzh/hzh.js, requires-body=false 16 | 淘宝监控获取Cookie = http-request, pattern = https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdetail, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb-name.js, requires-body=false 17 | 淘宝监控获取Cookie = http-request, pattern = https:\/\/h5api.m.taobao.com\/h5\/mtop.taobao.detail.getdesc, script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb.js, requires-body=false 18 | 19 | [MITM] 20 | hostname = %INSERT%, h5.youzan.com, glados.rocks, api.weibo.cn, mapi.weibo.com, wxavip-up.ezrpro.cn, wxavip-tp.ezrpro.cn, app.klcw.net.cn, hweb-mbf.huazhu.com, h5api.m.taobao.com -------------------------------------------------------------------------------- /profiles/Surge/Surge.tasks.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=evilbutcher Tasks Module 2 | #!desc=Tasks 合集模块配置 3 | #!system=ios 4 | 5 | [Script] 6 | NASA每日一图 = type=cron,cronexp=0 0 6 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/nasa/nasapic.js 7 | iDaily每日环球视野 = type=cron,cronexp=0 0 6 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/idaily/idaily.js 8 | App价格监控 = type=cron,cronexp=30 7-22 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/appstore/AppMonitor.js 9 | 热门监控 = type=cron,cronexp=30 0 8-22/2 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hotsearch/hot.js 10 | 微博超话 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/weibo/weibotalk.js 11 | GLaDOS签到 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/glados.js 12 | 机场签到 = type=cron,cronexp=0 1 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/checkin_env.js 13 | 机场签到Cookie = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/glados/checkincookie_env.js 14 | Funboat签到 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/funboat/funboat.js 15 | Timepop签到 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/timepop/timepop.js 16 | 九木杂物社 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/jiumu/jiumu.js 17 | 酷乐潮玩小程序 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw.js 18 | 酷乐潮玩App = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/klcw/klcw-app.js 19 | 公众号监控 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/wechatsubs.js 20 | 事业单位招聘监控 = type=cron,cronexp=5 * * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/sydwzp.js 21 | 高校人才网招聘监控 = type=cron,cronexp=5 * * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/wechatsubs/gxrcw.js 22 | 彩票监控 = type=cron,cronexp=0 30 21 * * * ,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/ssq/ssq.js 23 | 华住会 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/hzh/hzh.js 24 | 淘宝监控-标题版 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb-name.js 25 | 淘宝监控 = type=cron,cronexp=5 0 * * *,script-path=https://raw.githubusercontent.com/evilbutcher/QuantumultX/master/check_in/taobao/tb.js -------------------------------------------------------------------------------- /profiles/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "evilbutcher", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "checkin_env.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/evilbutcher/QuantumultX.git" 12 | }, 13 | "keywords": [], 14 | "author": "", 15 | "license": "ISC", 16 | "bugs": { 17 | "url": "https://github.com/evilbutcher/QuantumultX/issues" 18 | }, 19 | "homepage": "https://github.com/evilbutcher/QuantumultX#readme", 20 | "dependencies": { 21 | "got": "^11.5.1", 22 | "npm": "^6.14.7", 23 | "http-server": "^0.12.3", 24 | "node-schedule": "^1.3.2", 25 | "tough": "^0.6.0", 26 | "tough-cookie": "^4.0.0", 27 | "download": "^8.0.0", 28 | "request": "^2.88.2", 29 | "request-promise": "^4.2.5" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /remove_ad/10086.js: -------------------------------------------------------------------------------- 1 | /* 2 | ⚠️【免责声明】 3 | ------------------------------------------ 4 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 5 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 6 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 7 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 8 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 9 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 10 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 11 | 10086去开屏广告Quantumult X配置 12 | 13 | [mitm] 14 | 10086.online-cmcc.cn 15 | 16 | [rewrite_local](注意路径) 17 | #10086_remove_ad 18 | https:\/\/10086\.online\-cmcc\.cn\:20010\/gfms\/front\/hn\/busi3\!getAdvert url script-response-body 10086.js 19 | 20 | */ 21 | 22 | let obj=JSON.parse($response.body); 23 | 24 | obj.flag=0; 25 | obj.content=" "; 26 | 27 | $done({body: JSON.stringify(obj)}) 28 | -------------------------------------------------------------------------------- /remove_ad/README.md: -------------------------------------------------------------------------------- 1 | ##### [10086去开屏广告](https://github.com/evilbutcher/QuantumultX/blob/master/remove_ad/10086.js) 2 | ##### [北京移动去开屏广告](https://github.com/evilbutcher/QuantumultX/blob/master/remove_ad/bjyd.js) 3 | ##### [能力天空去广告](https://github.com/evilbutcher/QuantumultX/blob/master/remove_ad/nltk.js) 4 | ##### [杂七杂八去广告](https://github.com/evilbutcher/QuantumultX/blob/master/remove_ad/rewrite.txt) -------------------------------------------------------------------------------- /remove_ad/bbdc.js: -------------------------------------------------------------------------------- 1 | /* 2 | ⚠️【免责声明】 3 | ------------------------------------------ 4 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 5 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 6 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 7 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 8 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 9 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 10 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 11 | 12 | bbdc解锁Quantumult X配置 13 | [mitm] 14 | 121.43.19.216, sapi.beingfine.cn 15 | 16 | [rewrite_local](注意路径) 17 | ^https:\/\/sapi\.beingfine\.cn\/v3\/report\/launch\/ url script-response-body bbdc.js 18 | 19 | */ 20 | 21 | let obj=JSON.parse($response.body); 22 | 23 | var text = obj.data_body 24 | var atext = text.replace(new RegExp(/(expire_date\":)\d+/,"gm"),"expire_date\":4586691111000") 25 | var btext = atext.replace(new RegExp(/granted\":\d+/,"gm"),"granted\":1") 26 | var ctext = btext.replace(new RegExp(/user_type\\\"\:\d+/,"gm"),"user_type\":3") 27 | var dtext = ctext.replace(new RegExp(/collins_user_type\\\"\:\d+/,"gm"),"collins_user_type\":3") 28 | obj.data_body = dtext 29 | 30 | //obj.data_body="{\"user_info\":{\"Email\":\"\",\"is_new_user\":1,\"nickname\":\"30602963\",\"avatar_image\":\"/AvatarImage/wechat/253310946.jpg\",\"id\":30602963},\"bindings\":{\"sns_bindings\":{\"huawei\":0,\"xiaomi\":0,\"oppo\":0,\"wechat\":1,\"sina\":0,\"qzone\":0},\"primary_binding\":\"wechat\"},\"privileges\":{\"wordroot\":{\"expire_date\":4586691111000,\"user_type\":3,\"granted\":1},\"collins\":{\"expire_date\":4586691121000,\"granted\":1,\"collins_user_type\":3}},\"user_status\":{\"total_coin\":10,\"task_status\":{\"finish_study\":0,\"share_to_sns\":0,\"finish_spell\":0,\"finish_review\":0},\"sign_in_continuous_days\":1,\"logged_off\":0,\"login_prompt\":\"你上次使用 微信 登录过\"},\"actions\":{\"card_action\":{\"enable\":0},\"web_page\":{\"enable\":0,\"url\":\"\"},\"float_button_action\":{\"enable\":0},\"bind_phone_action\":0},\"base_info\":{\"coin_reward\":{\"finish_study\":20,\"share_to_sns\":5,\"finish_spell\":20,\"signin\":10,\"finish_review\":10},\"config\":{\"upload_user_action\":0}},\"dashboard_calendar\":[{\"study\":0,\"timestamp\":1586016060000,\"sign_in\":1}],\"dashboard_sign_in\":{\"continuous_days\":1,\"total_days\":1}}" 31 | 32 | $done({body: JSON.stringify(obj)}) 33 | -------------------------------------------------------------------------------- /remove_ad/bjyd.js: -------------------------------------------------------------------------------- 1 | /* 2 | ⚠️【免责声明】 3 | ------------------------------------------ 4 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 5 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 6 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 7 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 8 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 9 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 10 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 11 | 12 | bjyd去开屏广告Quantumult X配置 13 | [mitm] 14 | mobilebj.cn 15 | 16 | [rewrite_local](注意路径) 17 | #bjyd_remove_ad 18 | https:\/\/mobilebj\.cn\/app\/appBasicInfo? url script-response-body bjyd.js 19 | 20 | #粗暴(但还有3s) 21 | https:\/\/mobilebj\.cn\/app\/appBasicInfo? url reject 22 | */ 23 | 24 | let obj=JSON.parse($response.body); 25 | 26 | obj.startimg_showtime=0; 27 | obj.startimg_url=""; 28 | obj.startimg_visitlink=""; 29 | obj.startimglist[0].startimg_showtime=0; 30 | obj.startimglist[0].startimg_url=""; 31 | obj.startimglist[0].startimg_visitlink=""; 32 | 33 | $done({body: JSON.stringify(obj)}) 34 | -------------------------------------------------------------------------------- /remove_ad/nltk.js: -------------------------------------------------------------------------------- 1 | /* 2 | ⚠️【免责声明】 3 | ------------------------------------------ 4 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 5 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 6 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 7 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 8 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 9 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 10 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 11 | 12 | 能力天空去开屏、推荐广告Quantumult X配置 13 | [mitm] 14 | ai.ablesky.com, api.weibo.com, mobile.ablesky.com, www.ablesky.com 15 | 16 | [rewrite_local](注意路径) 17 | #微博广告 18 | https:\/\/api\.weibo\.com\/oauth2\/getaid url reject 19 | #开屏时间 20 | https:\/\/ai\.ablesky\.com\/ajax\/ads\/appads url script-response-body local/QuantumultX/remove_ad/nltk.js 21 | #今日热学 22 | https:\/\/www\.ablesky\.com\/s\/sr\.do\?action\=single\&appRandom url reject 23 | #推荐页面 24 | https:\/\/mobile\.ablesky\.com\/course\.do\?action\=recommended\&appRandom url reject 25 | #首页推荐 26 | https:\/\/www\.ablesky\.com\/ajax\/ableskytag\/account\/getTabMenuList url reject 27 | #杂七杂八 28 | https:\/\/www\.ablesky\.com\/ajax\/account\/history\/list\?\&appRandom url reject 29 | https:\/\/www\.ablesky\.com\/taskTrigger\.do\?appRandom url reject 30 | https:\/\/ai\.ablesky\.com\/ajax\/orgPublicImg\/show\?appRandom url reject 31 | 32 | */ 33 | 34 | let obj=JSON.parse($response.body); 35 | 36 | obj={ 37 | "success": true, 38 | "id": 0, 39 | "result": { 40 | "list": [{ 41 | "startDate": 1585065600000, 42 | "duration": "0", 43 | "showLocation": null, 44 | "endDate": 1619366399000, 45 | "adType": "0", 46 | "courseId": null, 47 | "photoUrl": "", 48 | "showPage": null, 49 | "url": "" 50 | }] 51 | } 52 | } 53 | 54 | $done({body: JSON.stringify(obj)}) 55 | -------------------------------------------------------------------------------- /remove_ad/pk.js: -------------------------------------------------------------------------------- 1 | /* 2 | ⚠️【免责声明】 3 | ------------------------------------------ 4 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 5 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 6 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 7 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 8 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 9 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 10 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 11 | 12 | 解锁配置 13 | [mitm] 14 | billing.peakcloud.org 15 | 16 | [rewrite_local](注意路径) 17 | https://billing.peakcloud.org/billing/2/user/me url script-response-body pk.js 18 | 19 | */ 20 | 21 | let obj = JSON.parse($response.body); 22 | 23 | info = { 24 | "bbuid": "ZPpZvQbStP", 25 | "usedIntroOfferPeriod": false, 26 | "class": "UserModuleBillingResponse", 27 | "is_in_billing_retry": false, 28 | "modules": [{ 29 | "class": "BillingModuleResponse", 30 | "name": "com.brainbow.module.peak.PeakModule", 31 | "subscription": { 32 | "status": 0, 33 | "statusdate": 0, 34 | "source": { 35 | "id": "com.brainbow.peak.arsub_1wtrial_12m4968", 36 | "cancelable": false, 37 | "provider": "itunes", 38 | "type": "trial" 39 | }, 40 | "bbuid": "ZPpZvQbStP", 41 | "endTime": 2536443400000, 42 | "startTime": 1531710600000, 43 | "pro": true 44 | } 45 | }], 46 | "metaResponse": { "code": 0 } 47 | } 48 | 49 | obj.response = info 50 | 51 | $done({ body: JSON.stringify(obj) }) -------------------------------------------------------------------------------- /remove_ad/quake.js: -------------------------------------------------------------------------------- 1 | /* 2 | ⚠️【免责声明】 3 | ------------------------------------------ 4 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 5 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 6 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 7 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 8 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 9 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 10 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 11 | 12 | quake解锁Quantumult X配置 13 | [mitm] 14 | quakeapp.com 15 | 16 | [rewrite_local](注意路径) 17 | https:\/\/quakeapp\.com\/quakeapi\/v2\/u\/appLaunch url script-request-body Local/remove_ad/quake.js 18 | https:\/\/quakeapp\.com\/quakeapi\/v2\/u\/appLaunch url script-response-body Local/remove_ad/quake.js 19 | 20 | */ 21 | 22 | if ($request) { 23 | var obj = JSON.parse($request.body); 24 | obj.ispremium = "1"; 25 | $done({ body: JSON.stringify(obj) }); 26 | } 27 | 28 | /* 29 | if ($response) { 30 | obj = JSON.parse($response.body); 31 | obj.resultsCount = "0"; 32 | $done({ body: JSON.stringify(obj) }); 33 | } 34 | */ 35 | -------------------------------------------------------------------------------- /remove_ad/rewrite.txt: -------------------------------------------------------------------------------- 1 | /* 2 | ⚠️【免责声明】 3 | ------------------------------------------ 4 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 5 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 6 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 7 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 8 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 9 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 10 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 11 | */ 12 | 13 | #weibo 14 | https:\/\/api\.weibo\.com\/oauth2\/getaid url reject 15 | 16 | #keep 17 | https:\/\/api\.gotokeep\.com\/ads\/v1\/ads\?spotIds url reject 18 | 19 | #heybox 20 | https:\/\/api\.xiaoheihe\.cn\/account\/get_ads_info\ url reject 21 | 22 | #cainiao 23 | https:\/\/acs\.m\.taobao\.com\/gw\/mtop\.cainiao\.nbnetflow\.guoappstartup\.ads\.show url reject 24 | ;失效https:\/\/acs\.m\.taobao\.com\/gw\/mtop\.cainiao\.guoguo\.nbnetflow\.ads\.recommend url reject 25 | ;失效https:\/\/acs\.m\.taobao\.com\/gw\/mtop\.cainiao\.guoguo\.nbnetflow\.ads\.show url reject 26 | 27 | #xianyu(test) 28 | https:\/\/iyes\.youku\.com\/start\/rt? url reject -------------------------------------------------------------------------------- /remove_ad/zhihu.js: -------------------------------------------------------------------------------- 1 | /* 2 | ⚠️【免责声明】 3 | ------------------------------------------ 4 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 5 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 6 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 7 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 8 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 9 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 10 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 11 | 12 | [rewrite_local] 13 | # 知乎网页直接看 14 | ^https://www\.zhihu\.com/question/ url script-response-body Local/remove_ad/zhihu.js 15 | 16 | 17 | [mitm] 18 | hostname = www.zhihu.com 19 | */ 20 | 21 | 22 | let html = $response.body 23 | let nonce= html.match(/nonce="[\w\-]*"/g)[1] 24 | 25 | html = html.replace(/(<\/html>)/g, "") + 26 | ` 27 | 42 | 43 | ` 44 | 45 | $done({body: html}) 46 | --------------------------------------------------------------------------------