From 63b7c0d8f0f6c074c44e8c1cca5a42290e3d49fb Mon Sep 17 00:00:00 2001 From: glpshchn <464976@niuitmo.ru> Date: Mon, 8 Dec 2025 01:58:38 +0300 Subject: [PATCH] Update files --- backend/bots/mainBot.js | 51 +++++++++++++++++++++++++++++++++++++--- backend/config/index.js | 2 +- backend/routes/search.js | 18 +++++++++----- 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/backend/bots/mainBot.js b/backend/bots/mainBot.js index 4ca4941..d17568e 100644 --- a/backend/bots/mainBot.js +++ b/backend/bots/mainBot.js @@ -229,8 +229,25 @@ const handleInlineQuery = async (inlineQuery) => { // Поиск через e621 API try { const config = require('../config'); + + // Проверить наличие API ключа + if (!config.e621ApiKey) { + log('warn', 'e621 API ключ не настроен для inline query'); + await axios.post(`${TELEGRAM_API}/answerInlineQuery`, { + inline_query_id: queryId, + results: [], + cache_time: 60 + }); + return; + } + const E621_USER_AGENT = 'NakamaApp/1.0 (by glpshchn00 on e621; Telegram: @glpshchn00)'; - const auth = Buffer.from(`${config.e621Username}:${config.e621ApiKey}`).toString('base64'); + + // e621 использует Basic Auth с username:api_key + // Если username не указан, используем API ключ как username и пустой пароль + // Или можно использовать формат :api_key (пустой username) + const username = config.e621Username || config.e621ApiKey; + const auth = Buffer.from(`${username}:${config.e621ApiKey}`).toString('base64'); const response = await axios.get('https://e621.net/posts.json', { params: { @@ -241,9 +258,32 @@ const handleInlineQuery = async (inlineQuery) => { 'User-Agent': E621_USER_AGENT, 'Authorization': `Basic ${auth}` }, - timeout: 10000 + timeout: 10000, + validateStatus: (status) => status < 500 // Не бросать ошибку для 401/429 }); + // Обработка ошибок авторизации + if (response.status === 401) { + log('warn', 'e621 API вернул 401 - неверные учетные данные для inline query'); + await axios.post(`${TELEGRAM_API}/answerInlineQuery`, { + inline_query_id: queryId, + results: [], + cache_time: 60 + }); + return; + } + + // Обработка rate limit + if (response.status === 429) { + log('warn', 'e621 rate limit (429) для inline query'); + await axios.post(`${TELEGRAM_API}/answerInlineQuery`, { + inline_query_id: queryId, + results: [], + cache_time: 60 + }); + return; + } + let postsData = []; if (Array.isArray(response.data)) { postsData = response.data; @@ -264,7 +304,12 @@ const handleInlineQuery = async (inlineQuery) => { source: 'e621' })); } catch (error) { - logError('Ошибка поиска e621 для inline query', error); + // Логировать только если это не 401/429 (они уже обработаны выше) + if (error.response?.status !== 401 && error.response?.status !== 429) { + logError('Ошибка поиска e621 для inline query', error); + } + // Вернуть пустой результат вместо падения + searchResults = []; } } else if (source === 'anime') { // Поиск через Gelbooru API diff --git a/backend/config/index.js b/backend/config/index.js index 5fb80bc..b250c00 100644 --- a/backend/config/index.js +++ b/backend/config/index.js @@ -37,7 +37,7 @@ module.exports = { gelbooruUserId: process.env.GELBOORU_USER_ID || '1844464', // e621 API - e621Username: process.env.E621_USERNAME || 'glpshchn00', + e621Username: process.env.E621_USERNAME || '', // Опционально, можно оставить пустым e621ApiKey: process.env.E621_API_KEY || 'MWYMw57r2Gu6Yxvw1YvepNvZ', // Frontend URL diff --git a/backend/routes/search.js b/backend/routes/search.js index c1414e4..cb8d30f 100644 --- a/backend/routes/search.js +++ b/backend/routes/search.js @@ -88,11 +88,13 @@ router.get('/proxy/:encodedUrl', async (req, res) => { 'Referer': urlObj.origin }; - // Если это e621, добавляем авторизацию (если есть учетные данные) - if (urlObj.hostname.includes('e621.net') && config.e621Username && config.e621ApiKey) { + // Если это e621, добавляем авторизацию (если есть API ключ) + if (urlObj.hostname.includes('e621.net') && config.e621ApiKey) { try { - const auth = Buffer.from(`${config.e621Username}:${config.e621ApiKey}`).toString('base64'); - headers['Authorization'] = `Basic ${auth}`; + // Если username не указан, используем API ключ как username + const username = config.e621Username || config.e621ApiKey; + const auth = Buffer.from(`${username}:${config.e621ApiKey}`).toString('base64'); + headers['Authorization'] = `Basic ${auth}`; } catch (error) { console.warn('⚠️ Ошибка создания Basic auth для e621:', error.message); // Продолжаем без авторизации @@ -141,7 +143,9 @@ router.get('/furry', authenticate, async (req, res) => { try { // Базовая авторизация для e621 API - const auth = Buffer.from(`${config.e621Username}:${config.e621ApiKey}`).toString('base64'); + // Если username не указан, используем API ключ как username + const username = config.e621Username || config.e621ApiKey; + const auth = Buffer.from(`${username}:${config.e621ApiKey}`).toString('base64'); const response = await axios.get('https://e621.net/posts.json', { params: { @@ -347,7 +351,9 @@ router.get('/furry/tags', authenticate, async (req, res) => { try { // Базовая авторизация для e621 API - const auth = Buffer.from(`${config.e621Username}:${config.e621ApiKey}`).toString('base64'); + // Если username не указан, используем API ключ как username + const username = config.e621Username || config.e621ApiKey; + const auth = Buffer.from(`${username}:${config.e621ApiKey}`).toString('base64'); const response = await axios.get('https://e621.net/tags.json', { params: {