diff --git a/AI/WxMini/Milvus/requirements.txt b/AI/WxMini/Milvus/requirements.txt index 016d04a3..4948a618 100644 --- a/AI/WxMini/Milvus/requirements.txt +++ b/AI/WxMini/Milvus/requirements.txt @@ -4,4 +4,7 @@ jieba==0.42.1 pymilvus==2.5.6 aiomysql==0.2.0 numpy==1.23.5 -alibabacloud_imagerecog20190930==2.0.10 \ No newline at end of file +alibabacloud_imagerecog20190930==2.0.10 +alibabacloud_tea_openapi==0.0.2 +alibabacloud_sts20150401==1.1.4 +alibabacloud_credentials==2.2.1 \ No newline at end of file diff --git a/AI/WxMini/Start.py b/AI/WxMini/Start.py index 84fb3a74..ca660205 100644 --- a/AI/WxMini/Start.py +++ b/AI/WxMini/Start.py @@ -4,17 +4,17 @@ import time import uuid from contextlib import asynccontextmanager -from fastapi import FastAPI, Form, HTTPException, Query +from fastapi import FastAPI, Form, HTTPException from openai import AsyncOpenAI from WxMini.Milvus.Config.MulvusConfig import * from WxMini.Milvus.Utils.MilvusCollectionManager import MilvusCollectionManager from WxMini.Milvus.Utils.MilvusConnectionPool import * +from WxMini.Utils.EmbeddingUtil import text_to_embedding +from WxMini.Utils.MySQLUtil import init_mysql_pool, save_chat_to_mysql, get_chat_log_by_session, update_risk, \ + get_last_chat_log_id, get_user_by_login_name, get_chat_logs_by_risk_flag from WxMini.Utils.OssUtil import upload_mp3_to_oss_from_memory from WxMini.Utils.TtsUtil import TTS -from WxMini.Utils.MySQLUtil import init_mysql_pool, save_chat_to_mysql, get_chat_log_by_session, update_risk, \ - get_last_chat_log_id, get_user_by_login_name, get_chat_logs_by_risk_flag -from WxMini.Utils.EmbeddingUtil import text_to_embedding # 配置日志 logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") diff --git a/AI/WxMini/Test/TestGetOssToken.py b/AI/WxMini/Test/TestGetOssToken.py new file mode 100644 index 00000000..58edbecd --- /dev/null +++ b/AI/WxMini/Test/TestGetOssToken.py @@ -0,0 +1,52 @@ +import json +from alibabacloud_sts20150401 import models as sts_20150401_models +from alibabacloud_sts20150401.client import Client as Sts20150401Client +from alibabacloud_tea_openapi.models import Config + +# https://help.aliyun.com/zh/oss/use-cases/add-signatures-on-the-client-by-using-javascript-and-upload-data-to-oss?spm=a2c4g.11186623.help-menu-31815.d_6_1_0_1.2dd15d03SrLg4Q#4f036801celh7 +# 配置阿里云 AccessKey 和 RAM 角色 ARN +access_key_id = "LTAI5tJrhwuBzF2X9USrzubX" +access_key_secret = "I6ezLuYhk9z9MRjXD2q99STSpTONwW" +role_arn_for_oss_upload = "acs:ram::1546399445482588:role/huanghai-create-role" # RAM 角色 ARN + +# 替换为实际的 bucket 名称和 region-id +BUCKET_NAME = 'hzkc' +REGION_ID = 'cn-beijing' +ENDPOINT = 'https://oss-cn-beijing.aliyuncs.com' +OSS_PREFIX = "https://hzkc.oss-cn-beijing.aliyuncs.com/" + +host = OSS_PREFIX +expire_time = 3600 # 指定过期时间,单位为秒 +upload_dir = 'dir' # 指定上传到 OSS 的文件前缀 +role_session_name = 'role_session_name' # 自定义会话名称 + +# 直接使用 access_key_id 和 access_key_secret 初始化 Config +config = Config( + region_id=REGION_ID, + access_key_id=access_key_id, + access_key_secret=access_key_secret +) + +# 创建 STS 客户端并获取临时凭证 +sts_client = Sts20150401Client(config=config) +assume_role_request = sts_20150401_models.AssumeRoleRequest( + role_arn=role_arn_for_oss_upload, + role_session_name=role_session_name +) +response = sts_client.assume_role(assume_role_request) +token = json.dumps(response.body.credentials.to_map()) + +# 将 JSON 字符串解析为 Python 字典 +token_dict = json.loads(token) + +# 提取字段 +access_key_id = token_dict['AccessKeyId'] +access_key_secret = token_dict['AccessKeySecret'] +expiration = token_dict['Expiration'] +security_token = token_dict['SecurityToken'] + +# 打印提取的字段 +print(f"AccessKeyId: {access_key_id}") +print(f"AccessKeySecret: {access_key_secret}") +print(f"Expiration: {expiration}") +print(f"SecurityToken: {security_token}") \ No newline at end of file diff --git a/AI/WxMini/Utils/AliUtil.py b/AI/WxMini/Utils/AliUtil.py new file mode 100644 index 00000000..f90d0175 --- /dev/null +++ b/AI/WxMini/Utils/AliUtil.py @@ -0,0 +1,68 @@ +import base64 +import time +import oss2 +from oss2.models import PolicyConditions # 确保正确导入 PolicyConditions +from typing import Dict + +class AliUtil: + def __init__(self): + # 从配置中读取阿里云 OSS 的配置 + self.endpoint = "your_endpoint" # 替换为你的 OSS endpoint + self.access_key_id = "your_access_key_id" # 替换为你的 AccessKeyId + self.access_key_secret = "your_access_key_secret" # 替换为你的 AccessKeySecret + + def get_signature(self, bucket_name: str) -> Dict[str, str]: + """ + 获取临时访问 OSS 的签名 + :param bucket_name: bucket 名称,由前端传入(上传不同文件到不同文件夹) + :return: 包含签名信息的字典 + """ + resp_map = {} + # host 的格式为 bucketName.endpoint + host = f"https://{bucket_name}.{self.endpoint}" + # callbackUrl 为上传回调服务器的 URL,请将下面的 IP 和 Port 配置为您自己的真实信息。 + callback_url = "" + dir = "" # 用户上传文件时指定的前缀。 + + # 初始化 OSS 客户端 + auth = oss2.Auth(self.access_key_id, self.access_key_secret) + bucket = oss2.Bucket(auth, self.endpoint, bucket_name) + + try: + # 设置过期时间为半小时 (1800 秒) + expire_time = 60 * 30 + expire_end_time = int(time.time()) + expire_time + + # 设置 Policy 条件 + policy_conditions = PolicyConditions() + policy_conditions.add_condition(PolicyConditions.CONTENT_LENGTH_RANGE, 0, 1048576000) # 文件大小限制 + policy_conditions.add_condition(PolicyConditions.STARTS_WITH, PolicyConditions.KEY, dir) # 文件前缀 + + # 生成 Post Policy + post_policy = bucket._make_post_policy(expire_end_time, policy_conditions) + encoded_policy = base64.b64encode(post_policy.encode('utf-8')).decode('utf-8') + + # 计算签名 + post_signature = bucket._make_post_signature(post_policy) + + # 构建返回的签名信息 + resp_map["accessid"] = self.access_key_id + resp_map["policy"] = encoded_policy + resp_map["signature"] = post_signature + resp_map["dir"] = dir + resp_map["host"] = host + resp_map["expire"] = str(expire_end_time) + + # 构建回调信息 + callback_body = { + "callbackUrl": callback_url, + "callbackBody": "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}", + "callbackBodyType": "application/x-www-form-urlencoded" + } + base64_callback_body = base64.b64encode(str(callback_body).encode('utf-8')).decode('utf-8') + resp_map["callback"] = base64_callback_body + + except Exception as e: + print(f"Error: {e}") + + return resp_map \ No newline at end of file diff --git a/AI/WxMini/Utils/__pycache__/MySQLUtil.cpython-310.pyc b/AI/WxMini/Utils/__pycache__/MySQLUtil.cpython-310.pyc index 4fb6dc19..eb556647 100644 Binary files a/AI/WxMini/Utils/__pycache__/MySQLUtil.cpython-310.pyc and b/AI/WxMini/Utils/__pycache__/MySQLUtil.cpython-310.pyc differ diff --git a/AI/WxMini/__pycache__/Start.cpython-310.pyc b/AI/WxMini/__pycache__/Start.cpython-310.pyc index d4d62029..3868f57d 100644 Binary files a/AI/WxMini/__pycache__/Start.cpython-310.pyc and b/AI/WxMini/__pycache__/Start.cpython-310.pyc differ