f1b218f57d1d06abf338b9b801a2c60571e2b350
gitea-shunt-rules
一个最小可用的规则生成器:
- 先全量拉取上游
ios_rule_script的Surge规则到本地缓存 - 再在本地做合并去重并转换多渠道
- 输入按目录分类(默认读取
upstream/rule/Surge/<Name>/...) - 输出仅包含你要的两种格式:
dist/surge/<Name>.listdist/loon/<Name>.listdist/clash/<Name>.yamldist/mihomo/<Name>.yaml
- 当前策略:只使用 Surge 作为上游源,Clash 由 Surge 规则转换生成
为什么这个方案适合你
ShuntRules 公开仓库基本只留了发布索引,生成器不在仓库中。这个项目按它的输出思路重建了可控版本,并把数据源切到 Gitea,便于你自己托管。
运行环境
- Python 3.11+(可直接使用 TOML 配置)
- Python 3.10 也可用,但建议改用 JSON 配置(
config.example.json)
快速开始
仓库已内置可直接跑的默认配置文件 config.json(本地源模式,默认读 upstream/)。
- 复制配置:
cd /Users/yuan/Desktop/workspaces/docker/pve/gitea-shunt-rules
cp config.example.toml config.toml
- 填写
config.toml:
gitea.base_url:你的 Gitea 地址,例如https://git.xxx.comgitea.owner/gitea.repo:规则仓库source.root:源规则根目录,默认rule/Surge
- 设置 token(如果仓库私有):
export GITEA_TOKEN='your-token'
如果数据源仓库是公开的(当前默认就是公开源),可以不设置 token。 默认配置会生成约 600+ 分类(当前为 667 个可直接生成的分类)。
3.1 先同步 Surge 全量源到本地缓存:
bash scripts/sync_surge_full.sh
- 生成全部分类:
python3 main.py --config config.toml
- 只生成部分分类:
python3 main.py --config config.toml --names YouTube,Netflix
如果你是 Python 3.10,可用 JSON 配置:
cp config.example.json config.json
python3 main.py --config config.json --names YouTube,Netflix
目录规范(推荐)
建议你的 Gitea 仓库中按以下结构维护源数据:
rule/Surge/
YouTube/
YouTube.list
Netflix/
Netflix.list
每个 .list 文件示例:
# 注释会被忽略
DOMAIN-SUFFIX,youtube.com
DOMAIN-KEYWORD,youtube
IP-CIDR,172.110.32.0/21,no-resolve
USER-AGENT,*youtube*
转换规则说明
基础合并策略(Surge)
每个分类优先按下面三份源文件做合并去重(按顺序):
<Name>.list<Name>_Domain.list<Name>_Resolve.list
如果某分类不满足上述结构,会自动回退到 _All.list 等可用文件。
- Surge 输出:保留源规则(去重、清理空白)
- Loon 输出:基于 Surge 规则直接输出(同样去重、清理空白)
- Clash 输出:
- 自动移除注释/空行
USER-AGENT、URL-REGEX默认跳过(并在头部记录SKIPPED-*)DEST-PORT自动映射为DST-PORTIP-CIDR/IP-CIDR6可通过clash_no_resolve控制是否追加no-resolve
- Mihomo 输出:
- 使用与 Clash 相同的 provider YAML 结构
DEST-PORT自动映射为DST-PORTUSER-AGENT、URL-REGEX默认跳过(并在头部记录SKIPPED-*)IP-CIDR/IP-CIDR6可通过mihomo_no_resolve控制是否追加no-resolve
定时更新建议
你可以在 Gitea Actions 或系统 cron 做定时任务:
- 拉取源仓库
- 执行
python3 main.py --config config.toml - 提交
dist/目录到发布仓库或对象存储
Gitea Actions(已内置)
项目已包含工作流文件:
/Users/yuan/Desktop/workspaces/docker/pve/gitea-shunt-rules/.gitea/workflows/generate-rules.yml
你只需要做这几步:
- 在仓库根目录放好
config.toml或config.json - 在 Gitea 仓库 Secrets 中添加
GITEA_TOKEN(私有源仓库建议必须配置) - 推送到
main后会自动执行;也可在 Actions 页面手动触发
当前定时表达式是 0 3 * * *(UTC),对应北京时间(UTC+8)每天 11:00。
工作流会先执行 scripts/sync_surge_full.sh 拉取上游 Surge 全量数据,再生成多渠道规则。
发布到独立仓库/分支(已内置)
如果你希望“生成仓库”和“发布仓库”分离,使用:
/Users/yuan/Desktop/workspaces/docker/pve/gitea-shunt-rules/.gitea/workflows/publish-rules.yml
这个工作流会:
- 从你指定的源仓库读取规则并生成
dist/ - 把
dist/内容同步到目标仓库的目标分支(可单独设为rules/gh-pages)
需要在 Gitea 仓库中配置:
- Secrets:
GITEA_BASE_URL:例如https://gitea.example.comGITEA_TOKEN:需要有读取源仓库 + 推送目标仓库权限SOURCE_OWNERSOURCE_REPOTARGET_OWNERTARGET_REPO
- Variables(可选):
SOURCE_REF(默认main)SOURCE_ROOT(默认rule/Surge)TARGET_BRANCH(默认main)CLASH_NO_RESOLVE(默认false)MIHOMO_NO_RESOLVE(默认false)
该工作流当前定时为 15 3 * * *(UTC),对应北京时间每天 11:15,也支持手动触发。
Description
Languages
Python
94.3%
Shell
5.7%