/** * Copyright 2025 Beijing Volcano Engine Technology Co., Ltd. All Rights Reserved. * SPDX-license-identifier: BSD-3-Clause */ const Koa = require('koa'); const bodyParser = require('koa-bodyparser'); const cors = require('koa2-cors'); const { Signer } = require('@volcengine/openapi'); const fetch = require('node-fetch'); const AccessToken = require('./AccessToken'); const Privileges = require('./AccessToken').privileges; const app = new Koa(); app.use(cors({ origin: '*' })); /** * @notes 在 https://console.volcengine.com/iam/keymanage/ 获取 AK/SK */ const ACCOUNT_INFO = { /** * @notes 必填, 在 https://console.volcengine.com/iam/keymanage/ 获取 */ accessKeyId: 'AKLTNGJhYTRiMWE5Yzc2NDhlODk3NzE0YTI4NzEyZTM3NDI', /** * @notes 必填, 在 https://console.volcengine.com/iam/keymanage/ 获取 */ secretKey: 'T1RrellUVXpaRFU0WXpVME5EZzRNV0UxTXpObFl6QmhPVFl4TUdFME0yTQ==', /** * @notes 非必填, 主账号无须传入, 子账号须传, 获取方式可参考 * https://www.volcengine.com/docs/6348/1315561 中的 步骤 4-使用子账号调用智能体接口 一节 */ // sessionToken: 'Your SessionToken', } // AccessToken 应用配置 const appID = "67e11a296ff39301ed7429aa"; const appKey = "51151bf3ab2545bbb1b1494ffaae0521"; app.use(bodyParser()); app.use(async ctx => { /** * @brief 代理 AIGC 的 OpenAPI 请求 */ if (ctx.url.startsWith('/api/proxyaigc') && ctx.method.toLowerCase() === 'post') { const { Action, Version = '2023-11-01' } = ctx.query || {}; const body = { AppId: appID, // 自动添加 AppId ...ctx.request.body }; const openApiRequestData = { region: 'cn-north-1', method: 'POST', params: { Action, Version, }, headers: { Host: 'rtc.volcengineapi.com', 'Content-type': 'application/json', Authorization: '', }, body, }; const signer = new Signer(openApiRequestData, "rtc"); signer.addAuthorization(ACCOUNT_INFO); console.log('请求参数:', { Action, Version, body }); // 添加日志 const result = await fetch(`https://rtc.volcengineapi.com?Action=${Action}&Version=${Version}`, { method: 'POST', headers: { ...openApiRequestData.headers, Authorization: openApiRequestData.headers.Authorization, }, body: JSON.stringify(body), }); const volcResponse = await result.json(); console.log('响应结果:', volcResponse); // 添加日志 if (!volcResponse.ResponseMetadata?.Error) { ctx.body = volcResponse; } else { ctx.status = 500; ctx.body = { code: 500, message: volcResponse.ResponseMetadata.Error.Message || '请求失败', data: null }; } } /** * @brief 生成 token 的 API 接口 */ else if (ctx.url === '/api/token' && ctx.method.toLowerCase() === 'post') { try { const { roomId, userId } = ctx.request.body; // 参数验证 if (!roomId || !userId) { ctx.status = 400; ctx.body = { code: 400, message: '缺少必要参数 roomId 或 userId', data: null }; return; } // 创建 AccessToken const key = new AccessToken.AccessToken(appID, appKey, roomId, userId); // 添加权限 key.addPrivilege(Privileges.PrivSubscribeStream, 0); key.addPrivilege(Privileges.PrivPublishStream, Math.floor(new Date() / 1000) + (24 * 3600)); key.expireTime(Math.floor(new Date() / 1000) + (24 * 3600)); // 序列化 token const token = key.serialize(); // 返回成功响应 ctx.status = 200; ctx.body = { code: 200, message: '获取 token 成功', data: { token } }; } catch (error) { console.error('生成 token 出错:', error); ctx.status = 500; ctx.body = { code: 500, message: '服务器内部错误', data: null }; } } else { ctx.body = '

404 Not Found

'; } }); app.listen(3001, () => { console.log('AIGC Server is running at http://localhost:3001'); console.log('Token API is available at http://localhost:3001/api/token'); });