Compare commits

...

90 Commits

Author SHA1 Message Date
ikun0014
ed8fa1cd7f 1.3.8 2025-02-28 18:55:49 +08:00
ikun0014
485a9d85e2 1.3.8 2025-02-28 18:55:36 +08:00
ikun0014
41cfa244e3 fix 2025-02-28 18:55:13 +08:00
ikun0014
09a9e48f7e fix 2025-02-27 19:15:20 +08:00
ikun0014
7ef7297119 sth 2025-02-27 19:14:02 +08:00
ikun0014
ad26456d6c 1.3.7 2025-02-27 19:09:34 +08:00
ikun0014
cd18a2f49d 清单库新增+优化 2025-02-27 19:09:20 +08:00
ikun0014
485fca07f1 修复构建 2025-01-26 22:58:28 +08:00
ikun0014
452be816b1 构建修复 2025-01-26 22:39:44 +08:00
ikun0014
2ba17f1bac 1.3.6 2025-01-26 22:32:32 +08:00
ikun0014
17e1fea9cf 常规维护 2025-01-26 22:32:24 +08:00
ikun0014
2fd7a13bcc 1.3.5 2024-11-27 00:07:12 +08:00
ikun0014
4edcfa8c8e 更新 main.py 2024-11-27 00:06:53 +08:00
ikun0014
a0536fb4d6 更新 release.yml 2024-11-25 21:44:30 +08:00
ikun0014
0912841e44 1.3.4 2024-11-25 21:39:59 +08:00
ikun0014
3b39253d0f feat: 更加史山,更加能看 2024-11-25 21:39:37 +08:00
ikun0014
1ddbf5e02f Update issue templates 2024-11-16 22:46:32 +08:00
ikun0014
fd6df047dc 更新 sync.yml 2024-11-11 23:34:34 +08:00
ikun0014
df2fd4a10a 1.3.3 2024-11-11 23:33:08 +08:00
ikun0014
72bb4a7e97 更新 release.yml 2024-11-11 23:33:06 +08:00
ikun0014
6b37034360 feat: 尝试增加Gitee 2024-11-11 23:32:27 +08:00
ikun0014
8ca12ea7b0 version: Update to 1.3.2 2024-11-10 18:31:01 +08:00
ikun0014
b89c38721f 1.3.2 2024-11-10 18:30:33 +08:00
ikun0014
76d3d2caeb rm: CI Build 2024-11-10 18:30:17 +08:00
ikun0014
38462bf6cd chore: 代码优化 && 更换进度条模块 2024-11-10 17:51:25 +08:00
ikun0014
3d028a0e0c 搞错了 2024-10-27 14:38:44 +08:00
ikun0014
acfad07a07 [release]切Python版本 2024-10-27 14:35:52 +08:00
ikun0014
479661a8a3 [release]切换Nuitka版本 2024-10-27 14:30:38 +08:00
ikun0014
a5d100078b [release]build: 更新Python版本 2024-10-27 14:18:44 +08:00
ikun0014
0647419bdf 1.3.1 2024-10-27 14:13:56 +08:00
ikun0014
e9b466f6df [release]version: 1.3.1 2024-10-27 14:13:48 +08:00
ikun0014
7e72bea8a1 fix: 尝试修复ImportError 2024-10-27 14:12:34 +08:00
ikun0014
bb789d8cf7 build: ci 2024-10-19 11:37:50 +08:00
ikun0014
3178303b0a [release]ui: 移除所有Emoji;修改日志格式看起来更Print 2024-10-19 11:34:20 +08:00
ikun0014
738e0eb617 1.3.0 2024-10-19 11:19:29 +08:00
ikun0014
fb0806aea7 [release] 在main分支版本下删除所有Emoji 2024-10-19 11:19:27 +08:00
ikun0014
2a02d07e8d rm: all emoji 2024-10-19 11:18:18 +08:00
ikun0014
df4342957f revert: ui 2024-10-19 11:15:21 +08:00
ikun0014
e2f2120b0c fix: retrying 2024-10-18 21:42:27 +08:00
ikun0014
580cd44247 fix: trying 2024-10-18 21:34:11 +08:00
ikun0014
0e57caefd1 chore: 你CI个集贸 2024-10-18 21:28:04 +08:00
ikun0014
062e58ea57 ui: 为了拖慢各位的时间我加了一个逆天效果 2024-10-18 21:22:21 +08:00
ikun0014
651d9f79b2 1.2.9 2024-10-17 21:32:49 +08:00
ikun0014
8f8aaf81a1 ui: 随便修改一下 2024-10-17 21:32:21 +08:00
ikun0014
e8dd606db4 Merge pull request #45 from muwenyan521/main
feat:优化代码&更清晰的图标
2024-10-13 22:13:23 +08:00
WangXianming
b50183e723 feat:优化代码&更清晰的图标 2024-10-13 21:54:28 +08:00
ikun0014
74c5464bb4 1.2.8 2024-10-13 17:30:18 +08:00
ikun0014
7f087983d3 feat: 对港澳台或境外用户更加友好 2024-10-13 17:30:06 +08:00
ikun0014
9a3668a2f4 Update README.md 2024-10-13 15:55:26 +08:00
ikun0014
15d2d46dda Create FUNDING.yml 2024-10-13 15:54:36 +08:00
ikun0014
c03df383a0 1.2.7 2024-10-13 15:46:21 +08:00
ikun0014
5893e07901 feat: 增加Github CDN 2024-10-13 15:45:44 +08:00
ikun0014
bf6024e4c1 feat: 加多点try防止出事 2024-10-13 15:45:22 +08:00
ikun0014
39d426d806 Merge pull request #43 from muwenyan521/main
chore:改点东西
2024-10-12 20:48:19 +08:00
WangXianming
26fbb82357 Update build.yml 2024-10-12 20:28:29 +08:00
WangXianming
6fc06a681a 1.2.6 2024-10-12 20:19:00 +08:00
WangXianming
600a8679f3 chore:改点东西 2024-10-12 20:06:27 +08:00
WangXianming
3fa925c161 Merge branch 'main' of https://github.com/muwenyan521/Onekey 2024-10-12 19:23:41 +08:00
ikun0014
3642dbde30 chore: 修改一下 2024-10-12 16:31:34 +08:00
ikun0014
cec2d0fedb fix: 再修一次 2024-10-12 16:19:11 +08:00
ikun0014
59bcd7bcdc chore: 再加点料 2024-10-12 15:58:06 +08:00
ikun0014
57f285af37 fix: 这次总能用了吧 2024-10-12 15:57:10 +08:00
ikun0014
afdcc5d51e fix 2024-10-11 21:48:18 +08:00
ikun0014
f8bc9ace69 chore: 让我微调一下() 2024-10-11 21:21:25 +08:00
ikun0014
7135e13fd7 更新 build.yml 2024-10-11 20:12:30 +08:00
ikun0014
b87867088b 1.2.5 2024-10-11 20:05:01 +08:00
ikun0014
fc03979107 chore: 丝滑刷版本号测试 2024-10-11 20:04:42 +08:00
WangXianming
d36678f53c 更新 .gitignore 2024-10-05 17:51:55 +08:00
WangXianming
0418dbb685 Merge branch 'ikunshare:main' into main 2024-10-02 21:46:52 +08:00
WangXianming
0c783b3a7b 更新 .gitignore 2024-10-02 18:34:03 +08:00
dependabot[bot]
eb1501a43a Merge pull request #42 from ikunshare/dependabot/pip/aiohttp-3.10.2 2024-10-01 14:10:32 +00:00
ikun0014
22df5426d8 Merge pull request #41 from muwenyan521/main
feat:尝试解决配置问题&优化代码
2024-10-01 14:02:08 +00:00
dependabot[bot]
ea3b682eb7 build(deps): bump aiohttp from 3.9.5 to 3.10.2
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.9.5 to 3.10.2.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.9.5...v3.10.2)

