- 使用
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分支格式的目录
-
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", ...}
- 格式:
-
-
以
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/你的名称/ManifestAutoUpdate --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