Skip to content

Commit

Permalink
feat(core): 实现虚幻引擎版本检测并优化版本扫描功能
Browse files Browse the repository at this point in the history
- 在版本卡片上添加虚幻引擎标识,用于展示匹配的虚幻引擎内置情况
- 优化微信、WeType 和 QQ 测试版的扫描逻辑,支持自定义后缀
- 修复了一些与版本扫描相关的功能问题
- 更新了用户协议中的相关条款
  • Loading branch information
ArcticFoxPro committed Nov 18, 2024
1 parent c5792d4 commit d89438f
Show file tree
Hide file tree
Showing 9 changed files with 145 additions and 54 deletions.
28 changes: 14 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,15 +63,15 @@ QQ 版本列表 Vigor for WeChat MiniProgram 是一个使用 TDesign 组件库
点击卡片将弹出弹出层,可查阅到更为详尽的信息和原始 JSON 字符串信息。
### 猜版 Extended
### 扫版 Extended
在 Android QQ - 首页侧滑菜单 - 设置 - 关于QQ与帮助 中可得知,Android QQ 的版本号通常为 `x.y.z.nnnnn`。其中 `x.y.z` 在这里被称为“主版本号”,而 `nnnnn` 被称为“小版本号”。
在 QQ 版本列表 Vigor 界面,点击右下角“猜版 Extd.”按钮即可进入“猜版 Extended for Android”对话框。
在 QQ 版本列表 Vigor 界面,点击右下角“扫版 Extd.”按钮即可进入“扫版 Extended for Android”对话框。
对话框含有两个输入框和一个开关,分别是“主版本号”、“小版本号”和“测试版猜版”开关。“主版本号”已经预填入了版本列表显示的最新版本号,也可自行修改。
对话框含有两个输入框和一个开关,分别是“主版本号”、“小版本号”和“测试版扫版”开关。“主版本号”已经预填入了版本列表显示的最新版本号,也可自行修改。
- 若“测试版猜版”开关为关时开始猜版,无需填写小版本号,软件将尝试访问以下链接:
- 若“测试版扫版”开关为关时开始扫版,无需填写小版本号,软件将尝试访问以下链接:
- `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_64.apk`
- `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_64_HB.apk`
- `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_64_HB1.apk`
Expand All @@ -84,9 +84,9 @@ QQ 版本列表 Vigor for WeChat MiniProgram 是一个使用 TDesign 组件库
- `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_HB3_64.apk`
- `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>_BBPJ_64.apk`
- 若“测试版猜版”开关为开时,则需要填写起始小版本号后才可开始猜版
- 若“测试版扫版”开关为开时,则需要填写起始小版本号后才可开始扫版
- 默认情况下,软件将尝试访问 `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_<主版本号>.<小版本号>_64.apk` ,若当次访问未果,默认情况下将按照设置逻辑自动递增小版本号后再次尝试访问,直到访问成功为止。
- 在设置中打开扩展测试版猜版格式后,软件将尝试访问以下链接:
- 在设置中打开扩展测试版扫版格式后,软件将尝试访问以下链接:
<details>
<summary>点击展开</summary>
Expand Down Expand Up @@ -117,31 +117,31 @@ QQ 版本列表 Vigor for WeChat MiniProgram 是一个使用 TDesign 组件库
访问成功后,软件会弹出成功对话框,对话框下方提供了一系列动作按钮,分别是“仅停止”、“跳过以继续”和“复制并停止”。
> [!TIP]
> QQ 版本列表 Vigor 自 1.1.0 版本起实验性支持了 Android 微信和 Android 微信输入法的猜版
> QQ 版本列表 Vigor 自 1.1.0 版本起实验性支持了 Android 微信和 Android 微信输入法的扫版
>
> 若选择微信猜版,对话框将变更为三个输入框,分别是“主版本号”、“真实版本号”和“十六进制代码”,对应的直链为:
> 若选择微信扫版,对话框将变更为三个输入框,分别是“主版本号”、“真实版本号”和“十六进制代码”,对应的直链为:
>
> `http://dldir1.qq.com/weixin/android/weixin<主版本号>android<真实版本号>_<十六进制代码>_arm64.apk`
>
> 填入相应输入框内容后,小程序将尝试访问上述链接。若当次访问未果,默认情况下将自动递增十六进制代码后再次尝试访问,直到访问成功为止。
>
> 若选择微信输入法猜版,对话框将变更为两个输入框,分别是“主版本号”和“直链版本号”,对应的直链为:
> 若选择微信输入法扫版,对话框将变更为两个输入框,分别是“主版本号”和“直链版本号”,对应的直链为:
>
> `https://download.z.weixin.qq.com/app/android/<主版本号>/wxkb_<直链版本号>_32.apk`
>
> 填入相应输入框内容后,小程序将尝试访问上述链接。若当次访问未果,默认情况下将自动递增直链版本号后再次尝试访问,直到访问成功为止。
> [!TIP]
> QQ 版本列表 Vigor 自 1.1.4 版本起实验性支持了 Android TIM 的猜版
> QQ 版本列表 Vigor 自 1.1.4 版本起实验性支持了 Android TIM 的扫版
>
> 若选择 TIM 猜版,对应的直链为:
> 若选择 TIM 扫版,对应的直链为:
>
> `https://downv6.qq.com/qqweb/QQ_1/android_apk/TIM_<主版本号>.<小版本号><自定义后缀>.apk`
>
> 填入相应输入框内容后,软件将尝试访问上述链接。若当次访问未果,默认情况下将自动递增小版本号后再次尝试访问,直到访问成功为止。
> [!WARNING]
> 微信猜版功能、微信输入法猜版功能和 TIM 猜版功能为 QQ 版本列表 Vigor 附带的实验性功能,可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。
> 微信扫版功能、微信输入法扫版功能和 TIM 扫版功能为 QQ 版本列表 Vigor 附带的实验性功能,可能存在不可预知的稳定性问题。请明确并确保自身具备足够的风险识别和承受能力。
### 实验性功能
Expand All @@ -164,9 +164,9 @@ QQ 版本列表 Vigor for WeChat MiniProgram 仅供学习交流使用,不提
### 为什么默认添加了小版本号必须为 5 的倍数这项限制?
基于对 Android QQ 长期以来的版本号发布规律进行深入观察和分析的结果,我们发现 Android QQ 小版本号更新通常遵循每增加一个有效版本即递增 5 的倍数这一特定模式。为了贴近这一潜在实际规范并确保 QQ 版本列表 Vigor 的快捷性,QQ 版本列表 Vigor 依据最佳实践原则,默认设置小版本号和猜版必须为 5 的倍数的限制规则。此限制并非强制,用户可随时进入设置解除此限制。
基于对 Android QQ 长期以来的版本号发布规律进行深入观察和分析的结果,我们发现 Android QQ 小版本号更新通常遵循每增加一个有效版本即递增 5 的倍数这一特定模式。为了贴近这一潜在实际规范并确保 QQ 版本列表 Vigor 的快捷性,QQ 版本列表 Vigor 依据最佳实践原则,默认设置小版本号和扫版必须为 5 的倍数的限制规则。此限制并非强制,用户可随时进入设置解除此限制。
### 版本列表中已经有新的版本号了,为什么我使用枚举猜版却获取不到下载链接
### 版本列表中已经有新的版本号了,为什么我使用枚举扫版却获取不到下载链接
即使版本列表已出现了新的版本号,也并不意味着 QQ 团队已经完成了新版本(含测试版)安装包在腾讯公网服务器的部署和发布。一种可能的情况是,QQ 团队正在进行新版本的内部测试阶段或小范围灰度推送阶段,因而尚未对外提供广泛公网下载渠道。
Expand Down
2 changes: 1 addition & 1 deletion UserAgreement.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

