Skip to content
Merged

Test #42

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 78 additions & 6 deletions .github/workflows/deploy-apk.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
name: 发布正式版 APK

on:
push:
branches:
- main
workflow_dispatch:

permissions:
Expand Down Expand Up @@ -31,6 +28,16 @@ jobs:
with:
fetch-depth: 0

- name: 校验手动发布分支
shell: bash
run: |
set -euo pipefail
if [ "${{ github.ref_name }}" != "main" ]; then
echo "正式版发布只能手动从 main 分支运行,当前分支:${{ github.ref_name }}" >&2
exit 1
fi
echo "手动发布分支校验通过:main"

- name: 配置 JDK
uses: actions/setup-java@v4
with:
Expand Down Expand Up @@ -112,6 +119,40 @@ jobs:
echo "apk_path=${apk_target}" >> "$GITHUB_OUTPUT"
echo "APK 已重命名为 ${apk_target}。"

- name: 生成发布审批摘要
shell: bash
run: |
set -euo pipefail
apk_path="${{ steps.artifact.outputs.apk_path }}"
apk_size="$(du -h "$apk_path" | cut -f1)"
apk_sha256="$(sha256sum "$apk_path" | cut -d ' ' -f1)"
{
echo "# 发布审批摘要"
echo
echo "## 构建结果"
echo "- 编译状态:成功"
echo "- APK 文件:${{ steps.version.outputs.apk_name }}"
echo "- APK 大小:${apk_size}"
echo "- APK SHA256:\`${apk_sha256}\`"
echo
echo "## 版本信息"
echo "- versionName:${{ steps.version.outputs.version_name }}"
echo "- versionCode:${{ steps.version.outputs.version_code }}"
echo "- Git 标签:${{ steps.version.outputs.tag_name }}"
echo "- 默认更新下载地址:${{ steps.download.outputs.apk_url }}"
echo
echo "## 工作流信息"
echo "- 触发方式:${{ github.event_name }}"
echo "- 分支:${{ github.ref_name }}"
echo "- 提交:\`${{ github.sha }}\`"
echo "- 构建编号:${{ github.run_number }}"
echo
echo "## 本次更新日志"
echo
cat current_changelog.md
} > release_review.md
cat release_review.md >> "$GITHUB_STEP_SUMMARY"

- name: 上传待发布产物
uses: actions/upload-artifact@v4
with:
Expand All @@ -120,14 +161,16 @@ jobs:
${{ steps.artifact.outputs.apk_path }}
release_notes.md
current_changelog.md
release_review.md
if-no-files-found: error

publish:
name: 手动确认后发布
name: 手动确认发布 Fe v${{ needs.build.outputs.version_name }}
runs-on: ubuntu-latest
needs: build
environment:
name: release
url: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}

steps:
- name: 检出代码
Expand All @@ -145,6 +188,9 @@ jobs:
"GITEE_TOKEN"
"LANZOU_USERNAME"
"LANZOU_PASSWORD"
"ONEBOT_HTTP_URL"
"ONEBOT_GROUP_ID"
"ONEBOT_ACCESS_TOKEN"
)
for secret_name in "${required_secrets[@]}"; do
if [ -z "${!secret_name:-}" ]; then
Expand All @@ -159,6 +205,9 @@ jobs:
GITEE_TOKEN: ${{ secrets.GITEE_TOKEN }}
LANZOU_USERNAME: ${{ secrets.LANZOU_USERNAME }}
LANZOU_PASSWORD: ${{ secrets.LANZOU_PASSWORD }}
ONEBOT_HTTP_URL: ${{ secrets.ONEBOT_HTTP_URL }}
ONEBOT_GROUP_ID: ${{ secrets.ONEBOT_GROUP_ID }}
ONEBOT_ACCESS_TOKEN: ${{ secrets.ONEBOT_ACCESS_TOKEN }}

- name: 下载待发布产物
uses: actions/download-artifact@v4
Expand All @@ -180,13 +229,15 @@ jobs:
echo "apk_path=${apk_path}" >> "$GITHUB_OUTPUT"
release_notes_path="$(find release-package -name release_notes.md -type f | head -n 1)"
changelog_path="$(find release-package -name current_changelog.md -type f | head -n 1)"
if [ -z "${release_notes_path:-}" ] || [ -z "${changelog_path:-}" ]; then
echo "没有找到发布说明或当前更新日志。" >&2
review_path="$(find release-package -name release_review.md -type f | head -n 1)"
if [ -z "${release_notes_path:-}" ] || [ -z "${changelog_path:-}" ] || [ -z "${review_path:-}" ]; then
echo "没有找到发布说明、当前更新日志或审批摘要。" >&2
find release-package -maxdepth 3 -type f >&2
exit 1
fi
cp "$release_notes_path" release_notes.md
cp "$changelog_path" current_changelog.md
cp "$review_path" release_review.md