---
updated-dependencies:
- dependency-name: aiohttp
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-01 13:57:35 +00:00
WangXianming
cf0d508237 内容更新 2024-10-01 21:19:29 +08:00
WangXianming
5886b1e4b5 feat:尝试解决配置问题&优化代码 2024-10-01 11:54:32 +08:00
WangXianming
a1cde89971 1.2.4 2024-09-28 14:20:51 +08:00
WangXianming
697a3769ec feat:优化代码 2024-09-28 14:14:14 +08:00
ikun
b1b7e720c0 test: 未知问题 2024-09-27 18:17:33 +08:00
ikun
0eb0fb3c7e add: dev 2024-09-27 16:20:28 +08:00
ikun
59d5852d11 fix? 2024-09-27 13:34:08 +08:00
ikun
5ac9f8f28a 1.2.3 2024-09-27 13:21:09 +08:00
ikun
b8d76f98da fix: 尝试修复下载速度过慢导致Timeout 2024-09-27 13:20:49 +08:00
ikun
1e5f0b6774 rm: PyPI 2024-09-22 17:18:39 +08:00
ikun
5357ed5fe7 Merge pull request #36 from muwenyan521/main
镜像源
2024-09-22 15:45:13 +08:00
WangXianming
5cd5e89ed7 feat:镜像源 2024-09-22 15:39:35 +08:00
ikun
e34cad1889 fix: 少个参数 2024-09-20 21:35:00 +08:00
ikun
4aa1c22c25 feat: 优化 2024-09-20 20:02:21 +08:00
ikun
8ee7765bb0 Revert 2024-09-19 20:41:47 +08:00
ikun
4bd1362317 Revert "Merge branch 'main' of https://github.com/ikunshare/Onekey"
This reverts commit 5356947022, reversing
changes made to 6a9fed2e39.
2024-09-19 20:40:35 +08:00
ikun
3c0f2ecd6f Update README.md 2024-09-17 15:28:58 +08:00
29 changed files with 952 additions and 709 deletions

15
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,15 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
thanks_dev: # Replace with a single thanks.dev username
custom: ['https://afdian.com/a/ikun0014']

25
.github/ISSUE_TEMPLATE/bug反馈.md vendored Normal file
View File

@@ -0,0 +1,25 @@
---
name: Bug反馈
about: 反馈一个虫子(确信)
title: "[BUG]: "
labels: ''
assignees: ''
---
**触发Bug后出现了什么症状**
1.
**如何复现该Bug**
步骤:
1.
**日志**
复制在这里
**截图**
对程序的完整截图
**系统:**
- OS: Windows
- Version: 10

View File

@@ -1,67 +0,0 @@
# 此工作流使用未经 GitHub 认证的操作。
# 它们由第三方提供,并受
# 单独的服务条款、隐私政策和支持
# 文档。
# GitHub 建议将操作固定到提交 SHA。
# 若要获取较新版本,需要更新 SHA。
# 还可以引用标记或分支,但该操作可能会更改而不发出警告。
name: Upload Python Package
on:
release:
types: [published]
permissions:
contents: read
jobs:
release-build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Build release distributions
run: |
# NOTE: put your own distribution build steps here.
python -m pip install build
python -m pip install requirements.txt
python -m build
- name: Upload distributions
uses: actions/upload-artifact@v4
with:
name: release-dists
path: dist/
pypi-publish:
runs-on: ubuntu-latest
needs:
- release-build
permissions:
# IMPORTANT: this permission is mandatory for trusted publishing
id-token: write
# Dedicated environments with protections for publishing are strongly recommended.
environment:
name: pypi
# OPTIONAL: uncomment and update to include your PyPI project URL in the deployment status:
url: https://pypi.org/p/Onekey
steps:
- name: Retrieve release distributions
uses: actions/download-artifact@v4
with:
name: release-dists
path: dist/
- name: Publish release distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1

View File

@@ -7,27 +7,28 @@ on:
jobs:
build:
runs-on: windows-2019
permissions:
contents: write
runs-on: windows-latest
steps:
- name: Check out git repository
uses: actions/checkout@v4
# Push tag to GitHub if package.json version's tag is not tagged
- name: Get package version
shell: powershell
run: |
$version = (Get-Content package.json | ConvertFrom-Json).version
echo "PACKAGE_VERSION=$version" >> $env:GITHUB_ENV
- name: Set up Python 3.11
- name: Set up Python 3.12
uses: actions/setup-python@v3
with:
python-version: 3.11.9
python-version: 3.12
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install imageio
pip install -r requirements.txt
- name: Build
@@ -35,10 +36,10 @@ jobs:
with:
nuitka-version: main
script-name: main.py
standalone: true
onefile: true
mode: onefile
show-memory: true
windows-uac-admin: true
onefile-tempdir-spec: "%TEMP%\\onekey_%PID%_%TIME%"
windows-icon-from-ico: icon.jpg
company-name: ikunshare
product-name: Onekey
@@ -59,13 +60,40 @@ jobs:
git_commit_sha: ${{ github.sha }}
git_tag_prefix: "v"
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: Onekey_v${{ env.PACKAGE_VERSION }}.exe
path: build/Onekey_v${{ env.PACKAGE_VERSION }}.exe
- name: Release
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ env.PACKAGE_VERSION }}
files: build/Onekey---v${{ env.PACKAGE_VERSION }}.exe
prerelease: false
draft: false
tag_name: v${{ env.PACKAGE_VERSION }}
files: |
build/Onekey---v${{ env.PACKAGE_VERSION }}.exe
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Gitee Release
uses: nicennnnnnnlee/action-gitee-release@v1.0.5
with:
gitee_owner: ikun0014
gitee_repo: Onekey
gitee_token: ${{ secrets.GITEE_TOKEN }}
gitee_tag_name: v${{ env.PACKAGE_VERSION }}
gitee_release_name: v${{ env.PACKAGE_VERSION }}
gitee_release_body: I don't know
gitee_target_commitish: main
gitee_upload_retry_times: 3
gitee_file_name: Onekey---v${{ env.PACKAGE_VERSION }}.exe
gitee_file_path: build/Onekey---v${{ env.PACKAGE_VERSION }}.exe
- name: Upload to Telegram Channel
run: |
& curl -F "chat_id=${{ secrets.TELEGRAM_TO }}" `
-F "document=@build/Onekey---v${{ env.PACKAGE_VERSION }}.exe" `
-F "caption=Onekey's New Update ${{ env.PACKAGE_VERSION }}" `
-F "parse_mode=Markdown" `
"https://api.telegram.org/bot${{ secrets.TELEGRAM_TOKEN }}/sendDocument"

25
.github/workflows/sync.yml vendored Normal file
View File

@@ -0,0 +1,25 @@
name: Sync to Gitee
on:
push:
branches:
- main
jobs:
sync:
permissions:
contents: write
runs-on: ubuntu-latest
steps:
- name: Sync to Gitee
uses: Yikun/hub-mirror-action@master
with:
src: github/ikunshare
dst: gitee/ikun0014
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
dst_token: ${{ secrets.GITEE_TOKEN }}
src_account_type: org
dst_account_type: user
white_list: "Onekey"
force_update: true
debug: true

2
.gitignore vendored
View File

@@ -170,3 +170,5 @@ config.json
*.exe
*.dll
/main.dist
/.vscode
/.vs

View File

@@ -1 +0,0 @@
include README.md LICENSE

View File