## 二、关于 QQ 版本列表 Vigor 提供的服务

QQ 版本列表 Vigor 提供的服务是指提供 Android QQ 和 Android TIM 版本列表的查看和对腾讯服务器提供的 Android QQ 及其它可能存在的腾讯软件产品的下载链接的枚举法猜测。QQ 版本列表 Vigor 用户可以通过本应用及时获取到 Android QQ 及其它可能存在的腾讯软件产品的版本更新的最新信息。
QQ 版本列表 Vigor 提供的服务是指提供 Android QQ 和 Android TIM 版本列表的查看和对腾讯服务器提供的 Android QQ 及其它可能存在的腾讯软件产品的下载链接的枚举法扫描。QQ 版本列表 Vigor 用户可以通过本应用及时获取到 Android QQ 及其它可能存在的腾讯软件产品的版本更新的最新信息。

此外,QQ 版本列表 Vigor 可能以软件实验形式提供一些尚不稳定的服务,您在使用此类服务时,必须明确并确保自身具备足够的风险识别和承受能力。

Expand Down
2 changes: 1 addition & 1 deletion source/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

/*
Copyright (c) 2024 ArcticFoxPro
QQ Ver. Lite is licensed under Mulan PubL v2.
Qverbow Vigor is licensed under Mulan PubL v2.
You can use this software according to the terms and conditions of the Mulan PubL v2.
You may obtain a copy of Mulan PubL v2 at:
http://license.coscl.org.cn/MulanPubL-2.0
Expand Down
2 changes: 1 addition & 1 deletion source/app.wxss
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

/*
Copyright (c) 2024 ArcticFoxPro
QQ Ver. Lite is licensed under Mulan PubL v2.
Qverbow Vigor is licensed under Mulan PubL v2.
You can use this software according to the terms and conditions of the Mulan PubL v2.
You may obtain a copy of Mulan PubL v2 at:
http://license.coscl.org.cn/MulanPubL-2.0
Expand Down
76 changes: 68 additions & 8 deletions source/pages/index/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

/*
Copyright (c) 2024 ArcticFoxPro
QQ Ver. Lite is licensed under Mulan PubL v2.
Qverbow Vigor is licensed under Mulan PubL v2.
You can use this software according to the terms and conditions of the Mulan PubL v2.
You may obtain a copy of Mulan PubL v2 at:
http://license.coscl.org.cn/MulanPubL-2.0
Expand Down Expand Up @@ -97,6 +97,12 @@ Page({
QQTestSwitch: true
})

if (wx.getStorageSync('isUEOn') === false || wx.getStorageSync('isUEOn') === "") this.setData({
UESwitch: false
}); else if (wx.getStorageSync('isUEOn') === true) this.setData({
UESwitch: true
})

function setThrottleSwitch(isThrottleOn, benchmarkLevelConditionMet) {
if (isThrottleOn === false) this.setData({
ThrottleSwitch: false
Expand Down Expand Up @@ -240,6 +246,7 @@ Page({
qqVersionBean.jsonString = JSON.parse(json)
qqVersionBean.isAccessibility = false // semver.gte(qqVersionBean.versionNumber, getApp().EARLIEST_ACCESSIBILITY_QQ_VERSION)
qqVersionBean.isQQNTFramework = semver.gte(qqVersionBean.versionNumber, getApp().globalData.EARLIEST_QQNT_FRAMEWORK_QQ_VERSION_STABLE)
qqVersionBean.isUnrealEngine = semver.gte(qqVersionBean.versionNumber, getApp().globalData.EARLIEST_UNREAL_ENGINE_QQ_VERSION_STABLE)

qqVersionList.push(qqVersionBean);
}
Expand Down Expand Up @@ -546,6 +553,14 @@ Page({
this.setData({
PerProSwitch: e.detail.value
})
}, handleUEChange(e) {
wx.vibrateShort({
type: 'light',
});
wx.setStorageSync('isUEOn', e.detail.value);
this.setData({
UESwitch: e.detail.value
})
}, handleThrottleChange(e) {
wx.vibrateShort({
type: 'light',
Expand Down Expand Up @@ -734,15 +749,36 @@ Page({
const stListPre2 = stListPre.concat(suf64hb, suf64hb1, suf64hb2, suf64hb3, suf64hd, suf64hd1, suf64hd2, suf64hd3, suf64hd1hb, sufHb64, sufHb164, sufHb264, sufHb364, sufHd64, sufHd164, sufHd264, sufHd364, sufHd1hb64, sufTest, customSufList);
const stList = stListPre2.flat(Infinity)

const wxSoListPre = ["", "_1"]
const wetypeSoListPre = ["", "_32"]
const wxSoList = wxSoListPre.concat(customSufList).flat(Infinity)
const wetypeSoList = wetypeSoListPre.concat(customSufList).flat(Infinity)

const guess = () => {
switch (this.data.continueGuessing) {
case 'STATUS_ONGOING':
if (mode === 'WeChat') guessedLink = `https://dldir1.qq.com/weixin/android/weixin${versionBig}android${versionSuf}_0x${v16codeStr}_arm64.apk`; else if (mode === 'WeType') guessedLink = `https://download.z.weixin.qq.com/app/android/${versionBig}/wxkb_${vSuf}_32.apk`; else if (mode === 'QQOfficial') guessedLink = `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_${versionBig}${soList[sIndex]}.apk`; else if (mode === 'QQTest') guessedLink = `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_${versionBig}.${vSuf}${stList[sIndex]}.apk`; else if (mode === 'TIM') guessedLink = `https://downv6.qq.com/qqweb/QQ_1/android_apk/TIM_${versionBig}.${vSuf}${stList[sIndex]}.apk`;
switch (mode) {
case 'WeChat':
guessedLink = `https://dldir1.qq.com/weixin/android/weixin${versionBig}android${versionSuf}_0x${v16codeStr}_arm64${wxSoList[sIndex]}.apk`;
break;
case 'WeType':
guessedLink = `https://download.z.weixin.qq.com/app/android/${versionBig}/wxkb_${vSuf}${wetypeSoList[sIndex]}.apk`;
break;
case 'QQOfficial':
guessedLink = `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_${versionBig}${soList[sIndex]}.apk`;
break;
case 'QQTest':
guessedLink = `https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_${versionBig}.${vSuf}${stList[sIndex]}.apk`;
break;
case 'TIM':
guessedLink = `https://downv6.qq.com/qqweb/QQ_1/android_apk/TIM_${versionBig}.${vSuf}${stList[sIndex]}.apk`;
break;
}

this.setData({
loadingVisible: true,
guessSuccessVisible: false,
updateProgressDialogMessage: `正在猜测下载地址${guessedLink}`
updateProgressDialogMessage: `正在扫描下载地址${guessedLink}`
})
this.fetchLink(guessedLink).then(isSuccess => {
if (isSuccess.exists && isSuccess.fileSize !== false) {
Expand All @@ -756,10 +792,22 @@ Page({
});
switch (mode) {
case 'WeChat':
v16codeStr = (parseInt(v16codeStr, 16) + 1).toString(16);
if (sIndex >= wxSoList.length - 1 && this.data.ExtendSuffixSwitch === true) {
v16codeStr = (parseInt(v16codeStr, 16) + 1).toString(16);
sIndex = 0;
} else if (sIndex >= wxSoListPre.length - 1 && this.data.ExtendSuffixSwitch === false) {
v16codeStr = (parseInt(v16codeStr, 16) + 1).toString(16);
sIndex = 0;
} else sIndex++;
break;
case 'WeType':
vSuf = (Number(vSuf) + 1).toString();
if (sIndex >= wetypeSoList.length - 1 && this.data.ExtendSuffixSwitch === true) {
vSuf = (Number(vSuf) + 1).toString();
sIndex = 0;
} else if (sIndex >= wetypeSoListPre.length - 1 && this.data.ExtendSuffixSwitch === false) {
vSuf = (Number(vSuf) + 1).toString();
sIndex = 0;
} else sIndex++;
break;
case 'QQOfficial':
if (sIndex >= soList.length - 1) this.setData({
Expand All @@ -786,10 +834,22 @@ Page({
} else {
switch (mode) {
case 'WeChat':
v16codeStr = (parseInt(v16codeStr, 16) + 1).toString(16);
if (sIndex >= wxSoList.length - 1 && this.data.ExtendSuffixSwitch === true) {
v16codeStr = (parseInt(v16codeStr, 16) + 1).toString(16);
sIndex = 0;
} else if (sIndex >= wxSoListPre.length - 1 && this.data.ExtendSuffixSwitch === false) {
v16codeStr = (parseInt(v16codeStr, 16) + 1).toString(16);
sIndex = 0;
} else sIndex++;
break;
case 'WeType':
vSuf = (Number(vSuf) + 1).toString();
if (sIndex >= wetypeSoList.length - 1 && this.data.ExtendSuffixSwitch === true) {
vSuf = (Number(vSuf) + 1).toString();
sIndex = 0;
} else if (sIndex >= wetypeSoListPre.length - 1 && this.data.ExtendSuffixSwitch === false) {
vSuf = (Number(vSuf) + 1).toString();
sIndex = 0;
} else sIndex++;
break;
case 'QQOfficial':
if (sIndex >= soList.length - 1) this.setData({
Expand Down Expand Up @@ -832,7 +892,7 @@ Page({
duration: 3000,
icon: false,
single: false,
content: '已停止猜测',
content: '已停止扫描',
align: 'center'
});
clearTimeout(timerId);
Expand Down
Loading

0 comments on commit d89438f

Please sign in to comment.