- name: 安装蓝奏云上传依赖
shell: bash
Expand Down Expand Up @@ -237,3 +288,24 @@ jobs:
GITEE_CONFIG_BRANCH: ${{ vars.GITEE_CONFIG_BRANCH || 'master' }}
REMOTE_CONFIG_FILE: ${{ vars.REMOTE_CONFIG_FILE || 'config.json' }}
REMOTE_CHANGELOG_FILE: ${{ vars.REMOTE_CHANGELOG_FILE || 'update.md' }}

- name: 发送 OneBot 群通知
shell: bash
env:
ONEBOT_HTTP_URL: ${{ secrets.ONEBOT_HTTP_URL }}
ONEBOT_GROUP_ID: ${{ secrets.ONEBOT_GROUP_ID }}
ONEBOT_ACCESS_TOKEN: ${{ secrets.ONEBOT_ACCESS_TOKEN }}
run: |
set -euo pipefail
{
echo "新版本发布啦喵~"
echo "最新版本为${{ needs.build.outputs.version_name }}"
echo "前往网盘下载:oplist.lastudio.cc"
} > onebot_message.txt
python scripts/release/notify_onebot.py \
--api-url "${ONEBOT_HTTP_URL}" \
--group-id "${ONEBOT_GROUP_ID}" \
--message-file onebot_message.txt \
--upload-file "${{ steps.artifact.outputs.apk_path }}" \
--upload-name "${{ needs.build.outputs.apk_name }}" \
--access-token "${ONEBOT_ACCESS_TOKEN:-}"
119 changes: 67 additions & 52 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,54 +32,88 @@ Fuck ets100 是一款专门为 e听说(ETS 100)用户打造的答案提取
---
## 🚀 怎么用

### 第一步:准备工作
### 第一步:先装上

