Spaces:
Paused
Paused
iudd commited on
Commit ·
a05246c
1
Parent(s): 503f972
Add credit stats fetching and storage
Browse files- config.js +1 -0
- mindvideo-service.js +29 -20
- supabase-client.js +13 -7
config.js
CHANGED
|
@@ -15,6 +15,7 @@ export const CONFIG = {
|
|
| 15 |
MINDVIDEO_LOGIN_URL: "https://www.mindvideo.ai/zh/auth/signin/",
|
| 16 |
MINDVIDEO_CHECKIN_API: "https://api.mindvideo.ai/api/checkin",
|
| 17 |
MINDVIDEO_USER_INFO_API: "https://api.mindvideo.ai/api/user/info",
|
|
|
|
| 18 |
SIGN_APP_KEY: "s#c_120*AB",
|
| 19 |
USER_AGENT: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
| 20 |
|
|
|
|
| 15 |
MINDVIDEO_LOGIN_URL: "https://www.mindvideo.ai/zh/auth/signin/",
|
| 16 |
MINDVIDEO_CHECKIN_API: "https://api.mindvideo.ai/api/checkin",
|
| 17 |
MINDVIDEO_USER_INFO_API: "https://api.mindvideo.ai/api/user/info",
|
| 18 |
+
MINDVIDEO_CREDITS_STATS_API: "https://api.mindvideo.ai/api/user/credits/stats",
|
| 19 |
SIGN_APP_KEY: "s#c_120*AB",
|
| 20 |
USER_AGENT: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
| 21 |
|
mindvideo-service.js
CHANGED
|
@@ -218,17 +218,23 @@ export async function performCheckIn(token, email = 'unknown') {
|
|
| 218 |
|
| 219 |
if (data.code === 0) {
|
| 220 |
console.log(`✅ Check-in successful! Credits: ${data.data?.credits}, Days: ${data.data?.current_day}`);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 221 |
await logSystem('info', 'checkin', `Check-in successful for ${email}`, {
|
| 222 |
credits: data.data?.credits,
|
| 223 |
total: data.data?.total_credits,
|
| 224 |
-
day: data.data?.current_day
|
|
|
|
| 225 |
});
|
| 226 |
|
| 227 |
return {
|
| 228 |
success: true,
|
| 229 |
credits: data.data?.credits,
|
| 230 |
total: data.data?.total_credits,
|
| 231 |
-
day: data.data?.current_day
|
|
|
|
| 232 |
};
|
| 233 |
} else {
|
| 234 |
console.warn(`⚠️ Check-in failed: ${data.message}`);
|
|
@@ -242,14 +248,14 @@ export async function performCheckIn(token, email = 'unknown') {
|
|
| 242 |
}
|
| 243 |
|
| 244 |
/**
|
| 245 |
-
* Get user
|
| 246 |
*/
|
| 247 |
-
export async function
|
| 248 |
-
console.log(`🔍 Getting user
|
| 249 |
|
| 250 |
try {
|
| 251 |
const signHeader = await generateSign();
|
| 252 |
-
const response = await fetch(CONFIG.
|
| 253 |
method: 'GET',
|
| 254 |
headers: {
|
| 255 |
"accept": "application/json, text/plain, */*",
|
|
@@ -269,24 +275,19 @@ export async function getUserInfo(token, email = 'unknown') {
|
|
| 269 |
try {
|
| 270 |
data = JSON.parse(text);
|
| 271 |
} catch (e) {
|
| 272 |
-
console.warn(`⚠️ Invalid
|
| 273 |
return null;
|
| 274 |
}
|
| 275 |
|
| 276 |
if (data.code === 0 && data.data) {
|
| 277 |
-
console.log(`✅ Credits: ${data.data.
|
| 278 |
-
return
|
| 279 |
-
credits: data.data.credits || 0,
|
| 280 |
-
email: data.data.email || null,
|
| 281 |
-
nickname: data.data.nickname || null,
|
| 282 |
-
avatar: data.data.avatar || null
|
| 283 |
-
};
|
| 284 |
} else {
|
| 285 |
-
console.warn(`⚠️ Unable to get
|
| 286 |
return null;
|
| 287 |
}
|
| 288 |
} catch (error) {
|
| 289 |
-
console.warn(`⚠️
|
| 290 |
return null;
|
| 291 |
}
|
| 292 |
}
|
|
@@ -312,12 +313,19 @@ export async function refreshAccountToken(email, password) {
|
|
| 312 |
return { success: false, email, message: 'Invalid token' };
|
| 313 |
}
|
| 314 |
|
| 315 |
-
//
|
| 316 |
-
await
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 317 |
|
| 318 |
await logSystem('info', 'refresh', `Token refreshed for ${email}`, {
|
| 319 |
expireAt: tokenInfo.expireAt,
|
| 320 |
-
isExpired: tokenInfo.isExpired
|
|
|
|
| 321 |
});
|
| 322 |
|
| 323 |
console.log(`✅ Token refreshed and saved to database`);
|
|
@@ -328,7 +336,8 @@ export async function refreshAccountToken(email, password) {
|
|
| 328 |
email,
|
| 329 |
token,
|
| 330 |
expireAt: tokenInfo.expireAt,
|
| 331 |
-
isExpired: tokenInfo.isExpired
|
|
|
|
| 332 |
};
|
| 333 |
|
| 334 |
} catch (error) {
|
|
|
|
| 218 |
|
| 219 |
if (data.code === 0) {
|
| 220 |
console.log(`✅ Check-in successful! Credits: ${data.data?.credits}, Days: ${data.data?.current_day}`);
|
| 221 |
+
|
| 222 |
+
// Also fetch latest stats to update DB
|
| 223 |
+
const stats = await getUserCreditsStats(token, email);
|
| 224 |
+
|
| 225 |
await logSystem('info', 'checkin', `Check-in successful for ${email}`, {
|
| 226 |
credits: data.data?.credits,
|
| 227 |
total: data.data?.total_credits,
|
| 228 |
+
day: data.data?.current_day,
|
| 229 |
+
stats: stats
|
| 230 |
});
|
| 231 |
|
| 232 |
return {
|
| 233 |
success: true,
|
| 234 |
credits: data.data?.credits,
|
| 235 |
total: data.data?.total_credits,
|
| 236 |
+
day: data.data?.current_day,
|
| 237 |
+
stats: stats
|
| 238 |
};
|
| 239 |
} else {
|
| 240 |
console.warn(`⚠️ Check-in failed: ${data.message}`);
|
|
|
|
| 248 |
}
|
| 249 |
|
| 250 |
/**
|
| 251 |
+
* Get user credits stats
|
| 252 |
*/
|
| 253 |
+
export async function getUserCreditsStats(token, email = 'unknown') {
|
| 254 |
+
console.log(`🔍 Getting user credits stats for ${email}...`);
|
| 255 |
|
| 256 |
try {
|
| 257 |
const signHeader = await generateSign();
|
| 258 |
+
const response = await fetch(CONFIG.MINDVIDEO_CREDITS_STATS_API, {
|
| 259 |
method: 'GET',
|
| 260 |
headers: {
|
| 261 |
"accept": "application/json, text/plain, */*",
|
|
|
|
| 275 |
try {
|
| 276 |
data = JSON.parse(text);
|
| 277 |
} catch (e) {
|
| 278 |
+
console.warn(`⚠️ Invalid stats response`);
|
| 279 |
return null;
|
| 280 |
}
|
| 281 |
|
| 282 |
if (data.code === 0 && data.data) {
|
| 283 |
+
console.log(`✅ Stats retrieved: Total Credits: ${data.data.total_credits}, Used: ${data.data.used_credits}`);
|
| 284 |
+
return data.data;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 285 |
} else {
|
| 286 |
+
console.warn(`⚠️ Unable to get stats: ${data.message}`);
|
| 287 |
return null;
|
| 288 |
}
|
| 289 |
} catch (error) {
|
| 290 |
+
console.warn(`⚠️ Stats query failed: ${error.message}`);
|
| 291 |
return null;
|
| 292 |
}
|
| 293 |
}
|
|
|
|
| 313 |
return { success: false, email, message: 'Invalid token' };
|
| 314 |
}
|
| 315 |
|
| 316 |
+
// Fetch latest stats
|
| 317 |
+
const stats = await getUserCreditsStats(token, email);
|
| 318 |
+
|
| 319 |
+
// Save to database (update token + metadata)
|
| 320 |
+
await updateAccountToken(email, token, tokenInfo.expireAt, {
|
| 321 |
+
credits_stats: stats,
|
| 322 |
+
last_check_time: new Date().toISOString()
|
| 323 |
+
});
|
| 324 |
|
| 325 |
await logSystem('info', 'refresh', `Token refreshed for ${email}`, {
|
| 326 |
expireAt: tokenInfo.expireAt,
|
| 327 |
+
isExpired: tokenInfo.isExpired,
|
| 328 |
+
credits: stats?.total_credits
|
| 329 |
});
|
| 330 |
|
| 331 |
console.log(`✅ Token refreshed and saved to database`);
|
|
|
|
| 336 |
email,
|
| 337 |
token,
|
| 338 |
expireAt: tokenInfo.expireAt,
|
| 339 |
+
isExpired: tokenInfo.isExpired,
|
| 340 |
+
stats
|
| 341 |
};
|
| 342 |
|
| 343 |
} catch (error) {
|
supabase-client.js
CHANGED
|
@@ -122,17 +122,23 @@ export async function updateAccountStatus(email, status) {
|
|
| 122 |
return data;
|
| 123 |
}
|
| 124 |
|
| 125 |
-
export async function updateAccountToken(email, token, expireAt) {
|
| 126 |
const db = getSupabase();
|
| 127 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
const { data, error } = await db
|
| 129 |
.from('accounts')
|
| 130 |
-
.update(
|
| 131 |
-
token,
|
| 132 |
-
expire_at: expireAt,
|
| 133 |
-
last_login_at: new Date().toISOString(),
|
| 134 |
-
updated_at: new Date().toISOString()
|
| 135 |
-
})
|
| 136 |
.eq('email', email)
|
| 137 |
.select()
|
| 138 |
.single();
|
|
|
|
| 122 |
return data;
|
| 123 |
}
|
| 124 |
|
| 125 |
+
export async function updateAccountToken(email, token, expireAt, metadata = null) {
|
| 126 |
const db = getSupabase();
|
| 127 |
|
| 128 |
+
const updateData = {
|
| 129 |
+
token,
|
| 130 |
+
expire_at: expireAt,
|
| 131 |
+
last_login_at: new Date().toISOString(),
|
| 132 |
+
updated_at: new Date().toISOString()
|
| 133 |
+
};
|
| 134 |
+
|
| 135 |
+
if (metadata) {
|
| 136 |
+
updateData.metadata = metadata;
|
| 137 |
+
}
|
| 138 |
+
|
| 139 |
const { data, error } = await db
|
| 140 |
.from('accounts')
|
| 141 |
+
.update(updateData)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 142 |
.eq('email', email)
|
| 143 |
.select()
|
| 144 |
.single();
|