feat: 添加 Wakatime 支持,更新统计组件以显示编码数据

This commit is contained in:
2025-12-07 23:20:16 +08:00
parent c86bd7708b
commit b5b5509320
7 changed files with 856 additions and 8 deletions

71
api/wakatime.ts Normal file
View File

@@ -0,0 +1,71 @@
import type { VercelRequest, VercelResponse } from "@vercel/node";
export default async function handler(req: VercelRequest, res: VercelResponse) {
// CORS 处理
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS");
res.setHeader("Access-Control-Allow-Headers", "Content-Type");
if (req.method === "OPTIONS") {
return res.status(200).end();
}
if (req.method !== "GET") {
return res.status(405).json({ error: "Method Not Allowed" });
}
const apiKey = process.env.WAKATIME_API_KEY;
const defaultApiUrl = process.env.WAKATIME_API_URL || "https://wakatime.com/api/v1";
const apiUrl = (req.query.apiUrl as string) || defaultApiUrl;
if (!apiKey) {
return res.status(500).json({ error: "Wakatime API Key not configured" });
}
try {
// 获取一周统计数据
const weeklyStatsResponse = await fetch(`${apiUrl}/users/current/stats/last_7_days`, {
headers: {
Authorization: `Basic ${Buffer.from(apiKey).toString("base64")}`,
},
});
if (!weeklyStatsResponse.ok) {
throw new Error(`Wakatime API error: ${weeklyStatsResponse.status}`);
}
const weeklyStatsData = await weeklyStatsResponse.json();
// 获取所有时间统计数据
const allTimeStatsResponse = await fetch(`${apiUrl}/users/current/stats/all_time`, {
headers: {
Authorization: `Basic ${Buffer.from(apiKey).toString("base64")}`,
},
});
let allTimeStatsData = null;
if (allTimeStatsResponse.ok) {
allTimeStatsData = await allTimeStatsResponse.json();
}
// 获取当前用户状态
const statusResponse = await fetch(`${apiUrl}/users/current/status`, {
headers: {
Authorization: `Basic ${Buffer.from(apiKey).toString("base64")}`,
},
});
let statusData = null;
if (statusResponse.ok) {
statusData = await statusResponse.json();
}
res.status(200).json({
weekly: weeklyStatsData.data,
allTime: allTimeStatsData ? allTimeStatsData.data : null,
status: statusData,
});
} catch (error) {
console.error("Wakatime API error:", error);
res.status(500).json({ error: "Failed to fetch Wakatime data" });
}
}