From 07e69b31aac8ee6a87fc02aa5ac22d960815f7b2 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Wed, 26 Mar 2025 13:52:08 +0800 Subject: [PATCH] 'commit' --- AI/WxMini/Milvus/Config/MulvusConfig.py | 1 + .../__pycache__/MulvusConfig.cpython-310.pyc | Bin 1115 -> 1144 bytes AI/WxMini/Start.py | 26 ++++++- AI/WxMini/Test/Oss_GetToken.py | 17 +++++ AI/WxMini/Test/TestGetOssToken.py | 52 -------------- AI/WxMini/Utils/OssUtil.py | 65 +++++++++++++++++- .../Utils/__pycache__/OssUtil.cpython-310.pyc | Bin 1337 -> 3717 bytes 7 files changed, 105 insertions(+), 56 deletions(-) create mode 100644 AI/WxMini/Test/Oss_GetToken.py delete mode 100644 AI/WxMini/Test/TestGetOssToken.py diff --git a/AI/WxMini/Milvus/Config/MulvusConfig.py b/AI/WxMini/Milvus/Config/MulvusConfig.py index d275cec1..1b89b234 100644 --- a/AI/WxMini/Milvus/Config/MulvusConfig.py +++ b/AI/WxMini/Milvus/Config/MulvusConfig.py @@ -60,6 +60,7 @@ ACCESS_KEY_SECRET = 'oizcTOZ8izbGUouboC00RcmGE8vBQ1' BUCKET_NAME = 'hzkc' ENDPOINT = 'https://oss-cn-beijing.aliyuncs.com' OSS_PREFIX = "https://hzkc.oss-cn-beijing.aliyuncs.com/" +REGION_ID = 'cn-beijing' # 阿里云中用来调用 deepseek v3 的密钥 # https://bailian.console.aliyun.com/?spm=a2c4g.11186623.0.0.77b17980FcMVYv&apiKey=1#/api-key diff --git a/AI/WxMini/Milvus/Config/__pycache__/MulvusConfig.cpython-310.pyc b/AI/WxMini/Milvus/Config/__pycache__/MulvusConfig.cpython-310.pyc index 0ea9e07a3e5a7d673aa5340d1464ce1dad2b1a1b..215d4d8f42e8321c2e8bee2d546b74a492bc9105 100644 GIT binary patch delta 146 zcmcc3@q>dmpO=@50SHw3AE(DnJ#kj vAK)7A=Y delta 95 zcmeytahroTpO=@50SNX5JWh9+$Scd3H&Hu}l{=V0Q)=U)NXE(ROj(Rln~Rtf7HrWL9RpHTf*FG#fimcM<#Kcg%i_W|M7MjM!ONm{?di*Z{mv7dZd` diff --git a/AI/WxMini/Start.py b/AI/WxMini/Start.py index ca660205..3096a78e 100644 --- a/AI/WxMini/Start.py +++ b/AI/WxMini/Start.py @@ -15,6 +15,7 @@ from WxMini.Utils.MySQLUtil import init_mysql_pool, save_chat_to_mysql, get_chat 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.OssUtil import get_sts_token, upload_to_oss # 配置日志 logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") @@ -309,12 +310,13 @@ async def get_chat_log( result = await get_chat_log_by_session(app.state.mysql_pool, person_id, page, page_size) return result + # 获取风险聊天记录接口 @app.get("/aichat/get_risk_chat_logs") async def get_risk_chat_logs( - risk_flag: int = Query(..., description="风险标志(1 表示有风险,0 表示无风险)"), - page: int = Query(default=1, ge=1, description="当前页码(默认值为 1)"), - page_size: int = Query(default=10, ge=1, le=100, description="每页记录数(默认值为 10,最大值为 100)") + risk_flag: int = Query(..., description="风险标志(1 表示有风险,0 表示无风险)"), + page: int = Query(default=1, ge=1, description="当前页码(默认值为 1)"), + page_size: int = Query(default=10, ge=1, le=100, description="每页记录数(默认值为 10,最大值为 100)") ): """ 获取聊天记录,支持分页和风险标志过滤 @@ -344,6 +346,24 @@ async def get_risk_chat_logs( } +# 获取上传OSS的授权Token +@app.get("/aichat/get_oss_upload_token") +async def get_oss_upload_token(): + # 获取 STS 临时凭证 + sts_token = get_sts_token() + return { + "code": 200, + "message": "获取上传凭证成功", + "data": { + "access_key_id": sts_token['AccessKeyId'], + "access_key_secret": sts_token['AccessKeySecret'], + "security_token": sts_token['SecurityToken'], + "bucket_name": BUCKET_NAME, + "endpoint": ENDPOINT + } + } + + # 运行 FastAPI 应用 if __name__ == "__main__": import uvicorn diff --git a/AI/WxMini/Test/Oss_GetToken.py b/AI/WxMini/Test/Oss_GetToken.py new file mode 100644 index 00000000..f6d616a7 --- /dev/null +++ b/AI/WxMini/Test/Oss_GetToken.py @@ -0,0 +1,17 @@ +from WxMini.Utils.OssUtil import get_sts_token, upload_to_oss + +# 测试调用 +if __name__ == "__main__": + # 获取 STS 临时凭证 + sts_token = get_sts_token() + # print(f"AccessKeyId: {sts_token['AccessKeyId']}") + # print(f"AccessKeySecret: {sts_token['AccessKeySecret']}") + # print(f"SecurityToken: {sts_token['SecurityToken']}") + + # 上传文件到 OSS + result = upload_to_oss( + sts_token['AccessKeyId'], + sts_token['AccessKeySecret'], + sts_token['SecurityToken'] + ) + print(result) diff --git a/AI/WxMini/Test/TestGetOssToken.py b/AI/WxMini/Test/TestGetOssToken.py deleted file mode 100644 index 58edbecd..00000000 --- a/AI/WxMini/Test/TestGetOssToken.py +++ /dev/null @@ -1,52 +0,0 @@ -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/OssUtil.py b/AI/WxMini/Utils/OssUtil.py index 3aaf3282..d578aa75 100644 --- a/AI/WxMini/Utils/OssUtil.py +++ b/AI/WxMini/Utils/OssUtil.py @@ -1,4 +1,10 @@ +# 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 +import json import oss2 +from alibabacloud_sts20150401 import models as sts_20150401_models +from alibabacloud_sts20150401.client import Client as Sts20150401Client +from alibabacloud_tea_openapi.models import Config + from WxMini.Milvus.Config.MulvusConfig import * # 初始化 OSS Bucket @@ -32,4 +38,61 @@ def upload_mp3_to_oss_from_memory(oss_object_name, audio_data): bucket.put_object(oss_object_name, audio_data) print(f"音频数据已成功上传到 OSS,存储为 {oss_object_name}") except Exception as e: - print(f"上传失败: {e}") \ No newline at end of file + print(f"上传失败: {e}") + + +def get_sts_token(access_key_id="LTAI5tJrhwuBzF2X9USrzubX", access_key_secret="I6ezLuYhk9z9MRjXD2q99STSpTONwW", role_arn="acs:ram::1546399445482588:role/huanghai-create-role", role_session_name="role_session_name"): + """ + 获取 STS 临时凭证 + :param access_key_id: 阿里云 AccessKey ID (默认值: "LTAI5tJrhwuBzF2X9USrzubX") + :param access_key_secret: 阿里云 AccessKey Secret (默认值: "I6ezLuYhk9z9MRjXD2q99STSpTONwW") + :param role_arn: RAM 角色 ARN (默认值: "acs:ram::1546399445482588:role/huanghai-create-role") + :param role_session_name: 自定义会话名称 (默认值: "role_session_name") + :return: 包含 AccessKeyId、AccessKeySecret 和 SecurityToken 的字典 + """ + # 初始化 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, + role_session_name=role_session_name + ) + response = sts_client.assume_role(assume_role_request) + token = json.dumps(response.body.credentials.to_map()) + + # 解析 token + token_dict = json.loads(token) + return { + 'AccessKeyId': token_dict['AccessKeyId'], + 'AccessKeySecret': token_dict['AccessKeySecret'], + 'SecurityToken': token_dict['SecurityToken'] + } + +def upload_to_oss(access_key_id, access_key_secret, security_token, endpoint=ENDPOINT, bucket_name=BUCKET_NAME, file_key="Upload/example.txt", file_content="Hello, OSS!"): + """ + 上传文件到 OSS + :param access_key_id: 临时 AccessKey ID + :param access_key_secret: 临时 AccessKey Secret + :param security_token: 临时 SecurityToken + :param endpoint: OSS Endpoint (默认值: ENDPOINT) + :param bucket_name: OSS Bucket 名称 (默认值: BUCKET_NAME) + :param file_key: 文件在 OSS 中的 Key (默认值: "Upload/example.txt") + :param file_content: 文件内容 (默认值: "Hello, OSS!") + :return: 上传结果(成功或失败) + """ + # 使用临时凭证初始化 OSS 客户端 + auth = oss2.StsAuth(access_key_id, access_key_secret, security_token) + bucket = oss2.Bucket(auth, endpoint, bucket_name) + + # 上传文件 + try: + bucket.put_object(file_key, file_content) + return "文件上传成功" + except oss2.exceptions.AccessDenied as e: + return f"文件上传失败:{e}" \ No newline at end of file diff --git a/AI/WxMini/Utils/__pycache__/OssUtil.cpython-310.pyc b/AI/WxMini/Utils/__pycache__/OssUtil.cpython-310.pyc index 80c56c6bed513f498f63e4681f1e4b2f75d8731d..1f3a2c2917958bce41c17ca175c4a3938ab6293e 100644 GIT binary patch literal 3717 zcmbVP>r)%o72lVnl?1|opJ^UzPd`L%j4_6c(PTQsKwD}fQiO}W!_3a2dkqVcR=K-d zEY0F^YCE=5lQ?N>dmNHLC!M4ZKayr*Cot{*v0sfaOgrOG{gRn9J$J7pB!inySHsN?Zb&zwsG7;+Nga3(D)JjS#LmrIK*c-mA!eDhqjOrvZ5;S zv`@?gvOzWE*QJb{4Xa_l9>_#SILt3ZaRY8#6x0~hn{W(o!_AAL+Jb^8bb(V_k&MFd z-j24T7;3t}t2?L#+J>4>OQ;34LeEabr?~izb=V7+jPqVFYa*PnXstJ6;GFH(%-m^X z0&4vJv_LJ(j|6Xe*k1Vak5hcn=3F?^dExEYtYGsCg3G(YqQG;ba4?CJxbq^<<>W)0 zwQGjwIr=*Vf3}E3mwS&xlFPrxy)T`IZ*)WoM%Yr}D9_EpxMB?K0f}%F-95%lDL_RLVC=g8*tH$P^@>Mp?%7d?zf5pJC{Q09#*FOJ4 zLWu`F$;{)N7aVue)7bVRdB-mA#tY<$k+Z#U|Cuz-+lHBoOJ2BoHm~W4je8RP=JEKC z9BGD?zCO^G7(>>mNv6ksZsaD8o4JXxo`JE^GlNFX7&~Db8Eb6FvS_6(U+|ipe8$v~ zmdzj5Y*T~Tn_w2J1qvb9AjJ4*zkP<5ynIghmb5~59fCyYs3PbW&?s)RxdqE>-z8CS@joqynK1QU}H;p^yyORgI_;h zzT)r5IS6~Jwfi4nK`54zafyWCO{fb=lokz8#6?0uqeeFNL4b)^fc+>F8XxbuO|jEX z6Emx2an>Y-=fT9H^UyeM=c_T?PKWM3KGHMLW&ey!&NxSlKkhi$eIiAQ&iG01`GJ>l z@wjtpa=N?NJvcmdvajQ{?(Wn`DnBxmoEiQ4u%5OOaNiP%LtULOAMWn%?Ck11($RI~ zNP?Idd~njya}$%gaUe~wZsP;A(`%-sW?{<$K>HUiO}VG?(Bo5D^?3+E#pY}uLx`Uf zXC+&3B_z!8vjJP2l3c+BwwV)VgKl6U;071@*^nJv2)Ustc`CdRS>&KchMuS^LoMuv zk+g?{GT@iNJsb+n1G?g}^AEm^skOK6m)^dvz$t+PK3~1@Md{M*wY#tT(XC)2ordje z)3~4+2w-vZ@9USYu6*^5(&K+Ph6~C-pYr1R(#^FyAC=B6CzO3p^YOm;Qzo`BIL+RA z@|6Freu4iUs`_R82xGUAyv`(leZ_pYi_)?iS0`20EdvUHVh$&aIU% zudFQJTD$vx>Dt_*kMGqly9pkZNx>Zs-E-;c#nQDuZ}@ruJv{e%)$?WFl-|9nK-D3J zT^KQ^aZUjqFWtUTy7<6%cwAJ&1W!;18pvzZYa{A4*ECriXy#0_%qe(s#eZZs;M0p% z*B(G#Q?mP+CZPzoU*Ns_CsCmo$ZHM z-u7B8+tMn18cXYHbB|>?Sv(BaX&AreV9Qpcy5FVI4SLd)W#+s9aTEUQzcgf|ZAMZwA2FtCoWQn5C-hBTf_`fs6hcJc=`Z+ABqXugzavr$9}$B> zkcZzlBo1c9mJ@!GI*8Bc*?b1K*=Oux^rtwJF<+v2dvBVOY2~40QcX$Y(5NIN5HccA z1qY%g|sGD6~V80=-s@LW&C06gA2PLGD0W3ZD)8 z=?UKD^z_dPm6Qd`(^N_g$|#L6w%NcnaL9LX!=@1obG4%YzWyCx-mWfE2g+J|oI`mN zL$6^;XUKGy}6emm}`$KxfAj-IYv6Y}`EDH)I1P9?L zz7UKx#&|(&fD75e?_@%-9ln8hp{FG~X|anIls)3R2)){5KNRY2J!6dP<9a${I*1ZL zh0h56H-zk^HZMHQrj4-=p&FAYn@w%3Yg9(-d83WdBcs*5OzXA{8kt`@R$H%6;cbHs zZLx+bQU9xrJ-xmCsg!oC{}gaAaO*}h)!#eZKSHRmBR`-^%at3TMr*LlTuD_ip|Z+n sD?)u!Lx3ABD8B;RbTasdz!jWDoh9=!-{Ajbp+SuCvM4u2VmtT#2PU`5G5`Po delta 362 zcmYk0F-yZh6vyw~U6X5?q(vM=T8Dy2R%fYL&0xhSSeIK$@Qx~00!gzwD7Z?#fSsJh zNpSLG+}6RtZ{Sw%DHPxE```aP-uvHu=gkYVAn=H-hwu5g;*Vi_(6dev1rs7s=>&#E zlP9W~<})g5_U-7JcD0x>SyxQ)J0d+*Q;yY!f-@4iUwATkF>`>hdZ%%xZhf(0K^>ol z&|a(~LEO?s-g@0&1K8!b67k%zn!5;rz|Dx|4J*b=OLdivR60%b0Egic&FYzVH`lB$ zu!%9Nu#CXu$d^1TifvPU1YI!IXRtLkJT0e}#_5+A*Lo^NoE)5<9415A=%4Q&#lumu ncO3uysD)8@=U?b=eAD)f*tyA6Inh0^uJA1c5#X~B1oN9e40}m|