From d2e1f107ce60139a6efef094bc76a7f4866cf9e3 Mon Sep 17 00:00:00 2001 From: glpshchn <464976@niuitmo.ru> Date: Mon, 1 Dec 2025 04:18:46 +0300 Subject: [PATCH] Update files --- backend/routes/search.js | 83 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 4 deletions(-) diff --git a/backend/routes/search.js b/backend/routes/search.js index 44f9b8c..3b0d114 100644 --- a/backend/routes/search.js +++ b/backend/routes/search.js @@ -88,10 +88,15 @@ router.get('/proxy/:encodedUrl', proxyLimiter, async (req, res) => { 'Referer': urlObj.origin }; - // Если это e621, добавляем авторизацию - if (urlObj.hostname.includes('e621.net')) { - const auth = Buffer.from(`${config.e621Username}:${config.e621ApiKey}`).toString('base64'); - headers['Authorization'] = `Basic ${auth}`; + // Если это e621, добавляем авторизацию (если есть учетные данные) + if (urlObj.hostname.includes('e621.net') && config.e621Username && config.e621ApiKey) { + try { + const auth = Buffer.from(`${config.e621Username}:${config.e621ApiKey}`).toString('base64'); + headers['Authorization'] = `Basic ${auth}`; + } catch (error) { + console.warn('⚠️ Ошибка создания Basic auth для e621:', error.message); + // Продолжаем без авторизации + } } const response = await axios.get(originalUrl, { @@ -158,6 +163,41 @@ router.get('/furry', authenticate, async (req, res) => { return res.json({ posts: [] }); } + // Обработка ошибок аутентификации + if (response.data && response.data.success === false) { + if (response.data.message && response.data.message.includes('Authentication')) { + console.warn('⚠️ e621 ошибка аутентификации, пробуем без авторизации:', response.data.message); + // Пробуем запрос без авторизации (для публичных данных это должно работать) + try { + const publicResponse = await axios.get('https://e621.net/posts.json', { + params: { + tags: query.trim(), + limit: Math.min(parseInt(limit) || 320, 320), + page: parseInt(page) || 1 + }, + headers: { + 'User-Agent': E621_USER_AGENT + }, + timeout: 30000, + validateStatus: (status) => status < 500 + }); + + if (publicResponse.status === 429) { + return res.json({ posts: [] }); + } + + // Используем данные из публичного запроса + response.data = publicResponse.data; + } catch (publicError) { + console.error('⚠️ e621 публичный запрос тоже не удался:', publicError.message); + return res.json({ posts: [] }); + } + } else { + console.warn('⚠️ e621 вернул ошибку:', response.data.message); + return res.json({ posts: [] }); + } + } + // Проверка на наличие данных (e621 может возвращать массив напрямую или объект с posts) let postsData = null; @@ -329,6 +369,41 @@ router.get('/furry/tags', authenticate, async (req, res) => { return res.json({ tags: [] }); } + // Обработка ошибок аутентификации + if (response.data && response.data.success === false) { + if (response.data.message && response.data.message.includes('Authentication')) { + console.warn('⚠️ e621 ошибка аутентификации, пробуем без авторизации:', response.data.message); + // Пробуем запрос без авторизации (для публичных данных это должно работать) + try { + const publicResponse = await axios.get('https://e621.net/tags.json', { + params: { + 'search[name_matches]': `${query}*`, + 'search[order]': 'count', + limit: 10 + }, + headers: { + 'User-Agent': E621_USER_AGENT + }, + timeout: 10000, + validateStatus: (status) => status < 500 + }); + + if (publicResponse.status === 429) { + return res.json({ tags: [] }); + } + + // Используем данные из публичного запроса + response.data = publicResponse.data; + } catch (publicError) { + console.error('⚠️ e621 публичный запрос тоже не удался:', publicError.message); + return res.json({ tags: [] }); + } + } else { + console.warn('⚠️ e621 вернул ошибку:', response.data.message); + return res.json({ tags: [] }); + } + } + // Проверка на массив (e621 может возвращать массив напрямую или объект с массивом) let tagsData = null;