diff --git a/server/routers/back-new/features/image/image.controller.js b/server/routers/back-new/features/image/image.controller.js index b3f1c6b..93733f9 100644 --- a/server/routers/back-new/features/image/image.controller.js +++ b/server/routers/back-new/features/image/image.controller.js @@ -2,45 +2,44 @@ const axios = require('axios'); const makeLinks = require('../../shared/hateoas'); const { v4: uuidv4 } = require('uuid'); const qs = require('qs'); +require('dotenv').config(); process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; -// 获取access_token -async function fetchAccessToken(apiKey) { +// 获取GigaChat access_token,严格按官方文档 +async function getGigaChatToken() { + const apiKey = process.env.GIGACHAT_API_KEY; + const scope = process.env.GIGACHAT_SCOPE || 'GIGACHAT_API_PERS'; + if (!apiKey) throw new Error('GIGACHAT_API_KEY 未配置'); + + const rqUID = uuidv4(); + const auth = Buffer.from(apiKey.trim()).toString('base64'); + try { - console.log('请求token参数:', { - url: 'https://ngw.devices.sberbank.ru:9443/api/v2/oauth', - data: qs.stringify({ scope: 'GIGACHAT_API_PERS' }), - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': 'application/json', - 'Authorization': `Basic ${apiKey}`, - 'RqUID': uuidv4() - } - }); - const tokenResp = await axios.post( + const resp = await axios.post( 'https://ngw.devices.sberbank.ru:9443/api/v2/oauth', - qs.stringify({ scope: 'GIGACHAT_API_PERS' }), + new URLSearchParams({ scope }), { headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json', - 'Authorization': `Basic ${apiKey}`, - 'RqUID': uuidv4() + 'RqUID': rqUID, + 'Authorization': `Basic ${auth}`, }, + timeout: 10000, } ); - return tokenResp.data.access_token; - } catch (err) { - console.error('AI生成图片出错: 获取access_token失败'); - if (err.response) { - console.error('status:', err.response.status); - console.error('headers:', err.response.headers); - console.error('data:', err.response.data); - console.error('config:', err.config); - } else { - console.error('AI生成图片出错:', err.message); + if (!resp.data.access_token) { + console.error('GigaChat token响应异常:', resp.data); + throw new Error('GigaChat token响应异常'); } - throw new Error('获取access_token失败: ' + err.message); + return resp.data.access_token; + } catch (err) { + if (err.response) { + console.error('获取access_token失败:', err.response.status, err.response.data); + } else { + console.error('获取access_token异常:', err.message); + } + throw new Error('获取access_token失败'); } } @@ -116,9 +115,13 @@ exports.generate = async (req, res) => { if (!prompt) { return res.status(400).json({ error: 'Prompt parameter is required' }); } + let accessToken; + try { + accessToken = await getGigaChatToken(); + } catch (e) { + return res.status(500).json({ error: e.message }); + } try { - const apiKey = process.env.GIGACHAT_API_KEY; - const accessToken = await fetchAccessToken(apiKey); const content = await fetchChatContent(accessToken, prompt); const match = content.match(/