zZPiglet
1.04K subscribers
20 photos
6 videos
7 files
78 links
https://github.com/zZPiglet/Task
学习交流 自留地
问题反馈:@zZPiglet_bot
Download Telegram
#微博通知

最新的 Quantumlt X TestFlight 1.0.15 (391) 中,定时自动执行「微博通知」脚本可能会报错 {},原因未知(node 跑不报错,回退一个版本不报错),暂时解决方法:回退一个版本(390)或等待软件下次更新看是否还有问题。

更新:392 版本依旧可能报错,原因未知。
更新:393 版本依旧可能报错,原因未知。
更新:反馈给作者后 394 版本应该已解决此问题,同时解决了一些内存问题(大概)。
🐟

在较早的时候脚本中捕获抛出错误时,直接输出 err,导致很多人问错误信息中的 [object Object] 是什么。之后更改为输出 JSON.stringify(err),确实解决了部分错误输出显示为 [object Object] 的问题,但造成了错误信息显示为 {} 的问题。

@evilbutcher 大佬最近一次 PR 及与大佬讨论中得知,部分错误信息改回输出 err 之后,即可正常显示(如:TypeError: null / undefined is not an object)。

于是转向 MDN 文档求助 JSON.stringify() 具体使用及注意事项,得到如下描述:

JSON.stringify()将值转换为相应的JSON格式:
• 转换值如果有 toJSON() 方法,该方法定义什么值将被序列化。
• 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。
• 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。函数、undefined 被单独转换时,会返回 undefined,如JSON.stringify(function(){}) or JSON.stringify(undefined).
• 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。
• 所有以 symbol 为属性键的属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们。
• Date 日期调用了 toJSON() 将其转换为了 string 字符串(同Date.toISOString()),因此会被当做字符串处理。
• NaN 和 Infinity 格式的数值及 null 都会被当做 null。
• 其他类型的对象,包括 Map/Set/WeakMap/WeakSet,仅会序列化可枚举的属性。

由此意识到是内置对象在序列化时会出现问题,因此需要单独解决。
最先想到的解决方式为:err = JSON.stringify(err) == "{}" ? err : JSON.stringify(err)
但此写法仅是表面解决问题,且不确定是否真的能涵盖所有可能的情况,故通过 Google 搜索关键字“内置错误 stringify”,得到一篇感觉可以解决此问题的文章:https://juejin.im/post/6844903944792047623

关键:JSON.stringify(err, Object.getOwnPropertyNames(err), 2)
或:Error.prototype.toJSON = function(){return {message:this.message, stack:this.stack}}(但不建议,因为此方法在原型上作了修改)

由于本人没有系统学习,亦没认真学习 JavaScript,且看文档不仔细导致的此问题影响了脚本使用体验及脚本错误的快速定位,对此感到抱歉,同时感谢 @evilbutcher 大佬的点醒。后续会陆续修改脚本中此问题。

最后想说的是,写脚本的门槛其实很低,像我一样从完全没接触过到写下第一个很简陋的脚本,其实不会花费很多精力,所以大家完全可以自己尝试一下。基本就是看看已有的脚本是怎么写的,然后类似写一个最简单的脚本进行尝试,在此过程中遇到问题就去查文档或者问 Google。当然通过此方法写脚本很有可能就出现一些奇奇怪怪的错误,但是不用担心呀,总会有大佬帮你改正或和你探讨的,有精力的时候去学一些新东西又有什么不好呢。
(其实是最近太忙了想当一个愉快的鸽子🐦,所以催脚本的其实可以尝试一下自己写呀)
🔨 1 new commit to Task:master:

506da10: 饿了么遗忘的吃货豆自动领取。 by zZPiglet
(直接改了改滴滴出行遗忘的福利金,几乎无工作量)
(之前的 todo 依旧在🐦
🔨 1 new commit to Task:master:

17f21d3: 滴滴出行金融服务天天有奖 by zZPiglet

鉴于投票结果整合/独立不相上下,先放出独立版,整合版还在🐦
遇报错请在评论区反馈
Forwarded from Cool Scripts (zZPiglet 22:20 PM UTC+8 🕙)
#Surge #httpAPI #Shortcuts

🐟
通过快捷指令控制 Surge 同时开启/关闭抓包和 MitM All Hostnames 模块,达到全局抓包的效果,仅需点击一次。

注:需订阅至 Surge 包含 HTTP API 功能。

使用方法:
1⃣️ 安装 MitM All Hostnames 模块:

#!name=MitM All Hostnames
#!desc=Perform MitM on all hostnames with port 443, except those to Apple and other common sites which can't be inspected. You still need configure CA certificate and enable the main switch of MitM.

[MITM]
hostname = -*.apple.com, -*.icloud.com, -*.mzstatic.com, -*.crashlytics.com, -*.facebook.com, -*.instagram.com, *

2⃣️ 安装快捷指令:https://www.icloud.com/shortcuts/c180d3285b3548b0a35b27375f203a53
3⃣️ 配置好 HTTP API,并填入快捷指令对应栏目。
4⃣️ Enjoy yourself 🔨

参考 @mieqq 大佬的快捷指令制作完成,十分感谢!
@mieqq 大佬的几个快捷指令:
1. 通过 HTTP API 控制 Surge:https://t.iss.one/cool_scripts/149
2. 查看加载完模块的最终配置:https://www.icloud.com/shortcuts/a91be98c76004314b2af80d224fd5e21

开发不易,点个吧~
如果发现有bug,欢迎反馈。
🔔频道: Cool Scripts
🧑🏻‍💻作者: @zZPiglet
滴滴天津另一个活动:https://z.didi.cn/4IlzC
11 月每天 11 点抢立减 100 元券(即 100 内免单),当天失效,虽说每天限量 100 张,但是到现在好像都还有。
以及不确定有没有之前一次活动类似 bug,即写着限制地区但实际未限制使用。(欢迎评论区反馈)

脚本暂不公开。

更新:由于滴滴的代码逻辑有问题,短距离打车不会自动使用此优惠券,如需使用此优惠券,请关闭自动扣款,并在付款时手动选择该优惠券。(滴滴客服已给我转了技术,技术那边还没给出回复。)
#微博通知

最近新使用「微博通知」脚本的用户变多了,接到很多反馈,需要注意的是,脚本是抓取的手机网页版微博的接口(可理解为爬虫),并非正常申请微博接口所写。而如果特别频繁的请求,会导致接口返回错误页面,即无法正确拿到结果。所以建议适当拉长 cron 间隔时间或避开整点之类的大家都在发送请求的时间。脚本只是辅助和凑合使用的作用,如需实时推送只能等所使用的官方/第三方客户端去完善。

即避免使用每分钟/每两分钟这种类似的定时任务,不管是对手机电量还是接口返回都有较大影响。

同时,现在 Quantumult X 和 Loon 均支持多媒体通知,Surge 和 Shadowrocket 暂未支持。
#滴滴出行

https://static.dorado.xiaojukeji.com/vue/dist/en/coupon.html?schannel=didi&a=&b=120107&c=20000&d=0&s=1810596130717516128&cId=6312&v=1.0&lang=en-US&t=qr#/
领取两张 8 元快车优惠券,仅限滴滴英文页使用。可在左上角头像 - 设置 - 多语言处选择英语。需要注意的是:滴滴英文页目前只能使用滴滴快车及优享,且不可同时呼叫,可对比正常滴滴优惠使用。
🔨 1 new commit to Task:master:

f0db4c5: 重写滴滴脚本,加入一些新功能,请阅读 README.md 后使用。如使用此脚本,可去除原 DiDi.js、DiDi_reward.js 脚本。 by zZPiglet

获取 token 一定要开启滴滴的定位,因为同时需要获取到你的城市编号。

测试阶段,可在 BoxJs 更新后进行设置,如无大问题这次可能真的会🐦很久了。

🔨 1 new commit to Task:master:

9e6796f: 增加从小程序获取 Token。 by zZPiglet

如需抢券请在晚八点之前运行一次脚本存储券编号。

冷知识:这个券可能是手动控制加的,因为之前一个多月的过程中经历了加错券、打错券名、券名不规范等事件,目前暂时稳定下来。
👍1
#滴滴出行

新的一期福利金抽奖可能会亏损,已移至「可能亏损的抽奖」类别,此类别默认关闭,如需使用请在 BoxJs 中开启。
zZPiglet
#todo_zZPiglet https://static.udache.com/common/pc-login/js/vendor.02bfb8364dab3d61b1d7.js 提炼出滴滴的 wsgsig 算法。
#todo_zZPiglet

下个月重构微博通知中 ParseWeibo 函数以支持更多类型的多媒体显示,有间隔的进行通知避免通知爆炸,且使其便于更改、维护。(如时间允许做一下 uid 缓存和更好的接口返回错误判断)
目前已更新修复被夹微博导致的错误和微博故事显示其封面。(下月重构后会支持显示其内容)
最近状态不太好 抽个奖冲冲

iko - 应用图标替换(iOS 14+,限国区兑换) 抽奖活动已发布
参与关键词:年底了 祝大家 考的全对 蒙的全会 诸事顺利 万事顺心

已抽完。
🐟

几点基础安全相关的想法与可能有用的提示:

1. 使用非自写脚本时请简单浏览检查一下是否有恶意发送「非相关请求」至「不明链接」,特别注意是否非正常使用了自己的身份验证信息,如 cookie、token、password。

2. 基于 1,请不要随意使用不受信任的第三方 API,请勿随意传播、使用相关脚本。若是信任的接口,可查看其说明自行尝试写简单脚本或按其说明使用。

3. 基于 1,请不要使用「任何」需要使用自己身份验证信息的第三方 API,如链接中直接使用自己 cookie、password 的 API(无论加密与否)。若自己非要使用,请使用完全独立的账号密码且此服务应不与任何其他服务链接。

4. 基于 1,请不要使用自己无法简单检查的脚本,如不明 exe 等打包后的软件、被加密混淆且自己无能力研究的脚本等。对于不明打包后的软件,可以尝试先利用常见杀毒软件紧张扫描,在非完全信任的前提下请勿忽略其报毒信息。

5. 基于 4,若自己非要使用第三方、不明打包后的软件,请注意是否使用了自己的身份验证信息。如未使用,可尝试在虚拟机、可抛弃无其他重要服务的云端使用;如其使用了自己的身份验证信息,在不信任的前提下请直接弃用。

https://mp.weixin.qq.com/s/DvHxND_0gSRIPiAMZKQ7iw
zZPiglet
Photo
通知版「豆瓣·电影日历」复活(顺便之前好像更新了自定义跳转),感谢 @Neurogram 大佬 JSBox 小组件脚本 Dougets 提供绕过加密验证的思路。

最初练习写脚本时接到群成员需求觉得有意思就研究了一下,通过重放发现其为“抽查”的形式来验证加密,故删除了相关接口中的加密验证信息(_sig),通过不断重试的方式绕过加密。脚本发出使用一段时间后豆瓣对此接口开始全面验证加密,查找一些信息(Douya _sigDouya FRODO_SECRET)后发现需要在非 nodejs 的环境中实现一个 js 处理这个加密比较麻烦(Quantumult X 1.0.19 (480) 的测试版好像可以有办法处理了?),后因个人时间精力问题搁置了该脚本。近期狗哥发布了模拟豆瓣官方小组件的 JSBox 小组件 Dougets,学习后发现可以写死一组通过验证的加密信息 _sig(签名验证) 和 _ts(时间戳)来绕过加密,其实在对 Douya 项目的学习中就发现只验证了时间戳,但是由于相关接口中还含有 yyyy-MM-dd 形的日期信息,本能以为会通过日期信息同步验证时间戳,没想到当初他们堵住“抽查”验证时依旧没有完成强加密验证。

比较有意思的是,在这一年多学习写脚本的过程中,发现了许多公司在加密验证这个事上的「迷惑行为」,非常常见的有有完整的几套加密体系,却在一些接口不进行验证。这种行为可能有某些解释,但是还有一种是有加密体系,并进行了验证,但这些加密实际上并没有起到作用,如此次的「豆瓣·电影日历」的相关接口。再比如滴滴出行中的「滴滴橙心果园」,抓包分析后可以很容易发现请求体中的信息几乎都被加密了,比较容易从形式上看出其中的 params 参数是 Base64 后的结果,故通过解码可以得到正常信息,但 sign 参数可能为 MD5 加密后的信息,几乎不可通过解密得到正常信息,只能通过一些别的手段去得到如何计算这个 MD5 值。但有意思的是,其中 ts 参数并不是时间戳这种恒变的参数,而是类似于“操作次数”的记录,而“操作次数”在请求了进入这个游戏的初始化接口后会重置。所以很容易可以产生一个思路,在相同的“操作次数”进行相同的操作,是否可以直接利用之前的 sign 参数呢?重放验证后答案是肯定的,这样也就绕过了这个加密。其中迷惑行为一在某些情况写可以理解,而迷惑行为二我个人认为只是他们单纯的没能理解加密或如何加密。

依旧是个人时间精力问题,还是会做一只随缘更新的🐦,最近比较想🐦一期这一年多折腾这些的经验讨论。

附:
Quantumult X 1.0.19 (480) 测试内容:
- Script 类型 HTTP rewrite 支持二进制数据修改,增加类型为 ArrayBuffer 的传入参数 $response.bodyBytes 与 $request.bodyBytes(需 iOS 14.0 及以上)
- 同时 $task.fetch 响应体亦支持类型为 ArrayBuffer 的参数 bodyBytes(需 iOS 14.0 及以上)
- 示例参见 https://raw.githubusercontent.com/crossutility/Quantumult-X/master/sample-bytes-rewrite.js
- 部分界面调整

附 2:
此豆瓣接口签名缺失会返回错误代码 997,签名错误则会返回 996。
1👍1
走路活动已上传,更新 DiDi_new 使用脚本推荐时间即可,限定晚八点 [-10s, +60s] 间(原抢券时间)运行可获得,随机步数,建议关闭 App 或小程序中的从设备或微信同步步数。🐦

仔细看字哦。
👍1