在使用 Fuck ets100 之前,你需要先选择一种读取方式。本地读取需要读取手机里的 e听说数据;云端模式则通过 ETS100 云端接口获取作业数据。
1. 打开 [releases 页面](https://github.com/qiuqiqiuqid/Fuck_ets100/releases)或[云盘](https://oplist.lastudio.cc/Fe_release)
2. 下载最新版本的 APK
3. 安装到你的手机上
4. 打开 Fuck ets100 App

| 方式 | 难度 | 说明 |
|------|------|------|
| 云端模式 | ⭐ 最简单 | 登录 ETS100 账号后在线获取作业,无需本地文件权限 |
| 零宽字符直读 | ⭐ 简单 | 利用特殊漏洞读取本地数据,无需额外App |
| Shizuku | ⭐ 简单 | 需要安装 Shizuku App,适合大多数用户 |
| Root | ⭐⭐ 中等 | 需要手机已经 Root |
如果手机提示“禁止安装未知来源应用”,按照系统提示允许一下就行,不是什么大问题啦。

如果你只是想快速查看云端作业答案,优先使用 **云端模式**。如果你想读取手机本地已经下载好的 e听说资源,可以使用 **零宽字符直读 / Shizuku / Root**。
### 第二步:选择读取方式

### 第二步:安装并打开 Fuck ets100
Fuck ets100 现在有几种读取方式,不知道选哪个的话,看这张表就够了 👇

1. 从 [ releases 页面](https://github.com/qiuqiqiuqid/Fuck_ets100/releases) 下载最新版本的 APK
2. 安装到你的手机上
3. 打开 Fuck ets100 App
| 方式 | 推荐程度 | 适合什么情况 |
|------|----------|--------------|
| 云端模式 | ⭐⭐⭐ 最推荐 | 想直接看云端作业,不想折腾文件权限 |
| 零宽字符直读 | ⭐⭐ 简单 | 想读取手机本地作业,并且设备支持 |
| Shizuku | ⭐⭐ 稳定 | 零宽字符直读不可用,愿意安装 Shizuku |
| Root | ⭐ 看情况 | 手机已经 Root,想直接读取本地数据 |

### 第三步:选择读取方式
简单说:
- 只是想快速看作业答案:优先用 **云端模式**
- 想看手机里已经下载好的作业:试试 **零宽字符直读**
- 零宽字符直读不行:再用 **Shizuku**
- 手机本来就 Root 了:可以用 **Root**

- 如果选择 **云端模式**:
1. 进入“设置” → “运行授权”
2. 选择“云端模式”
3. 点击“登录 ETS100 账号”
4. 输入手机号和密码完成登录
5. 回到读取页面,点击右下角“读取”
6. 确认风险提示后加载云端作业列表
### 第三步:按你的方式授权

- 如果选择 **零宽字符直读**:
1. 在 Fuck ets100 里点击"零宽字符直读"
2. 如果提示"不支持",请尝试其他方式
3. 自动完成授权,超简单!
#### ☁️ 云端模式

- 如果选择 **Shizuku**:
1. 先去应用商店安装 [Shizuku](https://shizuku.rikka.app/)
2. 在 Fuck ets100 里点击"使用 Shizuku",按照提示授权

- 如果选择 **Root**:确保你的手机已经获取了 Root 权限
1. 进入“设置” → “运行授权”
2. 选择“云端模式”
3. 点击“登录 ETS100 账号”
4. 输入手机号和密码完成登录
5. 回到“读取”页面
6. 点击右下角“读取”
7. 确认提示后,等待云端作业列表加载
8. 点击作业,等待下载和解析完成

云端模式最省事,但可能会让 e听说 官方客户端被顶号。正在考试、练习、录音、提交的时候不要用,真的不要,喵。

#### ✨ 零宽字符直读

1. 进入“设置” → “运行授权”
2. 选择“零宽字符直读”
3. 按 App 提示完成授权
4. 回到“读取”页面
5. 点击右下角“读取”

如果提示“不支持”,说明你的设备可能用不了这个方式,换 Shizuku 或云端模式就行。

#### 🧩 Shizuku

1. 先安装并启动 [Shizuku](https://shizuku.rikka.app/)
2. 确认 Shizuku 已经正常运行
3. 回到 Fuck ets100
4. 进入“设置” → “运行授权”
5. 选择“使用 Shizuku”
6. 按提示授权
7. 回到“读取”页面点击“读取”

#### 🔓 Root

### 第四步:开始使用
1. 确认手机已经 Root
2. 进入“设置” → “运行授权”
3. 选择 Root 读取方式
4. 授予 Root 权限
5. 回到“读取”页面点击“读取”

本地读取模式授权成功后,回到读取页面点击"读取",稍等几秒,所有试卷就会显示出来 📋
### 第四步:查看答案

云端模式登录成功后,回到读取页面点击"读取",确认提示后会显示云端作业列表。点击作业可以下载并解析答案。
读取成功后,试卷会显示在列表里 📋

点击任意一份试卷,就能看到里面的题目和答案啦 🎉

如果没有读出来,可以先检查:
- e听说 里对应作业有没有下载完成
- 当前读取方式有没有授权成功
- 云端模式账号有没有登录成功
- App 是不是最新版本
- 换一种读取方式再试试

---

## ☁️ 云端模式详解
Expand Down Expand Up @@ -116,25 +150,6 @@ Fuck ets100 是一款专门为 e听说(ETS 100)用户打造的答案提取

---

## 🔧 怎么做的

很多小伙伴可能会好奇,这个软件是怎么"偷"出答案的呢 ❓

其实分为两条路线 👇

**本地读取模式:**
e听说 App 把答案数据存在手机本地的一个文件夹里,我们只需要有办法读取这个文件夹,就能拿到里面的答案 📁

本地读取提供了三种方式:

1. **零宽字符直读方式**:利用一个特殊的"漏洞",让手机以为自己不需要权限就能读取文件(最推荐 ✨)
2. **Shizuku 方式**:通过 Shizuku 这个工具,用管理员权限去读取文件
3. **Root 方式**:直接用 Root 权限读取

**云端模式:**
App 使用 ETS100 账号登录云端接口,获取作业列表和作业资源,然后在本机下载、解压、解析题目与答案。云端模式不依赖手机本地 e听说数据目录。

读取到数据后,Fuck ets100 会自动解析里面的 JSON 文件,把题目和答案提取出来,按照我们熟悉的格式显示出来 😊



Expand Down
Loading
Loading