feat: check+contribution

This commit is contained in:
lisonge
2023-09-03 18:30:48 +08:00
parent 8577eb9f3a
commit 1f52a4d25e
92 changed files with 573 additions and 278 deletions

218
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,218 @@
# 编写订阅贡献指南
很高兴能有更多人参与到本项目默认订阅规则的开发中
需要: 一台 Android 设备, 一台电脑(可选)
## 环境搭建(无电脑跳过)
本项目基于 nodejs + typescript
- 安装 [nodejs](https://nodejs.org/) 或者 [volta](https://volta.sh/)
- 安装 [pnpm](https://pnpm.io/zh/installation)
- 建议安装 [Visual Studio Code](https://code.visualstudio.com/)
- Fork 本项目, 然后 Clone 至本地, 切换到项目根目录,安装依赖 `pnpm install`
## 开始
首先我们需要给需要添加规则的APP打快照, 也就是把APP的广告截图节点信息给保存下来 <https://gkd-kit.gitee.io/import/12505276>
首先打开APP-主页 -允许无障碍授权
Android>=11 的无障碍可以自己截屏, 所以如果你的设备不满足 Android>=11, 需要额外开启 高级设置-截屏服务
有 3 种方式打快照
- 通过悬浮窗按钮: 高级设置-允许悬浮窗授权 - 然后回到APP开启悬浮窗服务, 此时界面会出现一个截屏按钮, 点击这个按钮即可打快照
- 通过按键快照: 高级设置-打开按键快照, 按下音量健即可打快照
- 网页端审查工具: 打开网页端审查工具连接设备-点击快照按钮即可打快照, 网页端审查工具的使用在下面说明
我们以 WPS 为例子, WPS 首页文档列表有一个广告, 我们先给 WPS 打一个快照, 然后使用 网页审查工具 编写测试规则订阅 关闭这个广告
打开 WPS, 然后使用上面 3 种方式之一打快照, 然后打开设置-高级设置-快照记录, 可以看到已经有了一个快照记录
<details close>
<summary>截图: 快照记录</summary>
![image](https://github.com/gkd-kit/subscription/assets/38517192/ea86d3eb-00c4-44aa-b4a8-a42c08052404)
</details>
如果你没有电脑, 可以点击快照-分享-此时会分享一个zip文件, 截图和节点信息全在里面, 可以分享到某个云盘或者保存到本地, 然后在 [subscription/issues/new](https://github.com/gkd-kit/subscription/issues/new) 上传这个 zip 或者填写分享链接, 然后提出问题, 项目维护者会帮助你处理这个快照
<details close>
<summary>截图: 分享快照</summary>
![image](https://github.com/gkd-kit/subscription/assets/38517192/8f37ce6b-4027-4679-988f-27730f60c971)
</details>
有电脑, 接下来我们将使用 网页审查工具 <https://github.com/gkd-kit/inspect>
首先让 Android 设备 和 电脑 处于同一个局域网(连接同一个WIFI), 也可以 Android 开热点, 然后电脑连接这个热点
打开 APP 主页-设置-高级设置-HTTP服务, 此时 HTTP 服务底部出现一条地址 `http://192.168.1.3:8888`
<details close>
<summary>示例: HTTP服务</summary>
![image](https://github.com/gkd-kit/subscription/assets/38517192/27aa1a3a-4096-4a0e-97ca-27a709645bba)
</details>
安装油猴脚本 <https://github.com/gkd-kit/network-extension>, 因为浏览器不允许 https 去连接 http 域名, 可以通过油猴脚本绕过这个限制
浏览器打开 <https://gkd-kit.gitee.io>, 然后在这个网站启用油猴脚本的注入功能, 然后点击右上角 Android 小图标去连接设备
在设置页面左上角输入上诉地址 `http://192.168.1.3:8888`, 然后点击 `刷新连接`, 即可成功连接设备
![image](https://github.com/gkd-kit/subscription/assets/38517192/d3a956ca-f54b-4d9d-a2ae-3792b5a18aa4)
可以看到第一个项目就是我们刚刚在 WPS 打的快照, 点击这个项目右侧的 `查看` 按钮
我们就能在电脑上审查 <https://gkd-kit.gitee.io/import/12505286> 这个快照
## 审查快照
很明显我们只需要点击文字 `小米·广告` 右侧关闭图标即可
![image](https://github.com/gkd-kit/subscription/assets/38517192/96c78639-d304-4950-80f2-2b8f23cdaf36)
我们把鼠标直接放到这个图标上去, 然后点击它, 可以看到中间的节点树已经展开, 右侧也出现了属性列表
很明显这个图标按钮具有一个唯一的 id `com.mopub.ad.xiaomi:id/nativeclose`, 接下来编写一个简单的规则去点击它
那么先去了解一下这个选择器 <https://github.com/gkd-kit/selector>, 如果你写过 CSS, 应该对这个选择器很熟悉
了解完了之后, 编写的选择器也很简单 `[id="com.mopub.ad.xiaomi:id/nativeclose"]`
接下来测试这个选择器能否选中这个图标按钮, 点击审查工具的 选择器查询, 输入刚刚这个规则, 然后点击查询
![image](https://github.com/gkd-kit/subscription/assets/38517192/3aea04fd-da91-4f43-a79e-e40fdad4a5d4)
很明显这个选择器是有效的, 那么我们去真机测试这个选择器到底行8行
回到刚刚的设备连接页面, 点击顶部的 `执行选择器` 按钮, 然后手机回到 WPS 界面等待出现广告
点击执行选择器确定按钮, 发现提示 `无点击目标`, 这是为什么呢, 我们对这个页面再打一个快照看看
<https://gkd-kit.gitee.io/import/12505350> 鼠标移动到截图里的广告关闭按钮上去点击后查看节点树和属性面板
发现这个图标按钮的属性id已经变成了 `cn.wps.moffice_eng:id/nativeclose`, 于是我们需要扩展一下刚刚的选择器, 确保两个按钮都能选中
把这个选择器改成 `[id$="/nativeclose"]`, 这样两个节点都能选上
回到网页端设备连接界面-执行选择器-输入 `[id$="/nativeclose"]` 点击确认
![2023-09-03_15-24-55](https://github.com/gkd-kit/subscription/assets/38517192/113219f1-164c-40c9-bf76-a9b2a3f66503)
可以看到点击成功了, 但是出现了另外一个弹窗了, 叫你选择关闭原因, 这时我们直接点击网页端的快照按钮得到新快照 <https://gkd-kit.gitee.io/import/12505365>
点击截图里的 `关闭当前广告`, 查看属性面板, 编写测试选择器 `[text="关闭当前广告"]`, 去执行 执行选择器
![2023-09-03_15-31-18](https://github.com/gkd-kit/subscription/assets/38517192/ab99c7fb-6e7d-45de-b969-58db41519df7)
那么选择器部分就基本没问题了, 接下来实时编写规则
## 编写订阅
订阅规则各个属性作用可以查看 [types.ts](https://github.com/gkd-kit/subscription/blob/main/src/types.ts)
打开浏览器设备连接页面-点击修改内存订阅, 输入如下内容, 然后点击确认
```text
// 订阅使用 JSON5 语法, 根节点可以是数组也可以是对象
{
id: 'cn.wps.moffice_eng',
name: 'WPS',
groups: [
{
key: 1,
name: '首页-文档列表广告',
activityIds: ['cn.wps.moffice.main.StartPublicActivity', 'cn.wps.moffice.main.local.HomeRootActivity'],
rules: [
{
matches: '[text="关闭当前广告"]',
snapshotUrls: 'https://gkd-kit.gitee.io/import/12505365',
},
{
matches: '[id$="/ll_close"]',
snapshotUrls: [
'https://gkd-kit.gitee.io/import/12505350',
'https://gkd-kit.gitee.io/import/12505286',
],
},
],
},
],
}
```
此时回到APP首页-订阅, 会发现多了一条订阅
![image](https://github.com/gkd-kit/subscription/assets/38517192/89413281-4ad3-4c9c-aee5-97eb9da4bcd0)
接下来把 WPS 清除全部数据后重新打开, 可以看到规则已经生效, 广告已经被自动关闭
![2023-09-03_15-55-18](https://github.com/gkd-kit/subscription/assets/38517192/57787554-0443-4bc0-9f29-1759aae07b9b)
当你关闭 HTTP 服务器时, 这个内存订阅也会被清除
## 提交代码
如果你要添加 APP 不存在本项目, 那么需要在 [apps](https://github.com/gkd-kit/subscription/tree/main/src/apps) 目录下新建文件 xxx.ts, xxx 是 appId 比如 WPS 是 cn.wps.moffice_eng.ts
这个文件的初始内容是
```ts
import { defineAppConfig } from '../types';
export default defineAppConfig({
id: 'cn.wps.moffice_eng',
name: 'WPS',
groups: [],
});
```
然后在的 group 节点后添加你的规则及其快照链接, 文件内容变成
```ts
import { defineAppConfig } from '../types';
export default defineAppConfig({
id: 'cn.wps.moffice_eng',
name: 'WPS',
groups: [
{
key: 1,
name: '首页-文档列表广告',
exampleUrls: [
'https://github.com/gkd-kit/subscription/assets/38517192/57787554-0443-4bc0-9f29-1759aae07b9b',
],
activityIds: [
'cn.wps.moffice.main.StartPublicActivity',
'cn.wps.moffice.main.local.HomeRootActivity',
],
rules: [
{
matches: '[text="关闭当前广告"]',
snapshotUrls: 'https://gkd-kit.gitee.io/import/12505365',
},
{
matches: '[id$="/nativeclose"]',
snapshotUrls: [
'https://gkd-kit.gitee.io/import/12505350',
'https://gkd-kit.gitee.io/import/12505286',
],
},
],
},
],
});
```
注意每个规则一定要添加快照链接, 否则后期维护根本不知道这个规则到底点的是啥
然后运行校验命令 `npm run check`, 它会检测你的规则是否书写正确, 也会检测每个选择器语法是否正确
然后提交这个文件发起 pr 即可

View File

@@ -2,7 +2,9 @@
搞快点 APP 默认订阅规则 搞快点 APP 默认订阅规则
当前订阅文件已适配 81 个 APP, 共有 136 规则组 当前订阅文件已适配 81 个 APP, 共有 137 规则组
如何编写订阅/贡献此项目 -> [CONTRIBUTING.md](./CONTRIBUTING.md)
## 适配 APP 列表 ## 适配 APP 列表
@@ -26,6 +28,11 @@
### [cn.wps.moffice_eng](/src/apps/cn.wps.moffice_eng.ts) - WPS ### [cn.wps.moffice_eng](/src/apps/cn.wps.moffice_eng.ts) - WPS
- 开屏广告 - 开屏广告
- 首页-文档列表广告
- [示例-0](https://github.com/gkd-kit/subscription/assets/38517192/57787554-0443-4bc0-9f29-1759aae07b9b)
- [快照-0](https://gkd-kit.gitee.io/import/12505365)
- [快照-1](https://gkd-kit.gitee.io/import/12505350)
- [快照-2](https://gkd-kit.gitee.io/import/12505286)
### [com.MobileTicket](/src/apps/com.MobileTicket.ts) - 铁路12306 ### [com.MobileTicket](/src/apps/com.MobileTicket.ts) - 铁路12306
@@ -33,7 +40,7 @@
### [com.UCMobile](/src/apps/com.UCMobile.ts) - UC浏览器 ### [com.UCMobile](/src/apps/com.UCMobile.ts) - UC浏览器
- 开屏广告 - 开屏广告 - 空规则组-待实现
- 推荐页广告 - 推荐页广告
### [com.achievo.vipshop](/src/apps/com.achievo.vipshop.ts) - 唯品会 ### [com.achievo.vipshop](/src/apps/com.achievo.vipshop.ts) - 唯品会

View File

@@ -4,6 +4,8 @@
当前订阅文件已适配 --APP_SIZE-- 个 APP, 共有 --GROUP_SIZE-- 规则组 当前订阅文件已适配 --APP_SIZE-- 个 APP, 共有 --GROUP_SIZE-- 规则组
如何编写订阅/贡献此项目 -> [CONTRIBUTING.md](./CONTRIBUTING.md)
## 适配 APP 列表 ## 适配 APP 列表
--APP_LIST-- --APP_LIST--

33
dist/gkd.json vendored
View File

@@ -1,7 +1,7 @@
{ {
"id": 0, "id": 0,
"name": "默认订阅", "name": "默认订阅",
"version": 44, "version": 45,
"author": "lisonge", "author": "lisonge",
"supportUri": "https://github.com/gkd-kit/subscription", "supportUri": "https://github.com/gkd-kit/subscription",
"apps": [ "apps": [
@@ -82,6 +82,30 @@
"name": "开屏广告", "name": "开屏广告",
"activityIds": "cn.wps.moffice.documentmanager.PreStartActivity", "activityIds": "cn.wps.moffice.documentmanager.PreStartActivity",
"rules": "[id=`cn.wps.moffice_eng:id/splash_skip`]" "rules": "[id=`cn.wps.moffice_eng:id/splash_skip`]"
},
{
"key": 1,
"name": "首页-文档列表广告",
"exampleUrls": [
"https://github.com/gkd-kit/subscription/assets/38517192/57787554-0443-4bc0-9f29-1759aae07b9b"
],
"activityIds": [
"cn.wps.moffice.main.StartPublicActivity",
"cn.wps.moffice.main.local.HomeRootActivity"
],
"rules": [
{
"matches": "[text=\"关闭当前广告\"]",
"snapshotUrls": "https://gkd-kit.gitee.io/import/12505365"
},
{
"matches": "[id$=\"/nativeclose\"]",
"snapshotUrls": [
"https://gkd-kit.gitee.io/import/12505350",
"https://gkd-kit.gitee.io/import/12505286"
]
}
]
} }
] ]
}, },
@@ -104,6 +128,7 @@
{ {
"key": -1, "key": -1,
"name": "开屏广告", "name": "开屏广告",
"desc": "空规则组-待实现",
"activityIds": "com.uc.browser.InnerUCMobile" "activityIds": "com.uc.browser.InnerUCMobile"
}, },
{ {
@@ -1046,12 +1071,12 @@
"key": 2, "key": 2,
"name": "关闭不感兴趣广告弹窗", "name": "关闭不感兴趣广告弹窗",
"activityIds": "com.sina.weibo.view.bottomsheet.dialog.", "activityIds": "com.sina.weibo.view.bottomsheet.dialog.",
"rules": [ "rules": {
[ "matches": [
"[text=\"为何会看到此广告\"]", "[text=\"为何会看到此广告\"]",
"[text=\"不感兴趣\"]" "[text=\"不感兴趣\"]"
] ]
] }
} }
] ]
}, },

View File

@@ -1,7 +1,7 @@
{ {
"name": "@gkd-kit/subscription", "name": "@gkd-kit/subscription",
"type": "module", "type": "module",
"version": "0.0.44", "version": "0.0.45",
"main": "./dist/gkd.json", "main": "./dist/gkd.json",
"unpkg": "./dist/gkd.json", "unpkg": "./dist/gkd.json",
"jsdelivr": "./dist/gkd.json", "jsdelivr": "./dist/gkd.json",
@@ -13,7 +13,8 @@
"./dist" "./dist"
], ],
"scripts": { "scripts": {
"build": "tsx ./src/main.ts" "build": "tsc --noEmit && tsx ./scripts/build.ts",
"check": "tsc --noEmit && tsx ./scripts/check.ts"
}, },
"devDependencies": { "devDependencies": {
"@gkd-kit/selector": "0.0.11", "@gkd-kit/selector": "0.0.11",

4
scripts/build.ts Normal file
View File

@@ -0,0 +1,4 @@
import subsConfig from '../src/config';
import { writeConfig } from '../src/file';
await writeConfig(process.cwd() + `/dist/gkd.json`, subsConfig);

7
scripts/check.ts Normal file
View File

@@ -0,0 +1,7 @@
import subsConfig from '../src/config';
import { checkConfig } from '../src/file';
import picocolors from 'picocolors';
checkConfig(subsConfig);
console.log(picocolors.green(`校验成功, 合法订阅`));

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'air.tv.douyu.android', id: 'air.tv.douyu.android',
name: `斗鱼`, name: `斗鱼`,
groups: [ groups: [
@@ -42,4 +42,4 @@ export default <AppConfig>{
rules: '[text="立即升级"] - [text="忽略"][clickable=true]', rules: '[text="立即升级"] - [text="忽略"][clickable=true]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'cmb.pb', id: 'cmb.pb',
name: '招商银行', name: '招商银行',
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`cmb.pb:id/ll_launch_ad_skip_hot_area`]', rules: '[id=`cmb.pb:id/ll_launch_ad_skip_hot_area`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'cn.damai', id: 'cn.damai',
name: `大麦`, name: `大麦`,
groups: [ groups: [
@@ -12,4 +12,4 @@ export default <AppConfig>{
snapshotUrls: `https://gkd-kit.gitee.io/import/38517192/38859663-6f0c-48b1-9392-20ae937a8c9e`, snapshotUrls: `https://gkd-kit.gitee.io/import/38517192/38859663-6f0c-48b1-9392-20ae937a8c9e`,
}, },
], ],
}; });

View File

@@ -1,8 +1,8 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'cn.wps.moffice_eng', id: 'cn.wps.moffice_eng',
name: `WPS`, name: 'WPS',
groups: [ groups: [
{ {
key: 0, key: 0,
@@ -10,5 +10,29 @@ export default <AppConfig>{
activityIds: 'cn.wps.moffice.documentmanager.PreStartActivity', activityIds: 'cn.wps.moffice.documentmanager.PreStartActivity',
rules: '[id=`cn.wps.moffice_eng:id/splash_skip`]', rules: '[id=`cn.wps.moffice_eng:id/splash_skip`]',
}, },
{
key: 1,
name: '首页-文档列表广告',
exampleUrls: [
'https://github.com/gkd-kit/subscription/assets/38517192/57787554-0443-4bc0-9f29-1759aae07b9b',
],
activityIds: [
'cn.wps.moffice.main.StartPublicActivity',
'cn.wps.moffice.main.local.HomeRootActivity',
],
rules: [
{
matches: '[text="关闭当前广告"]',
snapshotUrls: 'https://gkd-kit.gitee.io/import/12505365',
},
{
matches: '[id$="/nativeclose"]',
snapshotUrls: [
'https://gkd-kit.gitee.io/import/12505350',
'https://gkd-kit.gitee.io/import/12505286',
],
},
],
},
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.MobileTicket', id: 'com.MobileTicket',
name: `铁路12306`, name: `铁路12306`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.MobileTicket:id/tv_skip`]', rules: '[id=`com.MobileTicket:id/tv_skip`]',
}, },
], ],
}; });

View File

@@ -1,12 +1,13 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.UCMobile', id: 'com.UCMobile',
name: `UC浏览器`, name: `UC浏览器`,
groups: [ groups: [
{ {
key: -1, key: -1,
name: `开屏广告`, name: `开屏广告`,
desc: `空规则组-待实现`,
activityIds: `com.uc.browser.InnerUCMobile`, activityIds: `com.uc.browser.InnerUCMobile`,
// TODO // TODO
}, },
@@ -20,4 +21,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.achievo.vipshop', id: 'com.achievo.vipshop',
name: `唯品会`, name: `唯品会`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.achievo.vipshop:id/adv_countdown`]', rules: '[id=`com.achievo.vipshop:id/adv_countdown`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.alibaba.wireless', id: 'com.alibaba.wireless',
name: `阿里巴巴`, name: `阿里巴巴`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.alibaba.wireless:id/v5_splash_over`]', rules: '[id=`com.alibaba.wireless:id/v5_splash_over`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.android.bankabc', id: 'com.android.bankabc',
name: `中国农业银行`, name: `中国农业银行`,
groups: [ groups: [
@@ -12,4 +12,4 @@ export default <AppConfig>{
snapshotUrls: `https://gkd-kit.gitee.io/import/38517192/3653218a-e0e0-4a60-8308-dea5fd4179b3`, snapshotUrls: `https://gkd-kit.gitee.io/import/38517192/3653218a-e0e0-4a60-8308-dea5fd4179b3`,
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.android.thememanager', id: 'com.android.thememanager',
name: `miui主题壁纸`, name: `miui主题壁纸`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.android.thememanager:id/ad_close_btn`]', rules: '[id=`com.android.thememanager:id/ad_close_btn`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.anjuke.android.app', id: 'com.anjuke.android.app',
name: `安居客`, name: `安居客`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.anjuke.android.app:id/skip_btn`]', rules: '[id=`com.anjuke.android.app:id/skip_btn`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.baidu.BaiduMap', id: 'com.baidu.BaiduMap',
name: `百度地图`, name: `百度地图`,
groups: [ groups: [
@@ -14,4 +14,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.baidu.homework', id: 'com.baidu.homework',
name: `作业帮`, name: `作业帮`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.baidu.homework:id/adx_splash_skip_text`]', rules: '[id=`com.baidu.homework:id/adx_splash_skip_text`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.baidu.netdisk', id: 'com.baidu.netdisk',
name: `百度网盘`, name: `百度网盘`,
groups: [ groups: [
@@ -18,4 +18,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.baidu.tieba', id: 'com.baidu.tieba',
name: `百度贴吧`, name: `百度贴吧`,
groups: [ groups: [
@@ -78,4 +78,4 @@ export default <AppConfig>{
snapshotUrls: `https://gkd-kit.gitee.io/import/12496934`, snapshotUrls: `https://gkd-kit.gitee.io/import/12496934`,
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.baidutieba.davy', id: 'com.baidutieba.davy',
name: '贴吧一键签到大师', name: '贴吧一键签到大师',
groups: [ groups: [
@@ -30,4 +30,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.bjsk.intelligent', id: 'com.bjsk.intelligent',
name: `WiFi智能钥匙`, name: `WiFi智能钥匙`,
groups: [ groups: [
@@ -23,4 +23,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.cmcc.cmvideo', id: 'com.cmcc.cmvideo',
name: `咪咕视频`, name: `咪咕视频`,
groups: [ groups: [
@@ -25,4 +25,4 @@ export default <AppConfig>{
snapshotUrls: `https://gkd-kit.gitee.io/import/12498315`, snapshotUrls: `https://gkd-kit.gitee.io/import/12498315`,
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.coolapk.market', id: 'com.coolapk.market',
name: `酷安`, name: `酷安`,
groups: [ groups: [
@@ -48,4 +48,4 @@ export default <AppConfig>{
rules: '[text=`立即更新`] - [text=`取消`]', rules: '[text=`立即更新`] - [text=`取消`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.copymanga.app', id: 'com.copymanga.app',
name: '拷貝漫畫', name: '拷貝漫畫',
groups: [ groups: [
@@ -62,4 +62,4 @@ export default <AppConfig>{
}, },
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.ct.client', id: 'com.ct.client',
name: `中国电信`, name: `中国电信`,
groups: [ groups: [
@@ -14,4 +14,4 @@ export default <AppConfig>{
rules: '[id=`com.ct.client:id/tvSkip`]', rules: '[id=`com.ct.client:id/tvSkip`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.daimajia.gold', id: 'com.daimajia.gold',
name: `稀土掘金`, name: `稀土掘金`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.daimajia.gold:id/fl_skip`]', rules: '[id=`com.daimajia.gold:id/fl_skip`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.dianping.v1', id: 'com.dianping.v1',
name: `大众点评`, name: `大众点评`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.dianping.v1:id/new_skip`]', rules: '[id=`com.dianping.v1:id/new_skip`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.douban.frodo', id: 'com.douban.frodo',
name: '豆瓣', name: '豆瓣',
groups: [ groups: [
@@ -15,4 +15,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.dragon.read', id: 'com.dragon.read',
name: `番茄免费小说`, name: `番茄免费小说`,
groups: [ groups: [
@@ -19,4 +19,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.duokan.phone.remotecontroller', id: 'com.duokan.phone.remotecontroller',
name: `万能遥控`, name: `万能遥控`,
groups: [ groups: [
@@ -13,4 +13,4 @@ export default <AppConfig>{
'ImageView[id=`com.duokan.phone.remotecontroller:id/image_close_banner`]', 'ImageView[id=`com.duokan.phone.remotecontroller:id/image_close_banner`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.duowan.kiwi', id: 'com.duowan.kiwi',
name: `虎牙直播`, name: `虎牙直播`,
groups: [ groups: [
@@ -24,4 +24,4 @@ export default <AppConfig>{
'[id=`com.duowan.kiwi:id/hyui_dialog_button_positive`][text=`我知道了`]', '[id=`com.duowan.kiwi:id/hyui_dialog_button_positive`][text=`我知道了`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.google.android.youtube', id: 'com.google.android.youtube',
name: `youtube`, name: `youtube`,
groups: [ groups: [
@@ -12,4 +12,4 @@ export default <AppConfig>{
rules: '[id=`com.google.android.youtube:id/skip_ad_button`]', rules: '[id=`com.google.android.youtube:id/skip_ad_button`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.gotokeep.keep', id: 'com.gotokeep.keep',
name: `Keep`, name: `Keep`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.gotokeep.keep:id/textSkip`]', rules: '[id=`com.gotokeep.keep:id/textSkip`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.greenpoint.android.mc10086.activity', id: 'com.greenpoint.android.mc10086.activity',
name: `中国移动`, name: `中国移动`,
groups: [ groups: [
@@ -12,4 +12,4 @@ export default <AppConfig>{
'[id=`com.greenpoint.android.mc10086.activity:id/video_time_skip`]', '[id=`com.greenpoint.android.mc10086.activity:id/video_time_skip`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.handsgo.jiakao.android', id: 'com.handsgo.jiakao.android',
name: `驾考宝典`, name: `驾考宝典`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.handsgo.jiakao.android:id/closeLayout`]', rules: '[id=`com.handsgo.jiakao.android:id/closeLayout`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.hunantv.imgo.activity', id: 'com.hunantv.imgo.activity',
name: `芒果TV`, name: `芒果TV`,
groups: [ groups: [
@@ -44,4 +44,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.hupu.shihuo', id: 'com.hupu.shihuo',
name: `识货`, name: `识货`,
groups: [ groups: [
@@ -12,4 +12,4 @@ export default <AppConfig>{
rules: '[id=`com.hupu.shihuo:id/fl_countdown`]', rules: '[id=`com.hupu.shihuo:id/fl_countdown`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.hxak.liangongbao', id: 'com.hxak.liangongbao',
name: `链工宝`, name: `链工宝`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.hxak.liangongbao:id/time_down`]', rules: '[id=`com.hxak.liangongbao:id/time_down`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.icbc', id: 'com.icbc',
name: `中国工商银行`, name: `中国工商银行`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.icbc:id/close_btn`]', rules: '[id=`com.icbc:id/close_btn`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.intsig.camscanner', id: 'com.intsig.camscanner',
name: `扫描全能王`, name: `扫描全能王`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.intsig.camscanner:id/tv_drop_cnl_close_new`]', rules: '[id=`com.intsig.camscanner:id/tv_drop_cnl_close_new`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.iqiyi.hotchat', id: 'com.iqiyi.hotchat',
name: `爱奇艺热聊`, name: `爱奇艺热聊`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.iqiyi.hotchat:id/tv_advertisement_lunch_skip`]', rules: '[id=`com.iqiyi.hotchat:id/tv_advertisement_lunch_skip`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.jym.mall', id: 'com.jym.mall',
name: `交易猫`, name: `交易猫`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
snapshotUrls: `https://gkd-kit.gitee.io/import/12496974`, snapshotUrls: `https://gkd-kit.gitee.io/import/12496974`,
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.kmxs.reader', id: 'com.kmxs.reader',
name: `七猫免费小说`, name: `七猫免费小说`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.kmxs.reader:id/young_dialog_close`]', rules: '[id=`com.kmxs.reader:id/young_dialog_close`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.kuaikan.comic', id: 'com.kuaikan.comic',
name: `快看`, name: `快看`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.kuaikan.comic:id/skip_button`]', rules: '[id=`com.kuaikan.comic:id/skip_button`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.kugou.android', id: 'com.kugou.android',
name: `酷狗音乐`, name: `酷狗音乐`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[desc=`跳过`]', rules: '[desc=`跳过`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.kwai.videoeditor', id: 'com.kwai.videoeditor',
name: `快影`, name: `快影`,
groups: [ groups: [
@@ -12,4 +12,4 @@ export default <AppConfig>{
snapshotUrls: `https://gkd-kit.gitee.io/import/38517192/d12c3b08-8233-4584-b2b9-595ebb4ce665`, snapshotUrls: `https://gkd-kit.gitee.io/import/38517192/d12c3b08-8233-4584-b2b9-595ebb4ce665`,
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.mihoyo.hyperion', id: 'com.mihoyo.hyperion',
name: `米游社`, name: `米游社`,
groups: [ groups: [
@@ -21,4 +21,4 @@ export default <AppConfig>{
rules: 'TextView[id=`com.mihoyo.hyperion:id/tv_dialog_i_know`]', rules: 'TextView[id=`com.mihoyo.hyperion:id/tv_dialog_i_know`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.miui.player', id: 'com.miui.player',
name: `小米音乐`, name: `小米音乐`,
groups: [ groups: [
@@ -12,4 +12,4 @@ export default <AppConfig>{
'@TextView[text$=`跳过`] + TextView[id=`com.miui.player:id/ad_view`]', '@TextView[text$=`跳过`] + TextView[id=`com.miui.player:id/ad_view`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.miui.systemAdSolution', id: 'com.miui.systemAdSolution',
name: `miui系统广告`, name: `miui系统广告`,
groups: [ groups: [
@@ -17,4 +17,4 @@ export default <AppConfig>{
rules: '[id=`com.miui.systemAdSolution:id/no_interest`]', rules: '[id=`com.miui.systemAdSolution:id/no_interest`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.mt.mtxx.mtxx', id: 'com.mt.mtxx.mtxx',
name: `美图秀秀`, name: `美图秀秀`,
groups: [ groups: [
@@ -12,4 +12,4 @@ export default <AppConfig>{
snapshotUrls: `https://gkd-kit.gitee.io/import/38517192/1f56aa17-c290-4e56-b6fb-a94bc778448b`, snapshotUrls: `https://gkd-kit.gitee.io/import/38517192/1f56aa17-c290-4e56-b6fb-a94bc778448b`,
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.netease.cloudmusic', id: 'com.netease.cloudmusic',
name: `网易云音乐`, name: `网易云音乐`,
groups: [ groups: [
@@ -29,4 +29,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.qidian.QDReader', id: 'com.qidian.QDReader',
name: `起点读书`, name: `起点读书`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: 'Button[text^=`跳过`]', rules: 'Button[text^=`跳过`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.qiyi.video', id: 'com.qiyi.video',
name: `爱奇艺`, name: `爱奇艺`,
groups: [ groups: [
@@ -27,4 +27,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.quark.browser', id: 'com.quark.browser',
name: `夸克浏览器`, name: `夸克浏览器`,
groups: [ groups: [
@@ -14,4 +14,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.sankuai.meituan.takeoutnew', id: 'com.sankuai.meituan.takeoutnew',
name: `美团外卖`, name: `美团外卖`,
groups: [ groups: [
@@ -28,4 +28,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.sankuai.meituan', id: 'com.sankuai.meituan',
name: `美团`, name: `美团`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: 'TextView[id=`com.sankuai.meituan:id/close_btn`][text^=`跳过`]', rules: 'TextView[id=`com.sankuai.meituan:id/close_btn`][text^=`跳过`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.sdu.didi.psnger', id: 'com.sdu.didi.psnger',
name: `滴滴`, name: `滴滴`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.sdu.didi.psnger:id/skip_ad_ll`]', rules: '[id=`com.sdu.didi.psnger:id/skip_ad_ll`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.sina.weibo', id: 'com.sina.weibo',
name: `微博`, name: `微博`,
groups: [ groups: [
@@ -20,7 +20,9 @@ export default <AppConfig>{
key: 2, key: 2,
name: `关闭不感兴趣广告弹窗`, name: `关闭不感兴趣广告弹窗`,
activityIds: `com.sina.weibo.view.bottomsheet.dialog.`, activityIds: `com.sina.weibo.view.bottomsheet.dialog.`,
rules: [[`[text="为何会看到此广告"]`, `[text="不感兴趣"]`]], // 1688889362832 rules: {
matches: [`[text="为何会看到此广告"]`, `[text="不感兴趣"]`],
}, // 1688889362832
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.smile.gifmaker', id: 'com.smile.gifmaker',
name: `快手`, name: `快手`,
groups: [ groups: [
@@ -12,4 +12,4 @@ export default <AppConfig>{
'@[id=`com.smile.gifmaker:id/positive`] + [id=`com.smile.gifmaker:id/set_teenage_mode`]', '@[id=`com.smile.gifmaker:id/positive`] + [id=`com.smile.gifmaker:id/set_teenage_mode`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.snda.wifilocating', id: 'com.snda.wifilocating',
name: `WiFi万能钥匙`, name: `WiFi万能钥匙`,
groups: [ groups: [
@@ -28,4 +28,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.ss.android.article.video', id: 'com.ss.android.article.video',
name: `西瓜视频`, name: `西瓜视频`,
groups: [ groups: [
@@ -14,4 +14,4 @@ export default <AppConfig>{
rules: [`TextView[text="我知道了"][clickable=true]`], rules: [`TextView[text="我知道了"][clickable=true]`],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.ss.android.ugc.aweme', id: 'com.ss.android.ugc.aweme',
name: `抖音`, name: `抖音`,
groups: [ groups: [
@@ -10,4 +10,4 @@ export default <AppConfig>{
rules: 'Button[text=`开启青少年模式`] + * > Button[text!=null]', rules: 'Button[text=`开启青少年模式`] + * > Button[text!=null]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: `com.taobao.taobao`, id: `com.taobao.taobao`,
name: `淘宝`, name: `淘宝`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: `[id='com.taobao.taobao:id/close']`, // 1687596777612 rules: `[id='com.taobao.taobao:id/close']`, // 1687596777612
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.tencent.androidqqmail', id: 'com.tencent.androidqqmail',
name: `qq邮箱`, name: `qq邮箱`,
groups: [ groups: [
@@ -14,4 +14,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.tencent.djcity', id: 'com.tencent.djcity',
name: `掌上道聚城`, name: `掌上道聚城`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.tencent.djcity:id/ad_view_ll_skip`]', rules: '[id=`com.tencent.djcity:id/ad_view_ll_skip`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.tencent.karaoke', id: 'com.tencent.karaoke',
name: `全民K歌`, name: `全民K歌`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[text*=`跳过`][id!=null]', rules: '[text*=`跳过`][id!=null]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.tencent.mm', id: 'com.tencent.mm',
name: `微信`, name: `微信`,
groups: [ groups: [
@@ -39,4 +39,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.tencent.mobileqq', id: 'com.tencent.mobileqq',
name: `QQ`, name: `QQ`,
groups: [ groups: [
@@ -33,4 +33,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.tencent.mtt', id: 'com.tencent.mtt',
name: `QQ浏览器`, name: `QQ浏览器`,
groups: [ groups: [
@@ -20,4 +20,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.tencent.qqlive', id: 'com.tencent.qqlive',
name: `腾讯视频`, name: `腾讯视频`,
groups: [ groups: [
@@ -22,4 +22,4 @@ export default <AppConfig>{
'TextView[text*=`青少年模式`] +n TextView[id=`com.tencent.qqlive:id/arg`][text=`我知道了`]', 'TextView[text*=`青少年模式`] +n TextView[id=`com.tencent.qqlive:id/arg`][text=`我知道了`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.tencent.qqmusic', id: 'com.tencent.qqmusic',
name: `QQ音乐`, name: `QQ音乐`,
groups: [ groups: [
@@ -23,4 +23,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.tencent.qt.sns', id: 'com.tencent.qt.sns',
name: `掌上穿越火线`, name: `掌上穿越火线`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.tencent.qt.sns:id/tv_timer`][text$=`跳过`]', rules: '[id=`com.tencent.qt.sns:id/tv_timer`][text$=`跳过`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.xiaomi.market', id: 'com.xiaomi.market',
name: `小米应用商店`, name: `小米应用商店`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: "Button[text='关闭']", rules: "Button[text='关闭']",
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.xiaomi.shop', id: 'com.xiaomi.shop',
name: `小米商城`, name: `小米商城`,
groups: [ groups: [
@@ -14,4 +14,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.ximalaya.ting.android', id: 'com.ximalaya.ting.android',
name: `喜马拉雅`, name: `喜马拉雅`,
groups: [ groups: [
@@ -14,4 +14,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.ximalaya.ting.lite', id: 'com.ximalaya.ting.lite',
name: `喜马拉雅极速版`, name: `喜马拉雅极速版`,
groups: [ groups: [
@@ -19,4 +19,4 @@ export default <AppConfig>{
rules: "[id='com.ximalaya.ting.lite:id/main_ad_top_home_iv_close']", rules: "[id='com.ximalaya.ting.lite:id/main_ad_top_home_iv_close']",
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.xunlei.downloadprovider', id: 'com.xunlei.downloadprovider',
name: `迅雷`, name: `迅雷`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: 'TextView[text^=`跳过`]', rules: 'TextView[text^=`跳过`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.yek.android.kfc.activitys', id: 'com.yek.android.kfc.activitys',
name: `肯德基`, name: `肯德基`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: '[id=`com.yek.android.kfc.activitys:id/splash_tv_3`]', rules: '[id=`com.yek.android.kfc.activitys:id/splash_tv_3`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.yipiao', id: 'com.yipiao',
name: `智行火车票12306抢票`, name: `智行火车票12306抢票`,
groups: [ groups: [
@@ -11,4 +11,4 @@ export default <AppConfig>{
rules: 'LinearLayout > TextView + TextView[text=`跳过`]', rules: 'LinearLayout > TextView + TextView[text=`跳过`]',
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.zhihu.android', id: 'com.zhihu.android',
name: `知乎`, name: `知乎`,
groups: [ groups: [
@@ -101,4 +101,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'com.zidongdianji', id: 'com.zidongdianji',
name: `自动点击器`, name: `自动点击器`,
groups: [ groups: [
@@ -27,4 +27,4 @@ export default <AppConfig>{
], ],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'ctrip.android.view', id: 'ctrip.android.view',
name: `携程旅行`, name: `携程旅行`,
groups: [ groups: [
@@ -12,4 +12,4 @@ export default <AppConfig>{
rules: [`LinearLayout[childCount=2] > TextView + TextView[text="跳过"]`], rules: [`LinearLayout[childCount=2] > TextView + TextView[text="跳过"]`],
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'gov.pianzong.androidnga', id: 'gov.pianzong.androidnga',
name: `NGA玩家社区`, name: `NGA玩家社区`,
groups: [ groups: [
@@ -19,4 +19,4 @@ export default <AppConfig>{
snapshotUrls: `https://gkd-kit.gitee.io/import/12482727`, snapshotUrls: `https://gkd-kit.gitee.io/import/12482727`,
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'li.songe.gkd', id: 'li.songe.gkd',
name: `GKD`, name: `GKD`,
groups: [ groups: [
@@ -9,4 +9,4 @@ export default <AppConfig>{
name: `GKD-空规则组`, name: `GKD-空规则组`,
}, },
], ],
}; });

View File

@@ -1,6 +1,6 @@
import type { AppConfig } from '../types'; import { defineAppConfig } from '../types';
export default <AppConfig>{ export default defineAppConfig({
id: 'tv.danmaku.bili', id: 'tv.danmaku.bili',
name: `B站`, name: `B站`,
groups: [ groups: [
@@ -61,4 +61,4 @@ export default <AppConfig>{
rules: ['[id=`tv.danmaku.bili:id/click_skip`]'], rules: ['[id=`tv.danmaku.bili:id/click_skip`]'],
}, },
], ],
}; });

View File

@@ -1,11 +1,11 @@
import { relativePath, walk, writeConfig } from './file';
import { AppConfig, AppConfigMudule } from './types';
import url from 'node:url';
import path from 'node:path'; import path from 'node:path';
import url from 'node:url';
import picocolors from 'picocolors'; import picocolors from 'picocolors';
import { walk } from './file';
import type { AppConfig, AppConfigMudule, SubscriptionConfig } from './types';
const apps: AppConfig[] = []; const apps: AppConfig[] = [];
for await (const tsFp of walk(relativePath('./apps'))) { for await (const tsFp of walk(process.cwd() + '/src/apps')) {
const mod: AppConfigMudule = await import(url.pathToFileURL(tsFp).href); const mod: AppConfigMudule = await import(url.pathToFileURL(tsFp).href);
const appConfig = mod.default; const appConfig = mod.default;
if (path.basename(tsFp, `.ts`) != appConfig.id) { if (path.basename(tsFp, `.ts`) != appConfig.id) {
@@ -22,11 +22,12 @@ for await (const tsFp of walk(relativePath('./apps'))) {
// a,b,c,d // a,b,c,d
apps.sort((a, b) => (a.id > b.id ? 1 : -1)); apps.sort((a, b) => (a.id > b.id ? 1 : -1));
const subsConfig: SubscriptionConfig = {
await writeConfig(`../dist/gkd.json`, {
id: 0, id: 0,
name: `默认订阅`, name: `默认订阅`,
author: `lisonge`, author: `lisonge`,
supportUri: `https://github.com/gkd-kit/subscription`, supportUri: `https://github.com/gkd-kit/subscription`,
apps, apps,
}); };
export default subsConfig;

View File

@@ -2,14 +2,13 @@ import dayjs from 'dayjs';
import _ from 'lodash'; import _ from 'lodash';
import fs from 'node:fs/promises'; import fs from 'node:fs/promises';
import path from 'node:path'; import path from 'node:path';
import url from 'node:url'; import type selfPkgT from '../package.json';
import selfPkg from '../package.json';
import type { SubscriptionConfig, IArray } from './types';
import { parseSelector } from './selector'; import { parseSelector } from './selector';
import type { IArray, SubscriptionConfig } from './types';
export const relativePath = (p: string) => { const selfPkg: typeof selfPkgT = JSON.parse(
return url.fileURLToPath(new URL(p, import.meta.url)); await fs.readFile(process.cwd() + '/package.json', 'utf-8'),
}; );
const iArrayToArray = <T>(array: IArray<T> = []): T[] => { const iArrayToArray = <T>(array: IArray<T> = []): T[] => {
return Array<T>().concat(array); return Array<T>().concat(array);
@@ -26,10 +25,9 @@ const sortKeys: (keyof SubscriptionConfig)[] = [
]; ];
export const writeConfig = async (fp: string, config: SubscriptionConfig) => { export const writeConfig = async (fp: string, config: SubscriptionConfig) => {
const filePath = relativePath(fp);
const newConfig: SubscriptionConfig = { ...config }; const newConfig: SubscriptionConfig = { ...config };
const oldConfig: SubscriptionConfig = JSON.parse( const oldConfig: SubscriptionConfig = JSON.parse(
await fs.readFile(filePath, 'utf-8').catch(() => `{}`), await fs.readFile(fp, 'utf-8').catch(() => `{}`),
); );
newConfig.version = oldConfig.version ?? 0; newConfig.version = oldConfig.version ?? 0;
@@ -50,11 +48,11 @@ export const writeConfig = async (fp: string, config: SubscriptionConfig) => {
JSON.stringify(Object.fromEntries(map.entries()), void 0, 2), JSON.stringify(Object.fromEntries(map.entries()), void 0, 2),
'utf-8', 'utf-8',
); );
await fs.writeFile(filePath, buffer); await fs.writeFile(fp, buffer);
const newPkg = { ...selfPkg, version: `0.0.` + newConfig.version }; const newPkg = { ...selfPkg, version: `0.0.` + newConfig.version };
await fs.writeFile( await fs.writeFile(
relativePath('../package.json'), process.cwd() + '/package.json',
JSON.stringify(newPkg, void 0, 2) + `\n`, JSON.stringify(newPkg, void 0, 2) + `\n`,
); );
@@ -144,7 +142,7 @@ export const checkConfig = (newConfig: SubscriptionConfig) => {
}; };
export const updateReadMeMd = async (newConfig: SubscriptionConfig) => { export const updateReadMeMd = async (newConfig: SubscriptionConfig) => {
const mdTemplate = await fs.readFile(relativePath('../Template.md'), 'utf-8'); const mdTemplate = await fs.readFile(process.cwd() + '/Template.md', 'utf-8');
const appListText = newConfig.apps const appListText = newConfig.apps
.map((app) => { .map((app) => {
const appMdText = `### [${app.id}](/src/apps/${app.id}.ts) - ${app.name}\n`; const appMdText = `### [${app.id}](/src/apps/${app.id}.ts) - ${app.name}\n`;
@@ -216,5 +214,5 @@ export const updateReadMeMd = async (newConfig: SubscriptionConfig) => {
) )
.replace(`--APP_LIST--`, appListText); .replace(`--APP_LIST--`, appListText);
await fs.writeFile(relativePath(`../README.md`), readMeMdText); await fs.writeFile(process.cwd() + '/README.md', readMeMdText);
}; };

View File

@@ -67,6 +67,11 @@ type GroupConfig = {
* 控制规则默认情况下是启用还是禁用, 默认启用 * 控制规则默认情况下是启用还是禁用, 默认启用
*/ */
enable?: boolean; enable?: boolean;
/**
* string => { matches: string }
*
* string[] => { matches: string }[]
*/
rules?: IArray<RuleConfig | string>; rules?: IArray<RuleConfig | string>;
/** /**
* 当前 规则/规则组 的快照链接, 最好填上, 增强订阅可维护性 * 当前 规则/规则组 的快照链接, 最好填上, 增强订阅可维护性
@@ -145,3 +150,7 @@ export type SubscriptionConfig = {
export const defineSubsConfig = (config: SubscriptionConfig) => { export const defineSubsConfig = (config: SubscriptionConfig) => {
return JSON.stringify(config, undefined, 2); return JSON.stringify(config, undefined, 2);
}; };
export const defineAppConfig = (config: AppConfig) => {
return config;
};

View File

@@ -3,7 +3,7 @@
"target": "ESNext", "target": "ESNext",
"lib": ["ESNext"], "lib": ["ESNext"],
"module": "ESNext", "module": "ESNext",
"moduleResolution": "Node", "moduleResolution": "Bundler",
"resolveJsonModule": true, "resolveJsonModule": true,
"declaration": true, "declaration": true,
"declarationMap": true, "declarationMap": true,
@@ -13,9 +13,5 @@
"strict": true, "strict": true,
"skipLibCheck": true "skipLibCheck": true
}, },
"include": [ "include": ["./src/**/*.ts", "./scripts/**/*.ts", "./types/**/*.ts"]
"./src/**/*.{ts,js,mjs,cjs}",
"./scripts/**/*.ts",
"./types/**/*.ts"
]
} }