82 lines
2.9 KiB
Python
82 lines
2.9 KiB
Python
"""
|
||
POST /proxy — RTC OpenAPI 代理(含请求签名)
|
||
"""
|
||
|
||
import httpx
|
||
from fastapi import APIRouter, Request
|
||
from fastapi.responses import JSONResponse
|
||
|
||
from config.custom_scene import get_rtc_openapi_version
|
||
from security.signer import Signer
|
||
from services.scene_service import Scenes, prepare_scene_runtime
|
||
from utils.responses import error_response
|
||
from utils.validation import assert_scene_value, assert_value
|
||
|
||
router = APIRouter()
|
||
|
||
|
||
@router.post("/proxy")
|
||
async def proxy(request: Request):
|
||
action = request.query_params.get("Action", "")
|
||
version = request.query_params.get("Version") or get_rtc_openapi_version()
|
||
|
||
try:
|
||
assert_value(action, "Action 不能为空")
|
||
assert_value(version, "Version 不能为空")
|
||
|
||
body = await request.json()
|
||
scene_id = body.get("SceneID", "")
|
||
assert_value(scene_id, "SceneID 不能为空,SceneID 用于指定场景配置")
|
||
|
||
json_data = Scenes.get(scene_id)
|
||
if not json_data:
|
||
raise ValueError(f"{scene_id} 不存在,请先配置对应场景。")
|
||
|
||
_, _, voice_chat = prepare_scene_runtime(scene_id, json_data)
|
||
account_config = json_data.get("AccountConfig", {})
|
||
assert_scene_value(
|
||
scene_id, "AccountConfig.accessKeyId", account_config.get("accessKeyId")
|
||
)
|
||
assert_scene_value(
|
||
scene_id, "AccountConfig.secretKey", account_config.get("secretKey")
|
||
)
|
||
|
||
if action == "StartVoiceChat":
|
||
req_body = voice_chat
|
||
elif action == "StopVoiceChat":
|
||
app_id = voice_chat.get("AppId", "")
|
||
room_id = voice_chat.get("RoomId", "")
|
||
task_id = voice_chat.get("TaskId", "")
|
||
assert_scene_value(scene_id, "VoiceChat.AppId", app_id)
|
||
assert_scene_value(scene_id, "VoiceChat.RoomId", room_id)
|
||
assert_scene_value(scene_id, "VoiceChat.TaskId", task_id)
|
||
req_body = {"AppId": app_id, "RoomId": room_id, "TaskId": task_id}
|
||
else:
|
||
req_body = {}
|
||
|
||
request_data = {
|
||
"region": "cn-north-1",
|
||
"method": "POST",
|
||
"params": {"Action": action, "Version": version},
|
||
"headers": {
|
||
"Host": "rtc.volcengineapi.com",
|
||
"Content-type": "application/json",
|
||
},
|
||
"body": req_body,
|
||
}
|
||
signer = Signer(request_data, "rtc")
|
||
signer.add_authorization(account_config)
|
||
|
||
async with httpx.AsyncClient() as client:
|
||
resp = await client.post(
|
||
f"https://rtc.volcengineapi.com?Action={action}&Version={version}",
|
||
headers=request_data["headers"],
|
||
json=req_body,
|
||
)
|
||
return JSONResponse(resp.json())
|
||
|
||
except ValueError as e:
|
||
return error_response(action, str(e))
|
||
except Exception as e:
|
||
return error_response(action, str(e))
|