| |
| import axios from 'axios'; |
| import { getBrowserContext } from '../browser/browser.js'; |
| import { logInfo, logError } from '../logger/index.js'; |
| import { getAuthToken, extractAuthToken } from './chat.js'; |
| import OSS from 'ali-oss'; |
| import fs from 'fs'; |
| import path from 'path'; |
| import { fileURLToPath } from 'url'; |
|
|
| const __dirname = path.dirname(fileURLToPath(import.meta.url)); |
| const UPLOAD_DIR = path.join(__dirname, '../../uploads'); |
|
|
| |
| if (!fs.existsSync(UPLOAD_DIR)) { |
| fs.mkdirSync(UPLOAD_DIR, { recursive: true }); |
| } |
|
|
| |
| |
| |
| |
| |
| export async function getStsToken(fileInfo) { |
| try { |
| logInfo(`Запрос STS токена для файла: ${fileInfo.filename}`); |
| |
| const browserContext = getBrowserContext(); |
| if (!browserContext) { |
| throw new Error('Браузер не инициализирован'); |
| } |
| |
| |
| let token = getAuthToken(); |
| |
| |
| if (!token) { |
| logInfo('Токен авторизации не найден в памяти, пытаемся извлечь из браузера'); |
| token = await extractAuthToken(browserContext); |
| |
| if (!token) { |
| throw new Error('Не удалось получить токен авторизации'); |
| } |
| } |
| |
| logInfo('Токен авторизации получен, отправляем запрос на получение STS токена'); |
| |
| |
| const response = await axios.post('https://chat.qwen.ai/api/v1/files/getstsToken', fileInfo, { |
| headers: { |
| 'Authorization': `Bearer ${token}`, |
| 'Content-Type': 'application/json', |
| 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36', |
| 'Origin': 'https://chat.qwen.ai', |
| 'Referer': 'https://chat.qwen.ai/' |
| } |
| }); |
| |
| logInfo(`STS токен успешно получен для файла: ${fileInfo.filename}`); |
| return response.data; |
| } catch (error) { |
| logError(`Ошибка при получении STS токена: ${error.message}`, error); |
| throw error; |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| export async function uploadFile(filePath, stsData) { |
| try { |
| logInfo(`Начало загрузки файла: ${filePath}`); |
| |
| if (!stsData || !stsData.file_path) { |
| throw new Error('Некорректные данные STS токена'); |
| } |
| |
| |
| if (!stsData.access_key_id || !stsData.access_key_secret || !stsData.security_token || |
| !stsData.region || !stsData.bucketname) { |
| throw new Error('Неполные данные STS токена для OSS'); |
| } |
| |
| |
| const client = new OSS({ |
| region: stsData.region, |
| accessKeyId: stsData.access_key_id, |
| accessKeySecret: stsData.access_key_secret, |
| stsToken: stsData.security_token, |
| bucket: stsData.bucketname, |
| secure: true, |
| timeout: 60000 |
| }); |
| |
| logInfo(`OSS клиент создан для региона ${stsData.region}, бакет: ${stsData.bucketname}`); |
| |
| |
| const objectName = stsData.file_path; |
| |
| |
| logInfo(`Загрузка файла в OSS: ${objectName}`); |
| const result = await client.put(objectName, filePath); |
| |
| logInfo(`Файл успешно загружен в OSS: ${objectName}`); |
| logInfo(`URL файла: ${stsData.file_url}`); |
| |
| return { |
| success: true, |
| fileName: path.basename(filePath), |
| url: stsData.file_url, |
| fileId: stsData.file_id, |
| filePath: stsData.file_path, |
| ossResponse: result |
| }; |
| } catch (error) { |
| logError(`Ошибка при загрузке файла в OSS: ${error.message}`, error); |
| return { |
| success: false, |
| error: error.message |
| }; |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| export async function uploadFileToQwen(filePath) { |
| try { |
| |
| if (!fs.existsSync(filePath)) { |
| throw new Error(`Файл не найден: ${filePath}`); |
| } |
| |
| const fileName = path.basename(filePath); |
| const fileSize = fs.statSync(filePath).size; |
| const fileExt = path.extname(fileName).toLowerCase(); |
| |
| |
| let fileType = 'file'; |
| if (['.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp'].includes(fileExt)) { |
| fileType = 'image'; |
| } else if (['.pdf', '.doc', '.docx', '.txt'].includes(fileExt)) { |
| fileType = 'document'; |
| } |
| |
| |
| const fileInfo = { |
| filename: fileName, |
| filesize: fileSize, |
| filetype: fileType |
| }; |
| |
| const stsData = await getStsToken(fileInfo); |
| |
| |
| const uploadResult = await uploadFile(filePath, stsData); |
| |
| return { |
| ...uploadResult, |
| fileInfo, |
| stsData |
| }; |
| } catch (error) { |
| logError(`Ошибка в процессе загрузки файла: ${error.message}`, error); |
| return { |
| success: false, |
| error: error.message |
| }; |
| } |
| } |
|
|
| export default { |
| getStsToken, |
| uploadFile, |
| uploadFileToQwen |
| }; |
|
|
|
|