name: Download and Publish Clash Rules on: schedule: - cron: '0 23 * * *' # 每天北京时间早上7点执行 workflow_dispatch: # 允许手动触发 push: branches: [ main, master ] jobs: download-and-publish: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 with: token: ${{ secrets.GITHUB_TOKEN }} - name: 创建规则目录 run: mkdir -p ruleset - name: 下载规则文件 run: | echo "开始下载规则文件..." # 定义规则文件列表 rules=( "reject" "icloud" "apple" "google" "proxy" "direct" "private" "gfw" "tld-not-cn" "telegramcidr" "cncidr" "lancidr" "applications" ) # 下载所有规则文件 for rule in "${rules[@]}"; do echo "下载 $rule.txt..." curl -L "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/${rule}.txt" \ -o "ruleset/${rule}.txt" \ --fail \ --silent \ --show-error \ --retry 3 \ --retry-delay 5 # 同时生成 YAML 格式(Clash 需要) echo "payload:" > "ruleset/${rule}.yaml" sed 's/^/ - /' "ruleset/${rule}.txt" >> "ruleset/${rule}.yaml" done - name: 生成索引文件 run: | cat > ruleset/README.md << 'EOF' # Clash 规则文件 最后更新时间: $(date +'%Y-%m-%d %H:%M:%S UTC') ## 规则文件列表 | 规则名称 | 文本格式 | YAML格式 | 描述 | |---------|---------|----------|------| | 广告拦截 | [reject.txt](./reject.txt) | [reject.yaml](./reject.yaml) | 广告和跟踪域名 | | iCloud | [icloud.txt](./icloud.txt) | [icloud.yaml](./icloud.yaml) | iCloud 域名 | | 苹果服务 | [apple.txt](./apple.txt) | [apple.yaml](./apple.yaml) | Apple 服务域名 | | 谷歌服务 | [google.txt](./google.txt) | [google.yaml](./google.yaml) | Google 服务域名 | | 代理列表 | [proxy.txt](./proxy.txt) | [proxy.yaml](./proxy.yaml) | 需要代理的域名 | | 直连列表 | [direct.txt](./direct.txt) | [direct.yaml](./direct.yaml) | 直连域名 | | 私有网络 | [private.txt](./private.txt) | [private.yaml](./private.yaml) | 私有网络域名 | | GFW列表 | [gfw.txt](./gfw.txt) | [gfw.yaml](./gfw.yaml) | GFW 域名列表 | | 非中国顶级域名 | [tld-not-cn.txt](./tld-not-cn.txt) | [tld-not-cn.yaml](./tld-not-cn.yaml) | 非中国顶级域名 | | Telegram CIDR | [telegramcidr.txt](./telegramcidr.txt) | [telegramcidr.yaml](./telegramcidr.yaml) | Telegram IP 段 | | 中国 CIDR | [cncidr.txt](./cncidr.txt) | [cncidr.yaml](./cncidr.yaml) | 中国 IP 段 | | 局域网 CIDR | [lancidr.txt](./lancidr.txt) | [lancidr.yaml](./lancidr.yaml) | 局域网 IP 段 | | 应用规则 | [applications.txt](./applications.txt) | [applications.yaml](./applications.yaml) | 应用程序规则 | ## 使用方法 ### 在 Clash 配置中使用(远程规则) \`\`\`yaml rule-providers: reject: type: http behavior: domain url: "https://raw.githubusercontent.com/[你的用户名]/[你的仓库名]/main/ruleset/reject.yaml" path: ./ruleset/reject.yaml interval: 86400 \`\`\` ### 在 Clash 配置中使用(本地规则) 1. 下载规则文件到本地 Clash 配置目录 2. 在配置文件中引用: \`\`\`yaml rule-providers: reject: type: file behavior: domain path: ./ruleset/reject.yaml \`\`\` ## 数据来源 规则文件来源于 [Loyalsoldier/clash-rules](https://github.com/Loyalsoldier/clash-rules) ## 更新频率 每天自动更新一次(UTC 23:00 / 北京时间 07:00) EOF - name: 生成更新日志 run: | cat > ruleset/UPDATE_LOG.md << EOF # 更新日志 ## $(date +'%Y-%m-%d') ### 文件统计 EOF echo '```' >> ruleset/UPDATE_LOG.md ls -lh ruleset/*.txt | awk '{print $9 ": " $5}' >> ruleset/UPDATE_LOG.md echo '```' >> ruleset/UPDATE_LOG.md echo "" >> ruleset/UPDATE_LOG.md echo "### 规则数量统计" >> ruleset/UPDATE_LOG.md echo '```' >> ruleset/UPDATE_LOG.md for file in ruleset/*.txt; do name=$(basename "$file" .txt) count=$(wc -l < "$file") echo "$name: $count 条规则" >> ruleset/UPDATE_LOG.md done echo '```' >> ruleset/UPDATE_LOG.md - name: 配置 Git run: | git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" - name: 提交更改 run: | git add ruleset/ git diff --cached --quiet || git commit -m "Update clash rules - $(date +'%Y-%m-%d')" - name: 推送到仓库 run: | git push origin main || git push origin master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: 创建 Release(每周一次) if: github.event_name == 'schedule' && contains('1', github.run_number) uses: softprops/action-gh-release@v1 with: tag_name: v${{ github.run_number }} name: Clash Rules ${{ github.run_number }} body: | ## 📦 Clash 规则文件更新 **更新时间**: ${{ env.DATE }} ### 📥 下载链接 您可以通过以下方式获取规则文件: 1. **直接引用**(推荐) ``` https://raw.githubusercontent.com/${{ github.repository }}/main/ruleset/[规则名].yaml ``` 2. **下载压缩包** 点击下方的 `clash-rules.zip` 下载所有规则文件 ### 📊 本次更新统计 查看 [UPDATE_LOG.md](https://github.com/${{ github.repository }}/blob/main/ruleset/UPDATE_LOG.md) ### 🔗 相关链接 - [规则使用说明](https://github.com/${{ github.repository }}/blob/main/ruleset/README.md) - [数据来源](https://github.com/Loyalsoldier/clash-rules) files: | ruleset/*.txt ruleset/*.yaml draft: false prerelease: false - name: 创建规则压缩包 if: github.event_name == 'workflow_dispatch' run: | cd ruleset zip -r ../clash-rules.zip *.txt *.yaml README.md UPDATE_LOG.md cd .. - name: 上传压缩包作为 Artifact if: github.event_name == 'workflow_dispatch' uses: actions/upload-artifact@v3 with: name: clash-rules-${{ github.run_number }} path: clash-rules.zip retention-days: 7 - name: 输出访问地址 run: | echo "✅ 规则文件已成功发布!" echo "" echo "📁 文件访问地址:" echo "https://github.com/${{ github.repository }}/tree/main/ruleset" echo "" echo "🔗 Raw 文件地址示例:" echo "https://raw.githubusercontent.com/${{ github.repository }}/main/ruleset/reject.yaml" echo "" echo "📦 CDN 加速地址(中国可访问):" echo "https://cdn.jsdelivr.net/gh/${{ github.repository }}@main/ruleset/reject.yaml" echo "https://fastly.jsdelivr.net/gh/${{ github.repository }}@main/ruleset/reject.yaml"