Download github-token-helper.html from CatPtain/VvvebJs: direct link, hf CLI and curl.
- Browser
- Download file 21.5 kB
-
https://huggingface.co/spaces/CatPtain/VvvebJs/resolve/main/github-token-helper.html
- Command line
-
hf download hf://spaces/CatPtain/VvvebJs/github-token-helper.html
-
curl -L -o github-token-helper.html https://huggingface.co/spaces/CatPtain/VvvebJs/resolve/main/github-token-helper.html
21.5 kB
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| <title>GitHub Token 权限配置助手</title> | |
| <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> | |
| <style> | |
| .permission-card { | |
| border-left: 4px solid #007bff; | |
| transition: all 0.3s ease; | |
| } | |
| .permission-required { | |
| border-left-color: #28a745; | |
| background-color: #f8fff9; | |
| } | |
| .permission-optional { | |
| border-left-color: #ffc107; | |
| background-color: #fefdf5; | |
| } | |
| .permission-not-needed { | |
| border-left-color: #dc3545; | |
| background-color: #fff5f5; | |
| } | |
| .step-number { | |
| background: linear-gradient(45deg, #007bff, #0056b3); | |
| color: white; | |
| border-radius: 50%; | |
| width: 40px; | |
| height: 40px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-weight: bold; | |
| } | |
| .checklist-item { | |
| padding: 8px 0; | |
| border-bottom: 1px solid #eee; | |
| } | |
| .token-example { | |
| font-family: monospace; | |
| background: #f8f9fa; | |
| padding: 4px 8px; | |
| border-radius: 4px; | |
| border: 1px solid #dee2e6; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="container mt-4"> | |
| <div class="row"> | |
| <div class="col-md-10 mx-auto"> | |
| <div class="text-center mb-5"> | |
| <h1 class="display-4">🔑 GitHub Token 权限配置助手</h1> | |
| <p class="lead">为 VvvebJs 配置正确的 GitHub 访问权限</p> | |
| </div> | |
| <!-- 快速开始 --> | |
| <div class="card mb-4 border-primary"> | |
| <div class="card-header bg-primary text-white"> | |
| <h3 class="mb-0">⚡ 快速开始</h3> | |
| </div> | |
| <div class="card-body"> | |
| <div class="row"> | |
| <div class="col-md-6"> | |
| <h5>👈 我是新手</h5> | |
| <p class="text-muted">第一次配置 GitHub Token</p> | |
| <a href="https://github.com/settings/tokens/new" target="_blank" class="btn btn-outline-primary"> | |
| 🚀 创建新 Token | |
| </a> | |
| </div> | |
| <div class="col-md-6"> | |
| <h5>🔧 我需要排查问题</h5> | |
| <p class="text-muted">Token 已创建但有问题</p> | |
| <a href="github-test.php" class="btn btn-outline-warning"> | |
| 🧪 测试现有配置 | |
| </a> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- 步骤指导 --> | |
| <div class="row"> | |
| <!-- 步骤1 --> | |
| <div class="col-md-6 mb-4"> | |
| <div class="card h-100"> | |
| <div class="card-body"> | |
| <div class="d-flex align-items-center mb-3"> | |
| <div class="step-number me-3">1</div> | |
| <h4 class="mb-0">访问 GitHub 设置</h4> | |
| </div> | |
| <ol> | |
| <li>登录 <a href="https://github.com" target="_blank">GitHub</a></li> | |
| <li>点击右上角头像 → Settings</li> | |
| <li>左侧菜单 → Developer settings</li> | |
| <li>Personal access tokens → Tokens (classic)</li> | |
| <li>Generate new token (classic)</li> | |
| </ol> | |
| <a href="https://github.com/settings/tokens" target="_blank" class="btn btn-primary btn-sm"> | |
| 🔗 直接跳转 | |
| </a> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- 步骤2 --> | |
| <div class="col-md-6 mb-4"> | |
| <div class="card h-100"> | |
| <div class="card-body"> | |
| <div class="d-flex align-items-center mb-3"> | |
| <div class="step-number me-3">2</div> | |
| <h4 class="mb-0">填写基本信息</h4> | |
| </div> | |
| <div class="mb-3"> | |
| <label class="form-label"><strong>Note (描述):</strong></label> | |
| <div class="token-example">VvvebJs Website Editor</div> | |
| </div> | |
| <div class="mb-3"> | |
| <label class="form-label"><strong>Expiration (过期时间):</strong></label> | |
| <div class="text-success">推荐: 90 days</div> | |
| <small class="text-muted">平衡安全性和便利性</small> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- 权限选择 --> | |
| <div class="card mb-4"> | |
| <div class="card-header"> | |
| <div class="d-flex align-items-center"> | |
| <div class="step-number me-3">3</div> | |
| <h3 class="mb-0">选择权限范围 (Scopes)</h3> | |
| </div> | |
| </div> | |
| <div class="card-body"> | |
| <div class="alert alert-warning"> | |
| <strong>⚠️ 重要:</strong> 必须勾选 <code>repo</code> 权限,这是 VvvebJs 保存文件的基础要求。 | |
| </div> | |
| <!-- 必需权限 --> | |
| <div class="permission-card permission-required card mb-3"> | |
| <div class="card-header"> | |
| <h5 class="text-success mb-0">✅ 必需权限</h5> | |
| </div> | |
| <div class="card-body"> | |
| <div class="form-check"> | |
| <input class="form-check-input" type="checkbox" checked disabled> | |
| <label class="form-check-label"> | |
| <strong>repo</strong> - Full control of private repositories | |
| </label> | |
| </div> | |
| <small class="text-muted ms-4"> | |
| 包含: repo:status, repo_deployment, public_repo, repo:invite<br> | |
| <strong>用途:</strong> 创建、读取、更新网页文件 | |
| </small> | |
| </div> | |
| </div> | |
| <!-- 可选权限 --> | |
| <div class="permission-card permission-optional card mb-3"> | |
| <div class="card-header"> | |
| <h5 class="text-warning mb-0">⚠️ 可选权限</h5> | |
| </div> | |
| <div class="card-body"> | |
| <div class="form-check mb-2"> | |
| <input class="form-check-input" type="checkbox"> | |
| <label class="form-check-label"> | |
| <strong>workflow</strong> - Update GitHub Action workflows | |
| </label> | |
| </div> | |
| <small class="text-muted ms-4 d-block mb-3"> | |
| <strong>用途:</strong> 如果您计划使用 GitHub Actions 自动部署 | |
| </small> | |
| <div class="form-check mb-2"> | |
| <input class="form-check-input" type="checkbox"> | |
| <label class="form-check-label"> | |
| <strong>write:packages / read:packages</strong> - Package registry access | |
| </label> | |
| </div> | |
| <small class="text-muted ms-4 d-block"> | |
| <strong>用途:</strong> 如果您需要管理 GitHub Packages | |
| </small> | |
| </div> | |
| </div> | |
| <!-- 不需要的权限 --> | |
| <div class="permission-card permission-not-needed card"> | |
| <div class="card-header"> | |
| <h5 class="text-danger mb-0">❌ 不需要的权限</h5> | |
| </div> | |
| <div class="card-body"> | |
| <div class="row"> | |
| <div class="col-md-6"> | |
| <ul class="list-unstyled"> | |
| <li>❌ admin:repo_hook</li> | |
| <li>❌ admin:org</li> | |
| <li>❌ admin:public_key</li> | |
| <li>❌ gist</li> | |
| </ul> | |
| </div> | |
| <div class="col-md-6"> | |
| <ul class="list-unstyled"> | |
| <li>❌ notifications</li> | |
| <li>❌ user</li> | |
| <li>❌ delete_repo</li> | |
| <li>❌ admin:org_hook</li> | |
| </ul> | |
| </div> | |
| </div> | |
| <small class="text-muted"> | |
| <strong>原因:</strong> VvvebJs 只需要读写文件,不需要管理权限 | |
| </small> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- 配置示例 --> | |
| <div class="card mb-4"> | |
| <div class="card-header"> | |
| <div class="d-flex align-items-center"> | |
| <div class="step-number me-3">4</div> | |
| <h3 class="mb-0">配置环境变量</h3> | |
| </div> | |
| </div> | |
| <div class="card-body"> | |
| <div class="alert alert-info"> | |
| <strong>📋 获取 Token 后,在 Hugging Face Space Settings 中添加这些环境变量:</strong> | |
| </div> | |
| <div class="row"> | |
| <div class="col-md-6"> | |
| <h5>🔑 GitHub 认证</h5> | |
| <div class="bg-light p-3 rounded"> | |
| <code>GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</code><br> | |
| <code>GITHUB_OWNER=your_username</code><br> | |
| <code>GITHUB_REPO=your_repo_name</code><br> | |
| </div> | |
| </div> | |
| <div class="col-md-6"> | |
| <h5>⚙️ 存储配置</h5> | |
| <div class="bg-light p-3 rounded"> | |
| <code>GITHUB_BRANCH=main</code><br> | |
| <code>GITHUB_PATH=pages/</code><br> | |
| <code>STORAGE_TYPE=github</code><br> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="mt-3"> | |
| <h6>📝 配置说明:</h6> | |
| <ul> | |
| <li><code>GITHUB_TOKEN</code>: 刚创建的 40 字符 Token (以 ghp_ 开头)</li> | |
| <li><code>GITHUB_OWNER</code>: 您的 GitHub 用户名</li> | |
| <li><code>GITHUB_REPO</code>: 存储网页的仓库名</li> | |
| <li><code>GITHUB_PATH</code>: 网页保存的目录 (可以为空)</li> | |
| </ul> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- 验证清单 --> | |
| <div class="card mb-4"> | |
| <div class="card-header"> | |
| <div class="d-flex align-items-center"> | |
| <div class="step-number me-3">5</div> | |
| <h3 class="mb-0">验证配置</h3> | |
| </div> | |
| </div> | |
| <div class="card-body"> | |
| <h5>✅ 配置检查清单</h5> | |
| <div id="checklist"> | |
| <div class="checklist-item"> | |
| <input type="checkbox" class="form-check-input me-2" id="check1"> | |
| <label for="check1">Token 已创建且有 <code>repo</code> 权限</label> | |
| </div> | |
| <div class="checklist-item"> | |
| <input type="checkbox" class="form-check-input me-2" id="check2"> | |
| <label for="check2">环境变量已在 Hugging Face Space 中配置</label> | |
| </div> | |
| <div class="checklist-item"> | |
| <input type="checkbox" class="form-check-input me-2" id="check3"> | |
| <label for="check3">GitHub 仓库已创建且可访问</label> | |
| </div> | |
| <div class="checklist-item"> | |
| <input type="checkbox" class="form-check-input me-2" id="check4"> | |
| <label for="check4">分支名称正确 (通常是 main 或 master)</label> | |
| </div> | |
| <div class="checklist-item"> | |
| <input type="checkbox" class="form-check-input me-2" id="check5"> | |
| <label for="check5">已通过测试页面验证</label> | |
| </div> | |
| </div> | |
| <div class="mt-4"> | |
| <a href="github-test.php" class="btn btn-success me-2">🧪 测试配置</a> | |
| <a href="config.php" class="btn btn-secondary me-2">⚙️ 查看状态</a> | |
| <a href="editor.html" class="btn btn-primary">🎨 开始使用编辑器</a> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- 故障排除 --> | |
| <div class="card"> | |
| <div class="card-header"> | |
| <h3>🔧 常见问题和解决方案</h3> | |
| </div> | |
| <div class="card-body"> | |
| <div class="accordion" id="troubleshootingAccordion"> | |
| <!-- 问题1 --> | |
| <div class="accordion-item"> | |
| <h5 class="accordion-header"> | |
| <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#trouble1"> | |
| 403 Forbidden - 权限不足 | |
| </button> | |
| </h5> | |
| <div id="trouble1" class="accordion-collapse collapse" data-bs-parent="#troubleshootingAccordion"> | |
| <div class="accordion-body"> | |
| <strong>原因:</strong> Token 权限不足<br> | |
| <strong>解决:</strong> | |
| <ol> | |
| <li>确保勾选了 <code>repo</code> 权限</li> | |
| <li>重新生成 Token 并更新环境变量</li> | |
| <li>检查仓库是否为私有仓库(需要完整 repo 权限)</li> | |
| </ol> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- 问题2 --> | |
| <div class="accordion-item"> | |
| <h5 class="accordion-header"> | |
| <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#trouble2"> | |
| 401 Unauthorized - 认证失败 | |
| </button> | |
| </h5> | |
| <div id="trouble2" class="accordion-collapse collapse" data-bs-parent="#troubleshootingAccordion"> | |
| <div class="accordion-body"> | |
| <strong>原因:</strong> Token 无效或过期<br> | |
| <strong>解决:</strong> | |
| <ol> | |
| <li>检查 Token 是否正确复制(40个字符,以 ghp_ 开头)</li> | |
| <li>检查 Token 是否过期</li> | |
| <li>重新生成新的 Token</li> | |
| </ol> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- 问题3 --> | |
| <div class="accordion-item"> | |
| <h5 class="accordion-header"> | |
| <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#trouble3"> | |
| 404 Not Found - 仓库不存在 | |
| </button> | |
| </h5> | |
| <div id="trouble3" class="accordion-collapse collapse" data-bs-parent="#troubleshootingAccordion"> | |
| <div class="accordion-body"> | |
| <strong>原因:</strong> 仓库不存在或 Token 无访问权限<br> | |
| <strong>解决:</strong> | |
| <ol> | |
| <li>检查 <code>GITHUB_OWNER</code> 是否是正确的用户名</li> | |
| <li>检查 <code>GITHUB_REPO</code> 是否是正确的仓库名</li> | |
| <li>确保仓库存在且 Token 有访问权限</li> | |
| <li>如果是组织仓库,确保 Token 有组织权限</li> | |
| </ol> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> | |
| <script> | |
| // 保存检查状态 | |
| document.addEventListener('DOMContentLoaded', function() { | |
| const checkboxes = document.querySelectorAll('#checklist input[type="checkbox"]'); | |
| checkboxes.forEach(checkbox => { | |
| checkbox.addEventListener('change', function() { | |
| localStorage.setItem(this.id, this.checked); | |
| }); | |
| // 恢复状态 | |
| const saved = localStorage.getItem(checkbox.id); | |
| if (saved === 'true') { | |
| checkbox.checked = true; | |
| } | |
| }); | |
| }); | |
| </script> | |
| </body> | |
| </html> |