Download github-save-debug.php from CatPtain/VvvebJs: direct link, hf CLI and curl.
- Browser
- Download file 18.9 kB
-
https://huggingface.co/spaces/CatPtain/VvvebJs/resolve/main/github-save-debug.php
- Command line
-
hf download hf://spaces/CatPtain/VvvebJs/github-save-debug.php
-
curl -L -o github-save-debug.php https://huggingface.co/spaces/CatPtain/VvvebJs/resolve/main/github-save-debug.php
18.9 kB
| require_once __DIR__ . '/storage.php'; | |
| // 简单认证 | |
| $testAuth = false; | |
| if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) { | |
| $users = StorageConfig::getUsers(); | |
| $testAuth = isset($users[$_SERVER['PHP_AUTH_USER']]) && | |
| $users[$_SERVER['PHP_AUTH_USER']] === $_SERVER['PHP_AUTH_PW']; | |
| } | |
| if (!$testAuth) { | |
| header('WWW-Authenticate: Basic realm="VvvebJs GitHub Debug"'); | |
| header('HTTP/1.0 401 Unauthorized'); | |
| die('Authentication required'); | |
| } | |
| // 获取环境信息 | |
| $isHuggingFace = StorageConfig::isHuggingFaceSpace(); | |
| $github = StorageConfig::getGitHubConfig(); | |
| $envDebug = StorageConfig::debugEnvironment(); | |
| // 测试保存功能 | |
| $testResults = []; | |
| if ($_POST['test_save'] ?? false) { | |
| $testHtml = '<!DOCTYPE html><html><head><title>VvvebJs Test</title></head><body><h1>Test file created at ' . date('Y-m-d H:i:s') . '</h1><p>This is a test file created to verify GitHub save functionality.</p></body></html>'; | |
| $testFilename = 'test-' . time() . '.html'; | |
| try { | |
| $storageManager = new StorageManager(); | |
| $result = $storageManager->saveFile($testFilename, $testHtml); | |
| $testResults['save_test'] = [ | |
| 'success' => $result, | |
| 'filename' => $testFilename, | |
| 'content_length' => strlen($testHtml), | |
| 'message' => $result ? 'File saved successfully!' : 'Save failed!' | |
| ]; | |
| // 立即尝试读取文件验证 | |
| if ($result) { | |
| $retrievedContent = $storageManager->getFile($testFilename); | |
| $testResults['read_test'] = [ | |
| 'success' => $retrievedContent !== false, | |
| 'content_matches' => $retrievedContent === $testHtml, | |
| 'retrieved_length' => $retrievedContent ? strlen($retrievedContent) : 0 | |
| ]; | |
| } | |
| } catch (Exception $e) { | |
| $testResults['save_test'] = [ | |
| 'success' => false, | |
| 'error' => $e->getMessage(), | |
| 'filename' => $testFilename | |
| ]; | |
| } | |
| } | |
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| <title>VvvebJs GitHub 保存调试</title> | |
| <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> | |
| <style> | |
| .config-value { background-color: #f8f9fa; padding: 2px 6px; border-radius: 3px; font-family: monospace; } | |
| .status-ok { color: #28a745; } | |
| .status-error { color: #dc3545; } | |
| .status-warning { color: #ffc107; } | |
| .debug-output { background: #f8f9fa; padding: 15px; border-radius: 5px; font-family: monospace; font-size: 12px; max-height: 400px; overflow-y: auto; } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="container mt-5"> | |
| <div class="row"> | |
| <div class="col-md-10 mx-auto"> | |
| <h1 class="mb-4">🚨 VvvebJs GitHub 保存问题调试</h1> | |
| <!-- 环境状态 --> | |
| <div class="card mb-4"> | |
| <div class="card-header"> | |
| <h3>🌐 环境状态检查</h3> | |
| </div> | |
| <div class="card-body"> | |
| <div class="row"> | |
| <div class="col-md-6"> | |
| <p><strong>运行环境:</strong> | |
| <span class="<?= $isHuggingFace ? 'status-ok' : 'status-warning' ?>"> | |
| <?= $isHuggingFace ? '✅ Hugging Face Space' : '⚠️ 本地环境' ?> | |
| </span> | |
| </p> | |
| <p><strong>主机:</strong> <span class="config-value"><?= htmlspecialchars($_SERVER['HTTP_HOST'] ?? 'unknown') ?></span></p> | |
| <p><strong>Space ID:</strong> <span class="config-value"><?= htmlspecialchars($envDebug['space_id']) ?></span></p> | |
| </div> | |
| <div class="col-md-6"> | |
| <p><strong>当前用户:</strong> <span class="config-value"><?= htmlspecialchars(StorageConfig::getCurrentUser()) ?></span></p> | |
| <p><strong>用户路径:</strong> <span class="config-value"><?= htmlspecialchars(StorageConfig::getUserPath()) ?></span></p> | |
| <p><strong>存储类型:</strong> <span class="config-value"><?= htmlspecialchars(StorageConfig::getStorageType()) ?></span></p> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- GitHub 配置状态 --> | |
| <div class="card mb-4"> | |
| <div class="card-header"> | |
| <h3>🔧 GitHub 配置状态</h3> | |
| </div> | |
| <div class="card-body"> | |
| <div class="row"> | |
| <div class="col-md-6"> | |
| <p><strong>GITHUB_TOKEN:</strong> | |
| <span class="config-value <?= empty($github['token']) ? 'status-error' : 'status-ok' ?>"> | |
| <?php | |
| if (empty($github['token'])) { | |
| echo '❌ 未设置'; | |
| } else { | |
| echo '✅ 已设置 (长度: ' . strlen($github['token']) . ')'; | |
| } | |
| </span> | |
| </p> | |
| <p><strong>GITHUB_OWNER:</strong> | |
| <span class="config-value <?= empty($github['owner']) ? 'status-error' : 'status-ok' ?>"> | |
| <?= empty($github['owner']) ? '❌ 未设置' : '✅ ' . htmlspecialchars($github['owner']) ?> | |
| </span> | |
| </p> | |
| <p><strong>GITHUB_REPO:</strong> | |
| <span class="config-value <?= empty($github['repo']) ? 'status-error' : 'status-ok' ?>"> | |
| <?= empty($github['repo']) ? '❌ 未设置' : '✅ ' . htmlspecialchars($github['repo']) ?> | |
| </span> | |
| </p> | |
| </div> | |
| <div class="col-md-6"> | |
| <p><strong>GITHUB_BRANCH:</strong> | |
| <span class="config-value"><?= htmlspecialchars($github['branch']) ?></span> | |
| </p> | |
| <p><strong>GITHUB_PATH:</strong> | |
| <span class="config-value"><?= htmlspecialchars($github['path']) ?></span> | |
| </p> | |
| <p><strong>完整API URL:</strong> | |
| <span class="config-value">https://api.github.com/repos/<?= htmlspecialchars($github['owner']) ?>/<?= htmlspecialchars($github['repo']) ?></span> | |
| </p> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- 保存测试 --> | |
| <div class="card mb-4"> | |
| <div class="card-header"> | |
| <h3>🧪 实际保存测试</h3> | |
| </div> | |
| <div class="card-body"> | |
| <?php if (empty($testResults)): ?> | |
| <p>点击下方按钮来测试实际的文件保存功能:</p> | |
| <form method="POST"> | |
| <button type="submit" name="test_save" value="1" class="btn btn-primary"> | |
| 🚀 测试保存到 GitHub | |
| </button> | |
| </form> | |
| <?php else: ?> | |
| <div class="row"> | |
| <div class="col-md-6"> | |
| <h5>保存测试结果</h5> | |
| <?php $saveTest = $testResults['save_test']; ?> | |
| <div class="alert alert-<?= $saveTest['success'] ? 'success' : 'danger' ?>"> | |
| <strong>状态:</strong> | |
| <span class="<?= $saveTest['success'] ? 'status-ok' : 'status-error' ?>"> | |
| <?= $saveTest['success'] ? '✅ 成功' : '❌ 失败' ?> | |
| </span> | |
| <br><strong>文件名:</strong> <?= htmlspecialchars($saveTest['filename']) ?> | |
| <br><strong>内容长度:</strong> <?= $saveTest['content_length'] ?? 0 ?> 字符 | |
| <?php if (!$saveTest['success'] && isset($saveTest['error'])): ?> | |
| <br><strong>错误:</strong> <?= htmlspecialchars($saveTest['error']) ?> | |
| <?php endif; ?> | |
| </div> | |
| </div> | |
| <div class="col-md-6"> | |
| <?php if (isset($testResults['read_test'])): ?> | |
| <h5>读取验证结果</h5> | |
| <?php $readTest = $testResults['read_test']; ?> | |
| <div class="alert alert-<?= $readTest['success'] && $readTest['content_matches'] ? 'success' : 'warning' ?>"> | |
| <strong>读取状态:</strong> | |
| <span class="<?= $readTest['success'] ? 'status-ok' : 'status-error' ?>"> | |
| <?= $readTest['success'] ? '✅ 成功' : '❌ 失败' ?> | |
| </span> | |
| <br><strong>内容匹配:</strong> | |
| <span class="<?= $readTest['content_matches'] ? 'status-ok' : 'status-error' ?>"> | |
| <?= $readTest['content_matches'] ? '✅ 一致' : '❌ 不一致' ?> | |
| </span> | |
| <br><strong>读取长度:</strong> <?= $readTest['retrieved_length'] ?> 字符 | |
| </div> | |
| <?php endif; ?> | |
| </div> | |
| </div> | |
| <div class="mt-3"> | |
| <form method="POST"> | |
| <button type="submit" name="test_save" value="1" class="btn btn-secondary"> | |
| 🔄 重新测试 | |
| </button> | |
| </form> | |
| </div> | |
| <?php endif; ?> | |
| </div> | |
| </div> | |
| <!-- 环境变量调试信息 --> | |
| <div class="card mb-4"> | |
| <div class="card-header"> | |
| <h3>🔍 环境变量调试信息</h3> | |
| </div> | |
| <div class="card-body"> | |
| <div class="debug-output"> | |
| <?= json_encode($envDebug, JSON_PRETTY_PRINT) ?> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- 服务器日志信息 --> | |
| <div class="card mb-4"> | |
| <div class="card-header"> | |
| <h3>📋 最近的服务器日志</h3> | |
| </div> | |
| <div class="card-body"> | |
| <p class="text-muted">请检查Hugging Face Space的日志面板查看详细的错误信息。关键日志标识符:</p> | |
| <ul> | |
| <li><code>GitHub Save Debug:</code> - GitHub保存调试信息</li> | |
| <li><code>GitHub Save Error:</code> - GitHub保存错误</li> | |
| <li><code>GitHub API Error:</code> - GitHub API错误响应</li> | |
| <li><code>StorageManager saveFile:</code> - 存储管理器保存过程</li> | |
| </ul> | |
| </div> | |
| </div> | |
| <!-- 问题诊断建议 --> | |
| <div class="card mb-4"> | |
| <div class="card-header"> | |
| <h3>💡 常见问题诊断</h3> | |
| </div> | |
| <div class="card-body"> | |
| <div class="accordion" id="diagnosticAccordion"> | |
| <div class="accordion-item"> | |
| <h2 class="accordion-header"> | |
| <button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#diag1"> | |
| Token 配置问题 | |
| </button> | |
| </h2> | |
| <div id="diag1" class="accordion-collapse collapse show" data-bs-parent="#diagnosticAccordion"> | |
| <div class="accordion-body"> | |
| <strong>检查项目:</strong> | |
| <ul> | |
| <li>确认 <code>GITHUB_TOKEN</code> 在Hugging Face Space Settings中正确设置为Private Secret</li> | |
| <li>GitHub Token必须有 <code>repo</code> 权限(不仅是public_repo)</li> | |
| <li>Token没有过期</li> | |
| <li>Token对目标仓库有写入权限</li> | |
| </ul> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="accordion-item"> | |
| <h2 class="accordion-header"> | |
| <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#diag2"> | |
| 仓库配置问题 | |
| </button> | |
| </h2> | |
| <div id="diag2" class="accordion-collapse collapse" data-bs-parent="#diagnosticAccordion"> | |
| <div class="accordion-body"> | |
| <strong>检查项目:</strong> | |
| <ul> | |
| <li>仓库名和所有者名称完全正确(区分大小写)</li> | |
| <li>分支名称正确(通常是main或master)</li> | |
| <li>目标路径存在或可以创建</li> | |
| <li>仓库没有分支保护规则阻止直接推送</li> | |
| </ul> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="accordion-item"> | |
| <h2 class="accordion-header"> | |
| <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#diag3"> | |
| Hugging Face Space 特殊情况 | |
| </button> | |
| </h2> | |
| <div id="diag3" class="accordion-collapse collapse" data-bs-parent="#diagnosticAccordion"> | |
| <div class="accordion-body"> | |
| <strong>可能的问题:</strong> | |
| <ul> | |
| <li>环境变量需要在设置后重启Space才能生效</li> | |
| <li>网络限制或超时问题</li> | |
| <li>Space的文件系统权限限制</li> | |
| <li>GitHub API速率限制</li> | |
| </ul> | |
| <strong>解决方案:</strong> | |
| <ul> | |
| <li>确保点击了"Restart this Space"</li> | |
| <li>检查所有环境变量拼写正确</li> | |
| <li>使用GitHub Personal Access Token (classic)</li> | |
| </ul> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- 操作按钮 --> | |
| <div class="card"> | |
| <div class="card-body text-center"> | |
| <div class="row"> | |
| <div class="col-md-3"> | |
| <a href="hf-space-check.php" class="btn btn-info w-100">HF Space 检查</a> | |
| </div> | |
| <div class="col-md-3"> | |
| <a href="github-advanced-test.php" class="btn btn-primary w-100">GitHub 完整测试</a> | |
| </div> | |
| <div class="col-md-3"> | |
| <a href="config-check.php" class="btn btn-secondary w-100">配置检查</a> | |
| </div> | |
| <div class="col-md-3"> | |
| <a href="editor.html" class="btn btn-success w-100">返回编辑器</a> | |
| </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> | |
| </body> | |
| </html> |