Files
你的用户名 237c7802e5
Some checks failed
Deploy / deploy (push) Has been cancelled
Initial commit: Telegram Management System
Full-stack web application for Telegram management
- Frontend: Vue 3 + Vben Admin
- Backend: NestJS
- Features: User management, group broadcast, statistics

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 15:37:50 +08:00

193 lines
5.6 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { chromium } from 'playwright';
async function debugAuth() {
const browser = await chromium.launch({
headless: false,
slowMo: 500,
});
const context = await browser.newContext();
const page = await context.newPage();
// 存储所有网络请求
const apiRequests = [];
const apiResponses = [];
// 监听API请求
page.on('request', (request) => {
if (
request.url().includes('localhost:3000') ||
request.url().includes('/api/') ||
request.url().includes('/auth/') ||
request.url().includes('/base')
) {
apiRequests.push({
method: request.method(),
url: request.url(),
headers: request.headers(),
timestamp: new Date().toISOString(),
});
console.log(`🔵 API请求: ${request.method()} ${request.url()}`);
console.log(
` Headers: ${JSON.stringify(request.headers().authorization || 'no auth header')}`,
);
}
});
// 监听API响应
page.on('response', (response) => {
if (
response.url().includes('localhost:3000') ||
response.url().includes('/api/') ||
response.url().includes('/auth/') ||
response.url().includes('/base')
) {
apiResponses.push({
status: response.status(),
url: response.url(),
headers: response.headers(),
timestamp: new Date().toISOString(),
});
console.log(`🟢 API响应: ${response.status()} ${response.url()}`);
// 如果是401错误特别标注
if (response.status() === 401) {
console.log(`❌ 401 认证失败: ${response.url()}`);
}
}
});
try {
console.log('🚀 开始测试...');
// 1. 访问首页
console.log('\n1⃣ 访问首页');
await page.goto('http://localhost:5173');
await page.waitForTimeout(3000);
// 2. 登录
console.log('\n2⃣ 尝试登录');
// 等待登录表单
await page.waitForSelector('input[type="text"], input[type="password"]', {
timeout: 10000,
});
// 填写用户名
const usernameInput = await page.$('input[type="text"]');
if (usernameInput) {
await usernameInput.fill('admin');
console.log('✅ 用户名已填入: admin');
}
// 填写密码
const passwordInput = await page.$('input[type="password"]');
if (passwordInput) {
await passwordInput.fill('111111');
console.log('✅ 密码已填入');
}
// 点击登录
const loginButton = await page.$('button[type="submit"], .ant-btn-primary');
if (loginButton) {
await loginButton.click();
console.log('✅ 登录按钮已点击');
}
// 等待登录处理
await page.waitForTimeout(3000);
// 3. 检查token
console.log('\n3⃣ 检查认证状态');
const localStorage = await page.evaluate(() => {
return {
token: localStorage.getItem('token'),
accessToken: localStorage.getItem('accessToken'),
authToken: localStorage.getItem('authToken'),
allKeys: Object.keys(localStorage),
};
});
console.log('LocalStorage状态:', localStorage);
// 4. 导航到dashboard
console.log('\n4⃣ 导航到dashboard');
await page.goto('http://localhost:5173/dashboard/home');
await page.waitForTimeout(5000);
// 5. 检查页面内容
console.log('\n5⃣ 检查页面内容');
const pageTitle = await page.title();
const currentUrl = page.url();
console.log('页面标题:', pageTitle);
console.log('当前URL:', currentUrl);
// 检查是否有错误信息
const errorText = await page.textContent('body');
if (errorText.includes('401') || errorText.includes('Unauthorized')) {
console.log('❌ 页面显示认证错误');
}
// 6. 强制触发API请求
console.log('\n6⃣ 尝试触发API请求');
// 刷新页面触发数据加载
await page.reload();
await page.waitForTimeout(3000);
// 尝试点击可能触发API的元素
const buttons = await page.$$('button');
if (buttons.length > 0) {
console.log(`发现 ${buttons.length} 个按钮,尝试点击...`);
try {
await buttons[0].click();
await page.waitForTimeout(1000);
} catch (e) {
console.log('点击按钮出错:', e.message);
}
}
// 7. 总结API调用情况
console.log('\n7⃣ API调用总结');
console.log(`总共发现 ${apiRequests.length} 个API请求`);
console.log(`总共收到 ${apiResponses.length} 个API响应`);
if (apiRequests.length === 0) {
console.log('⚠️ 没有发现任何API请求可能是');
console.log(' - 前端没有配置API调用');
console.log(' - API调用被其他逻辑阻止');
console.log(' - 路由配置问题');
}
// 显示401错误的详细信息
const failedRequests = apiResponses.filter((r) => r.status === 401);
if (failedRequests.length > 0) {
console.log(`\n❌ 发现 ${failedRequests.length} 个401错误:`);
failedRequests.forEach((req) => {
console.log(` - ${req.url}`);
});
}
// 显示所有API请求的认证头
console.log('\n🔐 认证头检查:');
apiRequests.forEach((req) => {
const authHeader =
req.headers.authorization || req.headers['Authorization'];
console.log(`${req.method} ${req.url}`);
console.log(` Authorization: ${authHeader || '❌ 无认证头'}`);
});
console.log('\n✅ 测试完成');
console.log('浏览器将保持打开30秒供手动检查...');
await page.waitForTimeout(30000);
} catch (error) {
console.error('❌ 测试出错:', error);
}
await browser.close();
}
debugAuth().catch(console.error);