@@ -1,62 +1,70 @@
# Onekey
<div align="center">
## 项目简介
Onekey 是一个用于从 Steam 官方 CDN 服务器下载游戏清单数据的工具。它可以帮助用户快速获取和管理游戏数据。
![Onekey](https://socialify.git.ci/ikunshare/Onekey/image?description=1&font=Inter&forks=1&issues=1&language=1&name=1&owner=1&pulls=1&stargazers=1&theme=Auto)
## 安装和使用
### 安装步骤
1. 下载最新版本:前往 [Releases](https://github.com/ikunshare/Onekey/releases/latest) 页面下载最新版本。
2. 安装依赖:
```bash
pip install -r requirements.txt
```
![GitHub Repo Size](https://img.shields.io/github/repo-size/ikunshare/Onekey?style=for-the-badge)
[![GitHub Release (with filter)](https://img.shields.io/github/v/release/ikunshare/Onekey?style=for-the-badge)](https://github.com/ikunshare/Onekey/releases/latest)
[![GitHub All Releases](https://img.shields.io/github/downloads/ikunshare/Onekey/total?style=for-the-badge&color=violet)](https://github.com/ikunshare/Onekey/releases)
[![GitHub License](https://img.shields.io/github/license/ikunshare/Onekey?style=for-the-badge)](https://github.com/ikunshare/Onekey/blob/main/LICENSE)
### 使用方法
1. 运行程序并按照提示操作。
</div>
## 开发环境要求
- Python 3.10 及以上
- Windows 10 及以上
- Git 版本管理
## 克隆和安装
1. 克隆项目到本地:
```bash
git clone https://github.com/ikunshare/Onekey
```
2. 安装依赖:
```bash
pip install -r requirements.txt
```
## Onekey
Onekey Steam Depot Manifest Downloader
## 使用方法
去Releases处下载最新的发布并且安装好SteamTools或者GreenLuma
然后打开Onekey输入App ID即可使用
## 开发
本程序使用Python编程语言开发
要求环境:
1.Python 3.10及以上
2.Windows 10及以上
3.使用Git进行版本管理
1.克隆项目到本地
```
git clone https://github.com/ikunshare/Onekey
```
2.安装依赖
```
pip install -r requirements.txt
```
## 项目协议
本项目基于 GPL-3.0 许可证发行。使用者在使用过程中应遵守以下条款:
- 24小时内清除产生的版权数据
- 承担使用本项目可能产生的任何损害
- 禁止商业用途和未经允许的二次修改
本项目基于 GPL-3.0 许可证发行,以下协议是对于 GPL-3.0 原协议的补充,如有冲突,以以下协议为准。
## 贡献者
感谢所有贡献者的支持:
<a href="https://github.com/ikunshare/Onekey/graphs/contributors">
<img src="https://contrib.rocks/image?repo=ikunshare/Onekey" />
</a>
词语约定: “使用者”指签署本协议的使用者;“版权数据”指包括但不限于图像、音频、名字等在内的他人拥有所属版权的数据。
本项目的数据来源原理是从Steam官方的CDN服务器中拉取游戏清单数据经过对数据简单地筛选与合并后进行展示因此本项目不对数据的准确性负责。
使用本项目的过程中可能会产生版权数据对于这些版权数据本项目不拥有它们的所有权为了避免造成侵权使用者务必在24 小时内清除使用本项目的过程中所产生的版权数据。
由于使用本项目产生的包括由于本协议或由于使用或无法使用本项目而引起的任何性质的任何直接、间接、特殊、偶然或结果性损害(包括但不限于因商誉损失、停工、计算机故障或故障引起的损害赔偿,或任何及所有其他商业损害或损失)由使用者负责。
本项目完全免费,且开源发布于 GitHub 面向全世界人用作对技术的学习交流,本项目不对项目内的技术可能存在违反当地法律法规的行为作保证,禁止在违反当地法律法规的情况下使用本项目,对于使用者在明知或不知当地法律法规不允许的情况下使用本项目所造成的任何违法违规行为由使用者承担,本项目不承担由此造成的任何直接、间接、特殊、偶然或结果性责任。
而且,本项目已禁止使用于商业用途,以及不得进行未经允许的二次修改,否则必须同时发布源代码。
若你使用了本项目,将代表你接受以上协议。
Steam正版平台不易请尊重版权支持正版。
本项目仅用于对技术可行性的探索及研究,不接受任何商业(包括但不限于广告等)合作。
## Star 趋势图
[![Stargazers over time](https://starchart.cc/ikunshare/Onekey.svg)](https://starchart.cc/ikunshare/Onekey)
## 贡献指南
欢迎参与本项目的开发和维护。
[![Stargazers over time](https://starchart.cc/ikunshare/Onekey.svg)](https://starchart.cc/ikunshare/Onekey)
## 贡献者
<a href="https://github.com/ikunshare/Onekey/graphs/contributors">
<img src="https://contrib.rocks/image?repo=ikunshare/Onekey" />
</a>
## 常见问题解答FAQ
查看 [FAQ](https://ikunshare.com/d/49) 获取常见问题的解答。
## 社区和支持
加入我们的社区,参与讨论和支持
加入我们的社区,参与讨论和支持:
- [GitHub Discussions](https://github.com/ikunshare/Onekey/discussions)
- [Gitter Chat](https://gitter.im/ikunshare/Onekey)
- [QQ](https://qm.qq.com/q/d7sWovfAGI)
- [Telegram](https://t.me/ikunshare_group)
## 许可证
本项目采用 [GPL-3.0](https://github.com/ikunshare/Onekey/blob/main/LICENSE) 许可证。
- [Telegram](https://t.me/ikunshare_qun)

View File

View File

@@ -1,28 +0,0 @@
import os
import time
from .log import log
async def check_github_api_rate_limit(headers, session):
url = 'https://api.github.com/rate_limit'
async with session.get(url, headers=headers, ssl=False) as r:
if r is None:
log.error('孩子,你怎么做到的?')
os.system('pause')
return
r_json = await r.json()
if r.status == 200:
rate_limit = r_json['rate']
remaining_requests = rate_limit['remaining']
reset_time = rate_limit['reset']
reset_time_formatted = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(reset_time))
log.info(f'🔄 剩余请求次数: {remaining_requests}')
else:
log.error('Github请求数检查失败')
return
if remaining_requests == 0:
log.warning(f'⚠ GitHub API 请求数已用尽,将在 {reset_time_formatted} 重置, 不想等生成一个填配置文件里')

View File

@@ -1,49 +0,0 @@
import os
import sys
import asyncio
import ujson as json
import aiofiles
from .stack_error import stack_error
from .log import log
async def gen_config_file():
qa1 = "温馨提示Github_Personal_Token可在Github设置的最底下开发者选项找到详情看教程"
tutorial = "https://ikunshare.com/Onekey_tutorial"
default_config ={
"Github_Personal_Token": "",
"Custom_Steam_Path": "",
"QA1": qa1,
"教程": tutorial
}
async with aiofiles.open("./config.json",
mode="w",
encoding="utf-8") as f:
await f.write(json.dumps(default_config,
indent=2,
ensure_ascii=False,
escape_forward_slashes=False))
await f.close()
log.info('🖱️ 程序可能为第一次启动,请填写配置文件后重新启动程序')
async def load_config():
if not os.path.exists('./config.json'):
await gen_config_file()
os.system('pause')
sys.exit()
else:
try:
async with aiofiles.open("./config.json",
mode="r",
encoding="utf-8") as f:
config = json.loads(await f.read())
return config
except Exception as e:
log.error(f"配置文件加载失败,原因: {stack_error(e)}")
os.remove("./config.json")
os.system('pause')
config = asyncio.run(load_config())

View File

@@ -1,30 +0,0 @@
import asyncio
import aiofiles
import vdf
from .log import log
lock = asyncio.Lock()
async def depotkey_merge(config_path, depots_config):
if not config_path.exists():
async with lock:
log.error('👋 Steam默认配置不存在可能是没有登录账号')
return
async with aiofiles.open(config_path, encoding='utf-8') as f:
content = await f.read()
config = vdf.loads(content)
software = config['InstallConfigStore']['Software']
valve = software.get('Valve') or software.get('valve')
steam = valve.get('Steam') or valve.get('steam')
steam.setdefault('depots', {}).update(depots_config['depots'])
async with aiofiles.open(config_path, mode='w', encoding='utf-8') as f:
new_content = vdf.dumps(config, pretty=True)
await f.write(new_content)
return True

View File

@@ -1,40 +0,0 @@
from pathlib import Path
import aiofiles
import vdf
from .log import log
from .manifest_down import get
from .stack_error import stack_error
async def get_manifest(sha, path, steam_path: Path, repo, session):
collected_depots = []
try:
if path.endswith('.manifest'):
depot_cache_path = steam_path / 'depotcache'
depot_cache_path.mkdir(exist_ok=True) if not depot_cache_path.exists() else None
save_path = depot_cache_path / path
if save_path.exists():
log.warning(f'👋已存在清单: {path}')
return collected_depots
content = await get(sha, path, repo, session)
log.info(f'🔄 清单下载成功: {path}')
async with aiofiles.open(save_path, 'wb') as f:
await f.write(content)
elif path == 'Key.vdf':
content = await get(sha, path, repo, session)
log.info(f'🔄 密钥下载成功: {path}')
depots_config = vdf.loads(content.decode('utf-8'))
for depot_id, depot_info in depots_config['depots'].items():
collected_depots.append((depot_id, depot_info['DecryptionKey']))
except Exception as e:
log.error(f'处理失败: {path} - {stack_error(e)}')
raise
return collected_depots

View File

@@ -1,23 +0,0 @@
import os
import winreg
from pathlib import Path
from .log import log
from .config import config
from .stack_error import stack_error
def get_steam_path():
try:
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\Valve\Steam')
steam_path = Path(winreg.QueryValueEx(key, 'SteamPath')[0])
custom_steam_path = config["Custom_Steam_Path"]
if custom_steam_path:
return Path(custom_steam_path)
return steam_path
except Exception as e:
log.error(f'❗ Steam路径获取失败, {stack_error(e)}')
os.system('pause')
return None
steam_path = get_steam_path()

View File

@@ -1,32 +0,0 @@
from .get_steam_path import steam_path
async def greenluma_add(depot_id_list):
app_list_path = steam_path / 'AppList'
if app_list_path.exists() and app_list_path.is_file():
app_list_path.unlink(missing_ok=True)
if not app_list_path.is_dir():
app_list_path.mkdir(parents=True, exist_ok=True)
depot_dict = {int(i.stem): None for i in app_list_path.iterdir() if i.stem.isdecimal() and i.suffix == '.txt'}
for i in app_list_path.iterdir():
if i.stem.isdecimal() and i.suffix == '.txt':
with i.open('r', encoding='utf-8') as f:
app_id_ = f.read().strip()
if app_id_.isdecimal():
depot_dict[int(i.stem)] = int(app_id_)
for depot_id in depot_id_list:
if int(depot_id) not in depot_dict.values():
index = max(depot_dict.keys(), default=-1) + 1
for i in range(max(depot_dict.keys(), default=-1) + 1):
if i not in depot_dict:
index = i
break
with (app_list_path / f'{index}.txt').open('w', encoding='utf-8') as f:
f.write(str(depot_id))
depot_dict[index] = int(depot_id)
return True

View File

@@ -1,19 +0,0 @@
from colorama import Fore, Back, Style, init
init()
from .log import log
def init():
print(f"{Fore.GREEN}{Back.BLACK}{Style.BRIGHT} _____ __ _ _____ _ _ _____ __ __ {Style.RESET_ALL}")
print(f"{Fore.GREEN}{Back.BLACK}{Style.BRIGHT} / _ \\ | \\ | | | ____| | | / / | ____| \\ \\ / /{Style.RESET_ALL}")
print(f"{Fore.GREEN}{Back.BLACK}{Style.BRIGHT} | | | | | \\| | | |__ | |/ / | |__ \\ \\/ /{Style.RESET_ALL}")
print(f"{Fore.GREEN}{Back.BLACK}{Style.BRIGHT} | | | | | |\\ | | __| | |\\ \\ | __| \\ / {Style.RESET_ALL}")
print(f"{Fore.GREEN}{Back.BLACK}{Style.BRIGHT} | |_| | | | \\ | | |___ | | \\ \\ | |___ / /{Style.RESET_ALL}")
print(f"{Fore.GREEN}{Back.BLACK}{Style.BRIGHT} \\_____/ |_| \\_| |_____| |_| \\_\\ |_____| /_/{Style.RESET_ALL}")
log.info('作者ikun0014')
log.info('本项目采用GNU General Public License v3开源许可证')
log.info('版本1.2.2')
log.info('项目仓库https://github.com/ikunshare/Onekey')
log.info('官网ikunshare.com')
log.warning('本项目完全开源免费如果你在淘宝QQ群内通过购买方式获得赶紧回去骂商家死全家\n交流群组:\nhttps://qm.qq.com/q/d7sWovfAGI\nhttps://t.me/ikunshare_group')

View File

@@ -1,26 +0,0 @@
import logging
import colorlog
def init_log():
logger = logging.getLogger('Onekey')
logger.setLevel(logging.DEBUG)
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)
fmt_string = '%(log_color)s[%(name)s][%(levelname)s]%(message)s'
log_colors = {
'DEBUG': 'blue',
'INFO': 'cyan',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'purple'
}
fmt = colorlog.ColoredFormatter(fmt_string, log_colors=log_colors)
stream_handler.setFormatter(fmt)
logger.addHandler(stream_handler)
return logger
log = init_log()

View File

@@ -1,78 +0,0 @@
import os
from aiohttp import ClientSession
from common.config import config
from common.dkey_merge import depotkey_merge
from common.migration import migrate
from common.st_unlock import stool_add
from common.gl_unlock import greenluma_add
from common.get_manifest_info import get_manifest
from common.check import check_github_api_rate_limit
from common.log import log
from common.get_steam_path import steam_path
from common.stack_error import stack_error
isGreenLuma = any((steam_path / dll).exists() for dll in ['GreenLuma_2024_x86.dll', 'GreenLuma_2024_x64.dll', 'User32.dll'])
isSteamTools = (steam_path / 'config' / 'stUI').is_dir()
async def main(app_id, repos):
app_id_list = list(filter(str.isdecimal, app_id.strip().split('-')))
if not app_id_list:
log.error("无有效的应用ID")
return False
app_id = app_id_list[0]
async with ClientSession() as session:
github_token = config.get("Github_Personal_Token")
headers = {'Authorization': f'Bearer {github_token}'} if github_token else None
latest_date = None
selected_repo = None
await check_github_api_rate_limit(headers, session)
for repo in repos:
url = f'https://api.github.com/repos/{repo}/branches/{app_id}'
try:
async with session.get(url, headers=headers, ssl=False) as r:
r_json = await r.json()
if 'commit' in r_json:
date = r_json['commit']['commit']['author']['date']
if latest_date is None or date > latest_date:
latest_date = date
selected_repo = repo
except Exception as e:
log.error(f' ⚠ 获取分支信息失败: {stack_error(e)}')
if selected_repo:
log.info(f'🔄 选择清单仓库:{selected_repo}')
url = f'https://api.github.com/repos/{selected_repo}/branches/{app_id}'
async with session.get(url, headers=headers, ssl=False) as r:
r_json = await r.json()
if 'commit' in r_json:
sha = r_json['commit']['sha']
url = r_json['commit']['commit']['tree']['url']
async with session.get(url, headers=headers, ssl=False) as r2:
r2_json = await r2.json()
if 'tree' in r2_json:
collected_depots = []
for i in r2_json['tree']:
result = await get_manifest(sha, i['path'], steam_path, selected_repo, session)
collected_depots.extend(result)
if collected_depots:
if isSteamTools:
migrate(st_use=True)
await stool_add(collected_depots, app_id)
log.info('✅ 找到SteamTools已添加解锁文件')
if isGreenLuma:
migrate(st_use=False)
await greenluma_add([app_id])
depot_config = {'depots': {depot_id: {'DecryptionKey': depot_key} for depot_id, depot_key in collected_depots}}
await depotkey_merge(steam_path / 'config' / 'config.vdf', depot_config)
if await greenluma_add([int(i) for i in depot_config['depots'] if i.isdecimal()]):
log.info('✅ 找到GreenLuma已添加解锁文件')
log.info(f'✅ 清单最后更新时间:{latest_date}')
log.info(f'✅ 入库成功: {app_id}')
os.system('pause')
return True
log.error(f'⚠ 清单下载或生成失败: {app_id}')
os.system('pause')
return False

View File

@@ -1,38 +0,0 @@
from aiohttp import ClientError
from tqdm.asyncio import tqdm_asyncio
from .log import log
async def get(sha, path, repo, session):
url_list = [
f'https://cdn.jsdmirror.com/gh/{repo}@{sha}/{path}',
f'https://jsd.onmicrosoft.cn/gh/{repo}@{sha}/{path}',
# f'https://mirror.ghproxy.com/https://raw.githubusercontent.com/{repo}/{sha}/{path}',
f'https://raw.githubusercontent.com/{repo}/{sha}/{path}',
]
retry = 3
while retry:
for url in url_list:
try:
async with session.get(url, ssl=False) as r:
if r.status == 200:
total_size = int(r.headers.get('Content-Length', 0))
if total_size == 0:
log.error(f'🔄 获取失败: {path} - 内容为空')
break
chunk_size = 1024
content = bytearray()
with tqdm_asyncio(total=total_size, unit='B', unit_scale=True, desc=f'🔃 下载 {path}', bar_format="{l_bar}{bar} [{n_fmt}/{total_fmt}] {postfix}") as pbar:
async for chunk in r.content.iter_chunked(chunk_size):
content.extend(chunk)
pbar.update(len(chunk))
return content
else:
log.error(f'🔄 获取失败: {path} - 状态码: {r.status}')
except ClientError:
log.error(f'🔄 获取失败: {path} - 连接错误')
retry -= 1
log.warning(f'🔄 重试剩余次数: {retry} - {path}')
log.error(f'🔄 超过最大重试次数: {path}')
raise Exception(f'🔄 无法下载: {path}')

View File

@@ -1,46 +0,0 @@
import os
import subprocess
import requests
from pathlib import Path
from .log import log
from .get_steam_path import steam_path
directory = Path(steam_path / "config" / "stplug-in")
def migrate(st_use):
if st_use:
log.info('🔃 检测到你正在使用SteamTools尝试迁移旧文件')
if directory.exists():
for filename in os.listdir(directory):
if filename.startswith("Onekey_unlock_"):
new_filename = filename[len("Onekey_unlock_"):]
old_file = os.path.join(directory, filename)
new_file = os.path.join(directory, new_filename)
try:
os.replace(old_file, new_file)
log.info(f'Renamed: {filename} -> {new_filename}')
except Exception as e:
log.error(f'Failed to rename {filename} -> {new_filename}: {e}')
else:
log.error('❗ 故障正在重新安装SteamTools')
temp_path = Path('./temp')
temp_path.mkdir(exist_ok=True)
down_url = 'https://steamtools.net/res/SteamtoolsSetup.exe'
out_path = temp_path / 'SteamtoolsSetup.exe'
try:
with requests.get(down_url, stream=True) as r:
r.raise_for_status()
with open(out_path, 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
except requests.HTTPError:
log.error('下载失败,网络错误')
return
subprocess.run([str(out_path)], check=True)
subprocess.run(['rm', '-rf', str(temp_path)])
else:
log.info('未使用SteamTools停止迁移')

View File

@@ -1,25 +0,0 @@
import os
import asyncio
import subprocess
import aiofiles
from .log import log
from .get_steam_path import steam_path
lock = asyncio.Lock()
async def stool_add(depot_data, app_id):
lua_filename = f"{app_id}.lua"
lua_filepath = steam_path / "config" / "stplug-in" / lua_filename
async with lock:
log.info(f'✅ SteamTools解锁文件生成: {lua_filepath}')
async with aiofiles.open(lua_filepath, mode="w", encoding="utf-8") as lua_file:
await lua_file.write(f'addappid({app_id}, 1, "None")\n')
for depot_id, depot_key in depot_data:
await lua_file.write(f'addappid({depot_id}, 1, "{depot_key}")\n')
luapacka_path = steam_path / "config" / "stplug-in" / "luapacka.exe"
subprocess.run([str(luapacka_path), str(lua_filepath)], check=True)
os.remove(lua_filepath)
return True

View File

@@ -1,5 +0,0 @@
import traceback
def stack_error(exception):
stack_trace = traceback.format_exception(type(exception), exception, exception.__traceback__)
return ''.join(stack_trace)

BIN
icon.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 262 KiB

450
main.py
View File

@@ -1,32 +1,436 @@
import platform
import sys
import os
import time
import traceback
import logzero
import asyncio
import aiofiles
import httpx
import winreg
import ujson as json
import vdf
import time
from typing import Any, Tuple, List, Dict
from pathlib import Path
from enum import Enum
from common.log import log
from common.stack_error import stack_error
from common.init_text import init
from common.main_func import main
lock = asyncio.Lock()
init()
class RepoChoice(Enum):
IKUN = ("ikun0014/ManifestHub", "已断更的旧仓库")
AUIOWU = ("Auiowu/ManifestAutoUpdate", "未知维护状态的仓库")
STEAM_AUTO = ("SteamAutoCracks/ManifestHub", "官方推荐仓库")
repos = [
'ikun0014/ManifestHub',
'Auiowu/ManifestAutoUpdate',
'tymolu233/ManifestAutoUpdate'
]
def get_app_id():
log.info('App ID可以在SteamDB或Steam商店链接页面查看')
return input("请输入游戏AppID").strip()
DEFAULT_CONFIG = {
"Github_Personal_Token": "",
"Custom_Steam_Path": "",
"QA1": "Github Personal Token可在GitHub设置的Developer settings中生成",
"教程": "https://ikunshare.com/Onekey_tutorial",
}
DEFAULT_REPO = RepoChoice.STEAM_AUTO
WINDOWS_VERSIONS = ["10", "11"]
STEAM_REG_PATH = r"Software\Valve\Steam"
CONFIG_PATH = Path("./config.json")
LOCK = asyncio.Lock()
client = httpx.AsyncClient(verify=False)
log = logzero.setup_logger("Onekey")
def init() -> None:
"""初始化控制台输出"""
banner = r"""
_____ __ _ _____ _ _ _____ __ __
/ _ \ | \ | | | ____| | | / / | ____| \ \ / /
| | | | | \| | | |__ | |/ / | |__ \ \/ /
| | | | | |\ | | __| | |\ \ | __| \ /
| |_| | | | \ | | |___ | | \ \ | |___ / /
\_____/ |_| \_| |_____| |_| \_\ |_____| /_/
"""
print(banner)
print("作者: ikun0014 | 版本: 1.3.8 | 官网: ikunshare.com")
print("项目仓库: GitHub: https://github.com/ikunshare/Onekey")
print("提示: 请确保已安装最新版Windows 10/11并正确配置Steam")
def validate_windows_version() -> None:
"""验证Windows版本"""
if platform.system() != "Windows":
log.error("仅支持Windows操作系统")
sys.exit(1)
release = platform.uname().release
if release not in WINDOWS_VERSIONS:
log.error(f"需要Windows 10/11当前版本: Windows {release}")
sys.exit(1)
async def load_config() -> Dict[str, Any]:
"""异步加载配置文件"""
if not CONFIG_PATH.exists():
await generate_config()
log.info("请填写配置文件后重新运行程序")
sys.exit(0)
if __name__ == '__main__':
try:
while True:
app_id = get_app_id()
asyncio.run(main(app_id, repos))
except KeyboardInterrupt:
exit()
async with aiofiles.open(CONFIG_PATH, "r", encoding="utf-8") as f:
return json.loads(await f.read())
except json.JSONDecodeError:
log.error("配置文件损坏,正在重新生成...")
await generate_config()
sys.exit(1)
except Exception as e:
log.error(f' ⚠ 发生错误: {stack_error(e)}将在5秒后退出')
time.sleep(5)
log.error(f"配置加载失败: {str(e)}")
sys.exit(1)
CONFIG = asyncio.run(load_config())
GITHUB_TOKEN = str(CONFIG.get("Github_Personal_Token", ""))
if GITHUB_TOKEN:
masked_token = f"{GITHUB_TOKEN[:3]}***" if len(GITHUB_TOKEN) > 3 else "***"
log.info(f"你的Github Token: {masked_token}")
else:
log.info("未配置Github Token")
HEADER = {"Authorization": f"Bearer {GITHUB_TOKEN}"} if GITHUB_TOKEN else None
async def generate_config() -> None:
"""生成默认配置文件"""
try:
async with aiofiles.open(CONFIG_PATH, "w", encoding="utf-8") as f:
await f.write(json.dumps(DEFAULT_CONFIG, indent=2, ensure_ascii=False))
log.info("配置文件已生成")
except IOError as e:
log.error(f"配置文件创建失败: {str(e)}")
sys.exit(1)
def get_steam_path(config: Dict) -> Path:
"""获取Steam安装路径"""
try:
if custom_path := config.get("Custom_Steam_Path"):
return Path(custom_path)
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, STEAM_REG_PATH) as key:
return Path(winreg.QueryValueEx(key, "SteamPath")[0])
except Exception as e:
log.error(f"Steam路径获取失败: {str(e)}")
sys.exit(1)
async def checkcn() -> bool:
try:
req = await client.get("https://mips.kugou.com/check/iscn?&format=json")
body = req.json()
scn = bool(body["flag"])
if not scn:
log.info(
f"您在非中国大陆地区({body['country']})上使用了项目, 已自动切换回Github官方下载CDN"
)
os.environ["IS_CN"] = "no"
return False
else:
os.environ["IS_CN"] = "yes"
return True
except KeyboardInterrupt:
log.info("程序已退出")
except httpx.ConnectError as e:
os.environ["IS_CN"] = "yes"
log.warning("检查服务器位置失败,已忽略,自动认为你在中国大陆")
return False
def stack_error(exception: Exception) -> str:
"""处理错误堆栈"""
stack_trace = traceback.format_exception(
type(exception), exception, exception.__traceback__
)
return "".join(stack_trace)
async def check_github_api_rate_limit(headers):
"""检查Github请求数"""
if headers != None:
log.info(f"您已配置Github Token")
url = "https://api.github.com/rate_limit"
try:
r = await client.get(url, headers=headers)
r_json = r.json()
if r.status_code == 200:
rate_limit = r_json.get("rate", {})
remaining_requests = rate_limit.get("remaining", 0)
reset_time = rate_limit.get("reset", 0)
reset_time_formatted = time.strftime(
"%Y-%m-%d %H:%M:%S", time.localtime(reset_time)
)
log.info(f"剩余请求次数: {remaining_requests}")
if remaining_requests == 0:
log.warning(
f"GitHub API 请求数已用尽, 将在 {reset_time_formatted} 重置,建议生成一个填在配置文件里"
)
else:
log.error("Github请求数检查失败, 网络错误")
except KeyboardInterrupt:
log.info("程序已退出")
except httpx.ConnectError as e:
log.error(f"检查Github API 请求数失败, {stack_error(e)}")
except httpx.ConnectTimeout as e:
log.error(f"检查Github API 请求数超时: {stack_error(e)}")
except Exception as e:
log.error(f"发生错误: {stack_error(e)}")
async def handle_depot_files(
repo: str, app_id: str, steam_path: Path
) -> List[Tuple[str, str]]:
"""处理清单文件和密钥"""
collected = []
depot_map = {}
try:
branch_url = f"https://api.github.com/repos/{repo}/branches/{app_id}"
branch_res = await client.get(branch_url, headers=HEADER)
branch_res.raise_for_status()
tree_url = branch_res.json()["commit"]["commit"]["tree"]["url"]
tree_res = await client.get(tree_url)
tree_res.raise_for_status()
depot_cache = steam_path / "depotcache"
depot_cache.mkdir(exist_ok=True)
for item in tree_res.json()["tree"]:
file_path = str(item["path"])
if file_path.endswith(".manifest"):
save_path = depot_cache / file_path
if save_path.exists():
log.warning(f"已存在清单: {save_path}")
continue
content = await fetch_from_cdn(
branch_res.json()["commit"]["sha"], file_path, repo
)
log.info(f"清单下载成功: {file_path}")
async with aiofiles.open(save_path, "wb") as f:
await f.write(content)
elif "key.vdf" in file_path.lower():
key_content = await fetch_from_cdn(
branch_res.json()["commit"]["sha"], file_path, repo
)
collected.extend(parse_key_vdf(key_content))
for item in tree_res.json()["tree"]:
if not item["path"].endswith(".manifest"):
continue
filename = Path(item["path"]).stem
if "_" not in filename:
continue
depot_id, manifest_id = filename.replace(".manifest", "").split("_", 1)
if not (depot_id.isdigit() and manifest_id.isdigit()):
continue
depot_map.setdefault(depot_id, []).append(manifest_id)
for depot_id in depot_map:
depot_map[depot_id].sort(key=lambda x: int(x), reverse=True)
except httpx.HTTPStatusError as e:
log.error(f"HTTP错误: {e.response.status_code}")
except Exception as e:
log.error(f"文件处理失败: {str(e)}")
return collected, depot_map
async def fetch_from_cdn(sha: str, path: str, repo: str):
if os.environ.get("IS_CN") == "yes":
url_list = [
f"https://jsdelivr.pai233.top/gh/{repo}@{sha}/{path}",
f"https://cdn.jsdmirror.com/gh/{repo}@{sha}/{path}",
f"https://raw.gitmirror.com/{repo}/{sha}/{path}",
f"https://raw.dgithub.xyz/{repo}/{sha}/{path}",
f"https://gh.akass.cn/{repo}/{sha}/{path}",
]
else:
url_list = [f"https://raw.githubusercontent.com/{repo}/{sha}/{path}"]
retry = 3
while retry > 0:
for url in url_list:
try:
r = await client.get(url, headers=HEADER, timeout=30)
if r.status_code == 200:
return r.read()
else:
log.error(f"获取失败: {path} - 状态码: {r.status_code}")
except KeyboardInterrupt:
log.info("程序已退出")
except httpx.ConnectError as e:
log.error(f"获取失败: {path} - 连接错误: {str(e)}")
except httpx.ConnectTimeout as e:
log.error(f"连接超时: {url} - 错误: {str(e)}")
retry -= 1
log.warning(f"重试剩余次数: {retry} - {path}")
log.error(f"超过最大重试次数: {path}")
raise Exception(f"无法下载: {path}")
def parse_key_vdf(content: bytes) -> List[Tuple[str, str]]:
"""解析密钥文件"""
try:
depots = vdf.loads(content.decode("utf-8"))["depots"]
return [(d_id, d_info["DecryptionKey"]) for d_id, d_info in depots.items()]
except Exception as e:
log.error(f"密钥解析失败: {str(e)}")
return []
async def setup_unlock_tool(
config: Dict,
depot_data: List[Tuple[str, str]],
app_id: str,
tool_choice: int,
depot_map: Dict,
) -> bool:
"""配置解锁工具"""
if tool_choice == 1:
return await setup_steamtools(config, depot_data, app_id, depot_map)
elif tool_choice == 2:
return await setup_greenluma(config, depot_data)
else:
log.error("无效的工具选择")
return False
async def setup_steamtools(
config: Dict, depot_data: List[Tuple[str, str]], app_id: str, depot_map: Dict
) -> bool:
"""配置SteamTools"""
steam_path = (
Path(config["Custom_Steam_Path"])
if config.get("Custom_Steam_Path")
else get_steam_path(config)
)
st_path = steam_path / "config" / "stplug-in"
st_path.mkdir(exist_ok=True)
choice = input(f"是否锁定版本推荐在选择仓库3时使用(y/n): ").lower()
if choice == "y":
versionlock = True
else:
versionlock = False
lua_content = f'addappid({app_id}, 1, "None")\n'
for d_id, d_key in depot_data:
if versionlock:
for manifest_id in depot_map[d_id]:
lua_content += f'addappid({d_id}, 1, "{d_key}")\nsetManifestid({d_id},"{manifest_id}")\n'
else:
lua_content += f'addappid({d_id}, 1, "{d_key}")\n'
lua_file = st_path / f"{app_id}.lua"
async with aiofiles.open(lua_file, "w") as f:
await f.write(lua_content)
proc = await asyncio.create_subprocess_exec(
str(st_path / "luapacka.exe"),
str(lua_file),
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
await proc.wait()
if proc.returncode != 0:
log.error(f"Lua编译失败: {await proc.stderr.read()}")
return False
if lua_file.exists():
os.remove(lua_file)
log.info(f"删除临时文件: {lua_file}")
return True
async def setup_greenluma(config: Dict, depot_data: List[Tuple[str, str]]) -> bool:
"""配置GreenLuma"""
steam_path = (
Path(config["Custom_Steam_Path"])
if config.get("Custom_Steam_Path")
else get_steam_path(config)
)
applist_dir = steam_path / "AppList"
applist_dir.mkdir(exist_ok=True)
for f in applist_dir.glob("*.txt"):
f.unlink()
for idx, (d_id, _) in enumerate(depot_data, 1):
(applist_dir / f"{idx}.txt").write_text(str(d_id))
config_path = steam_path / "config" / "config.vdf"
async with aiofiles.open(config_path, "r+") as f:
content = vdf.loads(await f.read())
content.setdefault("depots", {}).update(
{d_id: {"DecryptionKey": d_key} for d_id, d_key in depot_data}
)
await f.seek(0)
await f.write(vdf.dumps(content))
return True
async def main_flow():
"""主流程控制"""
validate_windows_version()
await checkcn()
init()
try:
app_id = input("请输入游戏AppID: ").strip()
if not app_id.isdigit():
raise ValueError("无效的AppID")
await check_github_api_rate_limit(HEADER)
print(
"\n".join(
[f"{idx+1}. {item.value[1]}" for idx, item in enumerate(RepoChoice)]
)
)
repo_choice = int(input("请选择清单仓库 (默认3): ") or 3)
selected_repo = list(RepoChoice)[repo_choice - 1].value[0]
tool_choice = int(input("请选择解锁工具 (1.SteamTools 2.GreenLuma): "))
config = await load_config()
steam_path = get_steam_path(config)
depot_data, depot_map = await handle_depot_files(
selected_repo, app_id, steam_path
)
if await setup_unlock_tool(config, depot_data, app_id, tool_choice, depot_map):
log.info("游戏解锁配置成功!")
if tool_choice == 1:
log.info("请重启SteamTools生效")
elif tool_choice == 2:
log.info("请重启GreenLuma生效")
else:
log.error("配置失败,请检查日志")
except Exception as e:
log.error(f"运行错误: {str(e)}")
log.debug(traceback.format_exc())
finally:
await client.aclose()
os.system("pause")
if __name__ == "__main__":
try:
asyncio.run(main_flow())
except asyncio.CancelledError:
os.system("pause")
except KeyboardInterrupt:
os.system("pause")

View File

@@ -1,6 +1,6 @@
{
"name": "onekey",
"version": "1.2.2",
"version": "1.3.8",
"description": "一个Steam仓库清单下载器",
"main": "index.js",
"scripts": {

336
poetry.lock generated Normal file
View File

@@ -0,0 +1,336 @@
# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand.
[[package]]
name = "aiofiles"
version = "24.1.0"
description = "File support for asyncio."
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"},
{file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"},
]
[[package]]
name = "anyio"
version = "4.8.0"
description = "High level compatibility layer for multiple asynchronous event loop implementations"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
{file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"},
{file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"},
]
[package.dependencies]
idna = ">=2.8"
sniffio = ">=1.1"
[package.extras]
doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"]
test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""]
trio = ["trio (>=0.26.1)"]
[[package]]
name = "certifi"
version = "2025.1.31"
description = "Python package for providing Mozilla's CA Bundle."
optional = false
python-versions = ">=3.6"
groups = ["main"]
files = [
{file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"},
{file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"},
]
[[package]]
name = "colorama"
version = "0.4.6"
description = "Cross-platform colored terminal text."
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
groups = ["main"]
markers = "sys_platform == \"win32\""
files = [
{file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
[[package]]
name = "h11"
version = "0.14.0"
description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
optional = false
python-versions = ">=3.7"
groups = ["main"]
files = [
{file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
{file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
]
[[package]]
name = "httpcore"
version = "1.0.7"
description = "A minimal low-level HTTP client."
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"},
{file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"},
]
[package.dependencies]
certifi = "*"
h11 = ">=0.13,<0.15"
[package.extras]
asyncio = ["anyio (>=4.0,<5.0)"]
http2 = ["h2 (>=3,<5)"]
socks = ["socksio (==1.*)"]
trio = ["trio (>=0.22.0,<1.0)"]
[[package]]
name = "httpx"
version = "0.28.1"
description = "The next generation HTTP client."
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"},
{file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"},
]
[package.dependencies]
anyio = "*"
certifi = "*"
httpcore = "==1.*"
idna = "*"
[package.extras]
brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""]
cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
http2 = ["h2 (>=3,<5)"]
socks = ["socksio (==1.*)"]
zstd = ["zstandard (>=0.18.0)"]
[[package]]
name = "idna"
version = "3.10"
description = "Internationalized Domain Names in Applications (IDNA)"
optional = false
python-versions = ">=3.6"
groups = ["main"]
files = [
{file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
{file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
]
[package.extras]
all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
[[package]]
name = "logzero"
version = "1.7.0"
description = "Robust and effective logging for Python 2 and 3"
optional = false
python-versions = "*"
groups = ["main"]
files = [
{file = "logzero-1.7.0-py2.py3-none-any.whl", hash = "sha256:23eb1f717a2736f9ab91ca0d43160fd2c996ad49ae6bad34652d47aba908769d"},
{file = "logzero-1.7.0.tar.gz", hash = "sha256:7f73ddd3ae393457236f081ffebd044a3aa2e423a47ae6ddb5179ab90d0ad082"},
]
[package.dependencies]
colorama = {version = "*", markers = "sys_platform == \"win32\""}
[[package]]
name = "markdown-it-py"
version = "3.0.0"
description = "Python port of markdown-it. Markdown parsing, done right!"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
{file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
]
[package.dependencies]
mdurl = ">=0.1,<1.0"
[package.extras]
benchmarking = ["psutil", "pytest", "pytest-benchmark"]
code-style = ["pre-commit (>=3.0,<4.0)"]
compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"]
linkify = ["linkify-it-py (>=1,<3)"]
plugins = ["mdit-py-plugins"]
profiling = ["gprof2dot"]
rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"]
testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
[[package]]
name = "mdurl"
version = "0.1.2"
description = "Markdown URL utilities"
optional = false
python-versions = ">=3.7"
groups = ["main"]
files = [
{file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
{file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
]
[[package]]
name = "pygments"
version = "2.19.1"
description = "Pygments is a syntax highlighting package written in Python."
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"},
{file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"},
]
[package.extras]
windows-terminal = ["colorama (>=0.4.6)"]
[[package]]
name = "rich"
version = "13.9.4"
description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
optional = false
python-versions = ">=3.8.0"
groups = ["main"]
files = [
{file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"},
{file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"},
]
[package.dependencies]
markdown-it-py = ">=2.2.0"
pygments = ">=2.13.0,<3.0.0"
[package.extras]
jupyter = ["ipywidgets (>=7.5.1,<9)"]
[[package]]
name = "sniffio"
version = "1.3.1"
description = "Sniff out which async library your code is running under"
optional = false
python-versions = ">=3.7"
groups = ["main"]
files = [
{file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
{file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
]
[[package]]
name = "ujson"
version = "5.10.0"
description = "Ultra fast JSON encoder and decoder for Python"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"},
{file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"},
{file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"},
{file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"},
{file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"},
{file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"},
{file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"},
{file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"},
{file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"},
{file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"},
{file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"},
{file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"},
{file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"},
{file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"},
{file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"},
{file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"},
{file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"},
{file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"},
{file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"},
{file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"},
{file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"},
{file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"},
{file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"},
{file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"},
{file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"},
{file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"},
{file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"},
{file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"},
{file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"},
{file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"},
{file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"},
{file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"},
{file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"},
{file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"},
{file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"},
{file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"},
{file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"},
{file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"},
{file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"},
{file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"},
{file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"},
{file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"},
{file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"},
{file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"},
{file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"},
{file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"},
{file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"},
{file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"},
{file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"},
{file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"},
{file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"},
{file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"},
{file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"},
{file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"},
{file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"},
{file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"},
{file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"},
{file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"},
{file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"},
{file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"},
{file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"},
{file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"},
{file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"},
{file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"},
{file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"},
{file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"},
{file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"},
{file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"},
{file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"},
{file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"},
{file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"},
{file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"},
{file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"},
{file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"},
{file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"},
{file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"},
{file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"},
{file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"},
]
[[package]]
name = "vdf"
version = "3.4"
description = "Library for working with Valve's VDF text format"
optional = false
python-versions = "*"
groups = ["main"]
files = [
{file = "vdf-3.4-py2.py3-none-any.whl", hash = "sha256:68c1a125cc49e343d535af2dd25074e9cb0908c6607f073947c4a04bbe234534"},
{file = "vdf-3.4.tar.gz", hash = "sha256:fd5419f41e07a1009e5ffd027c7dcbe43d1f7e8ef453aeaa90d9d04b807de2af"},
]
[metadata]
lock-version = "2.1"
python-versions = ">=3.13"
content-hash = "2f0829e2043d12d54b37941d1a7395b27c8d4793b5f921b6b39b743b08553287"

25
pyproject.toml Normal file
View File

@@ -0,0 +1,25 @@
[project]
name = "onekey"
version = "1.3.7"
description = "A Steam Depot Cache Downloader"
authors = [
{name = "ikun0014",email = "ikun0014@qq.com"}
]
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
"aiofiles (>=24.1.0,<25.0.0)",
"logzero (>=1.7.0,<2.0.0)",
"httpx (>=0.28.1,<0.29.0)",
"rich (>=13.9.4,<14.0.0)",
"ujson (>=5.10.0,<6.0.0)",
"vdf (>=3.4,<4.0)"
]
[tool.poetry]
packages = [{include = "onekey", from = "."}]
[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"

View File

@@ -1,8 +1,5 @@
aiofiles
colorlog
ujson
vdf
requests
imageio
aiohttp
tqdm
aiofiles==24.1.0
httpx==0.28.1
logzero==1.7.0
ujson==5.10.0
vdf==3.4

115
setup.py
View File

@@ -1,115 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Note: To use the 'upload' functionality of this file, you must:
# $ pipenv install twine --dev
import io
import os
import sys
from shutil import rmtree
from setuptools import find_packages, setup, Command
# Package meta-data.
NAME = 'Onekey'
DESCRIPTION = 'Onekey Steam Depot Manifest Downloader.'
URL = 'https://github.com/ikunshare/Onekey'
EMAIL = 'ikun0014@qq.com'
AUTHOR = 'ikun0014'
REQUIRES_PYTHON = '>=3.10.0'
VERSION = '1.2.2'
REQUIRED = [
'aiohttp',
'aiofiles',
'colorlog',
'ujson',
'vdf',
'requests',
'tqdm'
]
EXTRAS = {}
here = os.path.abspath(os.path.dirname(__file__))
try:
with io.open(os.path.join(here, 'README.md'), encoding='utf-8') as f:
long_description = '\n' + f.read()
except FileNotFoundError:
long_description = DESCRIPTION
about = {}
if not VERSION:
project_slug = NAME.lower().replace("-", "_").replace(" ", "_")
with open(os.path.join(here, project_slug, '__version__.py')) as f:
exec(f.read(), about)
else:
about['__version__'] = VERSION
class UploadCommand(Command):
"""Support setup.py upload."""
description = 'Build and publish the package.'
user_options = []
@staticmethod
def status(s):
"""Prints things in bold."""
print('\033[1m{0}\033[0m'.format(s))
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
try:
self.status('Removing previous builds…')
rmtree(os.path.join(here, 'dist'))
except OSError:
pass
self.status('Building Source and Wheel (universal) distribution…')
os.system('{0} setup.py sdist bdist_wheel --universal'.format(sys.executable))
self.status('Uploading the package to PyPI via Twine…')
os.system('twine upload dist/*')
self.status('Pushing git tags…')
os.system('git tag v{0}'.format(about['__version__']))
os.system('git push --tags')
sys.exit()
setup(
name=NAME,
version=about['__version__'],
description=DESCRIPTION,
long_description=long_description,
long_description_content_type='text/markdown',
author=AUTHOR,
author_email=EMAIL,
python_requires=REQUIRES_PYTHON,
url=URL,
packages=find_packages(exclude=["tests", "*.tests", "*.tests.*", "tests.*"]),
install_requires=REQUIRED,
extras_require=EXTRAS,
include_package_data=True,
license='GNU General Public License v3',
classifiers=[
'Programming Language :: Python',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.10',
'Programming Language :: Python :: Implementation :: CPython',
'Natural Language :: Chinese (Simplified)'
],
# $ setup.py publish support.
cmdclass={
'upload': UploadCommand,
},
)