作者:@wxy1343
- 使用
Actions
自动爬取Steam
游戏清单
main
分支main.py
: 爬取清单主程序-c, --credential-location
: 存放账户凭据的路径,默认为data/client
-l, --level
: 日志等级,默认为INFO
-p, --pool-num
: 同时爬取账号数量,默认为8
-r, --retry-num
: 失败或超时重试次数,默认为3
-t, --update-wait-time
: 账号再次爬取间隔时间,单位秒,默认86400
-k, --key
: 用于users.json
解密的密钥- 提交远程仓库后如果重新克隆或使用
Actions
运行需要指定密钥才能解密 - 手动解密: 把密钥保存到
KEY
文件,安装git-crypt
,切换到data分支运行命令git-crypt unlock KEY
- 提交远程仓库后如果重新克隆或使用
-i, --init-only
: 仅初始化,不会去爬取清单-C, --cli
: 登录失败后会进入交互式登录-P, --no-push
: 阻止爬取完毕后自动push-u, --update
: 通过获取仓库所有app信息,来判断爬取的账号-a, --app-id
: 限定爬取的appid,可指定多个,空格分隔-U, --users
: 限定爬取的账号,可指定多个,空格分隔
storage.py
: 使用清单一键入库-r, --repo
: 指定仓库-a, --app-id
: 游戏id, 支持多次,使用空格分隔-p, --app-path
: 导入本仓库app分支格式的目录-g, --greenluma
: 使用greenluma
导入-d, --delete
: 删除使用greenluma
导入的游戏, 需要与-g, --greenluma
一起使用
apps.py
: 导出仓库所有游戏信息到apps.xlsx
-r, --repo
: 指定仓库-o, --output
: 保存目录
merge.py
: 用于Actions
自动合并pr
-t, --token
: 个人访问令牌-l, --level
: 日志等级,默认为INFO
push.py
: 用于推送分支pr.py
: 用于pr分支-r, --repo
: 指定仓库-t, --token
: 个人访问令牌
data
分支: 用于存放账号数据,第一次运行程序初始化后会自动将其签出到data
目录data/client
: 用于存放账号凭证文件和cm
服务器信息的目录,需要将账号ssfn
文件放在该目录data/users.json
: 用于存放账号和密码- 格式为:
{"账号": ["密码", "ssfnxxxx"], "账号": ["密码", null], ...}
- 没有
ssfn
需要填null
- 格式为:
data/appinfo.json
: 用于存放appid
对应的清单id
- 格式为:
{"11111": "清单id", ...}
- 格式为:
data/userinfo.json
: 用于存放账户拥有的appid
信息和是否被禁用等信息- 格式为:
{"账号": {"app": [11111, 22222, ...], "update": 1673018145, "enable": true, "status": 63}, ...}
update
: 上次更新时间戳enable
: 是否被禁用status
: 登录失败的原因 - EResult
- 格式为:
data/.gitattributes
: 记录git-crypt
需要加密的文件- 默认加密:
users.json client/*.key 2fa.json
- 默认加密:
data/2fa.json
: 记录账号2fa
信息- 格式:
{"账号": "shared_secret", ...}
- 格式:
data/ids.json
: 用于存放游戏dlcid
,以供greenluma
使用- 格式:
{"appid": {"name": 游戏名称, "dlcid":[111111, 222222]}}
- 格式:
- 以
appid
为名称的分支: 该分支用于存放清单和密钥文件depots/xxx
: 程序运行后如果该app
有新的清单会从远程拉取对应appid
分支,不存在则会使用main
分支的第一次提交创建一个空的appid
分支,使用worktree
将其签出到depots/对应appid分支
目录,例如depots/11111
depots/xxx/仓库id_清单id.manifest
: 清单文件config.vdf
: 密钥文件,其格式参考Steam/config/config.vdf
-
"depots" { "仓库id" { "DecryptionKey" "仓库密钥" } }
-
tag
: 标记每一个的清单的提交- 命名格式:
仓库id_清单id
- 用于过滤已爬取的清单
- 命名格式:
.github/workflows/CI.yml
- 使用
Actions
定期爬取清单
- 使用
- 开启多线程同时登录多个账号爬取清单,直到所有账号都被爬取完毕
- 判断账号是否禁用
- 判断账号距离上次爬取时间是否大于可爬取间隔
- 获取账号所有可爬取的清单,使用
tag
过滤已爬取的清单
- 爬取结束后调用
push.py
上传分支
和tag
,并推送data
分支
- fork本仓库(使用
Actions
初始化可跳过以下步骤) - 安装git,并配置你的
github
账号 - 克隆你fork的仓库
git clone https://github.com/你的名称/Manifest-AutoUpdate --recurse-submodules --depth=1
--recurse-submodules
: 克隆子模块--depth=1
: 浅克隆
- 安装依赖
pip install -r requirements.txt
- 运行程序
python main.py
- 初始化
- 第一次运行程序会进行初始化操作
- 初始化会生成
data
分支,使用worktree
签出到data
目录 - 生成密钥用于加密
users.json
- 密钥生成路径位于:
data/KEY
- 同时程序会输出密钥的十六进制字符串,需要将其存放到github仓库密钥,名称保存为
KEY
- 打开你的仓库 ->
Settings
->Secrets
->Actions
->New repository secret
- 或者在你的仓库地址后面加上
/settings/secrets/actions/new
- 打开你的仓库 ->
- 密钥生成路径位于:
- 增加账号密码到
data/users.json
:- 之后如果需要使用
Actions
需要将其推送到远程仓库- 再次运行程序,程序结束时会自动推送到
data
分支 - 手动推送步骤如下:
cd data
: 切换到data
目录git add -u
: 增加修改的内容git commit -m "update"
: 提交修改git push origin data
: 推送到远程data
分支
- 再次运行程序,程序结束时会自动推送到
- 之后如果需要使用
- Actions初始化和运行
- 配置
workflow
读写权限: 仓库 ->Settings
->Actions
->General
->Workflow permissions
->Read and write permissions
- 仓库打开
Actions
选择对应的Workflow
点击Run workflow
选择好参数运行INIT
: 初始化users
: 账号,可指定多个,逗号分隔password
: 密码,可指定多个,逗号分隔ssfn
: ssfn,需要提前上传该文件到credential_location
目录,可指定多个,逗号分隔2fa
: shared_secret,可指定多个,逗号分隔update
: 是否更新账号update_users
: 需要更新的账号- 第一次初始化后记得保存密钥到仓库密钥,不然下次运行会因为没有密钥而报错,然后记得删除本次
Workflow
运行结果,防止密钥泄露,或者使用本地初始化更安全
CI
: 爬取所有账号PR
: 自动pr
清单到指定仓库MERGE
: 自动检查pr
并合并清单UPDATE
: 加了-u
参数
- 配置
- 本项目使用
Actions
定期检查并合并清单,是否合并成功请在Actions
运行完后查看对应分支
- 完成部署本项目并爬取清单
- 打开你要
pr
清单的分支,点击Compare & pull request
- 点击
Create pull request
创建pr