From cecc04859ec4123ae583702d7ac837a69b76c412 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Wed, 26 Mar 2025 13:21:39 +0800 Subject: [PATCH] 'commit' --- AI/WxMini/Milvus/requirements.txt | 5 +- AI/WxMini/Start.py | 8 +-- AI/WxMini/Test/TestGetOssToken.py | 52 ++++++++++++++ AI/WxMini/Utils/AliUtil.py | 68 ++++++++++++++++++ .../__pycache__/MySQLUtil.cpython-310.pyc | Bin 6553 -> 7272 bytes AI/WxMini/__pycache__/Start.cpython-310.pyc | Bin 9093 -> 9258 bytes 6 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 AI/WxMini/Test/TestGetOssToken.py create mode 100644 AI/WxMini/Utils/AliUtil.py 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 4fb6dc199fe526815846a39954b9519bcbcb5240..eb5566472edfb7b810fc5a7c94e1eca39f2cdcbc 100644 GIT binary patch delta 3241 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 z zmOtqM*=FqY2n{yN^G2k_wMuU)o(ydbg>3wl(j_T1+)WAl*;@)w1bhg(Mnlj1Qr8}Yl5H6K)H z0kObHY)0m#s75h)&+$P^oXl$jaS>13Vhe6r8t%BS_JM00i52hh0W8|cm<{{AZna<< zHRl3KC1om`Gu0psuyR^SAtm{=d#qwUA^jEnaXumKNA@Q0>+6s8$J3Vl)witWD)Qas diff --git a/AI/WxMini/__pycache__/Start.cpython-310.pyc b/AI/WxMini/__pycache__/Start.cpython-310.pyc index d4d62029c95ea43ed79a9b2cd159fa401a938503..3868f57d761f0b71e5c7168bb999e1da3d8e2cb9 100644 GIT binary patch delta 2761 zcmZWqYfx0l6`t;U=RFL=@MZ=ao;th~SW!?D%`UFE3a*gaW2i0@Oz}Aq# zU?OaZ;8A)FwZ&n4G?Yi0+;0Z%%)G z`rLEQJ*WF;Z{9oNjOFCm4DcKn`{(eXJy)GxRDZSMPzo7{fyiN7#ID$N*%)^83(geI zi8vMK2A8XI=CCW0r{w9JCG3vmEBTQEr65wM6h?}aqDZk)94S#sBBe^Hu44_CMLdc} zmu+Ehq+BUS28zy9z}QCY#4(e?f|&Qw$_1oU(P~;lYiS+HnUR$3bcf=nPU@dTN!i8%X{PQktlpHj@HUID?g)v}t}9DOy0(LW(Ch5O$Z) z7E(%EhGbGkJQs|U$gQ+OtlqFG(x$Y5E3l1Epz>4;snXS|NsUlbUW1k0q!tXekvjNo zCp%^&ko_RnlLpc_BX5{*qV1%awhx)ePO?kiyGP&KqVFvxtz_E_-mud4l9ktVD-zjF z+rL9zm}w__bTfNtCE0rx&mxu&E~9XV(m^}UbdnCzN%nyo`)6cGH0slb{{a6Hu0Rq` z;R?QpTitmo9aRHrEI=azl#oz#nEw~|@SxP>)yjsc8W=nsR0HAIa6B+D7GRY~y!rAym)Z_9lCd zAUp!R{HXnh_G%&OP{UX3-$pY3m%ZB34XhurT3+EeWjZKS4zEl&&KuG873^+9rX7N6 z;QR6qphiBH--JRdck(|$=uLjKu*;VN&~?J3B@$y2n$73mM7M1y?uRw6DPY4cYlxB#l9_h5>pYn=4LcZgK-)d+;rPt z%npk6!~8!*)u@kqin}3PTKtBO2zo%kmSn@4wrr*1n&F58E((EBZqiRSU3xtSfAE7KBiw2^>2-VD^16jd3D3*23 z8ia~z%gXln;OST_oSoQ)S&+~Tc`zJ|$936n+jtdEm(``%9K6vlvup78!aH^{%jOF9 z<&pqh;iMj{CW{_q4PyT4*M?RNMZbcTxTs7#A=@oTMg@`#=z<|*c#s7n(>ey^Bc39Y z{BP6O>|=h}Q-BXgN2*TTI%b82((^Ef(xYF-m%7&dy(&`r% zGY=Q_t)1l~K^BboHpA%jZPnzC@(TXWwyqSbgO~M$uE7UNh!Z?BcP}&j$Mn>LC!c+q zo}J2kwD9=hZ=Za4A^Upv15jZcK<~oL&D*QXpJZFiFKb3MrUt_=>OzynmExDS)W2T( zM&=S`MCqqCt_?94C#~PaJ{9t2ZE2?1&`_MJ?5?2i2zaH?+}|vp4pDAppo=FQPA_zY z17R5>(G%h)e{EW4_h4DG@Ke4Tf1$8iBnh?{|35g^WfO@hp^Q85+$ zn9YbeaV|6%V^K|F`HAS3T zM5ay8ET$@CNI8ra*@kUMeg^FSFm^n%v^XRulGn3y{0vKubxWQNY`x0bsw}7o%j^FK DavcC+ delta 2661 zcmaJ?YfK#16`ngY`(SrimdEbGg3aSjf`1KxNa^zIT2 z!d+8S%Z|Ja_}WVC+5x|!I8usR+9q{lscL_;m8$;l^hbZx%cDPq(FqnfS> z*%HYeK+YO*Mf3E$4bCk%TO>bPpce?v9x03#=|w`$iFl%3-5d4kzG$&t94*mHqJG^U zE!9h-WqO&=aYVL7x9i)9WRN$@;S11|lWJ)hiG>QI@($6fjA~QBPXdTa4y~UDSJr z73Cv4Er9u-CGPH5&^w<5Of?s+Cp>wJKUIwD!QvUb+Ju zI%o~NwX`m+fE)z5o;J|Nw7TKG$=FAmjeWybx|6mD+x^0J*9+U$4O{fH`+xXR=$<3s zQX0QqVuH4GUlpXv}a<9)jVkAQ>oH!F2Iz5;SMdBl&(ZLae*D1}OATjfk#@S>j z84nrJZyJ<_Vlvp*tVmV1_mi}ycq`LEgV>rRe5dwVP5he{h z$Jyk}L!t~}8}D$w;jBhczz+VQ^Ce>8e|1*byMYZ7R>M8oDQgF+yt*{5OVx_7Mbbj>+cU8KiT=^uCKCO)Yudf9Cq_Rc>NpOw-<3@*N2b zqXtFT6e1X!7G{h_CSv@TzTf1|0s(Qd!f(>bZx^3PDImJw`!#%t_W-8Jl*BAkB;ia# zHc*)=Y56-ONs{uEbV2Tdl0Pb)lc(fFDa>1_H9J2gQ(K8NMb0R!7I-_&$@0`eoiL}t zoJ?~CqMl4$0`pqM&n+-tV1d9wfkgs6B@*@Ca#G(drC$mb^ZAmqsqie3q_OR=-j!<~ zEMNLKGn>v_y^>kHxUw+)^po`Jg(puxdA#!QF$;l8Z}=K&V=85}K_m0g_cOOXU>vyc z9L{PWW$o9l-B?{*T>C8$f?c`si_DYj%a>*|Z_l$Ru%AfD$2sD5v8q%4aFFa{R3ta%>eRwyHg`>MJ1YeWmP6t*-F0ns(&xH zK4Z7RX0mAKU>FN~Czkp13TL(aqta7*=0IT$la+lPK!kL8@tw6hKVALdBMj2@M?sZg z8nJl*Q;ryHZs~9tBPmR>EeQ>(qE_$X)IEgD2wS$KZC*w>9906-S3Y0tQVF{c;-qKu zf<<4#b~J`nx$Cn}Z!X`uyml}0y|o(;Kl}7b3li@xtlirfx3-IE96fzI;AWW0VJpQdRf9iFqUs9!{It)l^xK*H53{j{&1HW6v*jz717R9iyWvP@9>0^hbP<-%7s`iHy<;`t=l{FN z-2c()Pad=f*c+fKN++1Z+$eA9L^0$<+l-?$j)0K}TG#`Wx18uDNjmg}bIpBmi{NRs z;K5>^%jadS7!uS)iinrk&&%uVeg3aNFz7|cJ^<4;9%p9^mIxlqHf0+mJ!Jg|3!}??ZxY)?2AZvIL#97#0yB@!qw2cN9;f5VCH zy`NL)ndm=pOsHUo$o6HC%i?Ad!4cONuHE#1&b0IS{U^)|`Sr?1QpSH(`EsfPl?&j8 zd8O~zvCdZpy83!Uy&XNB3_BY0Bj9PVZUl_IncLHMr1My)<9Ju-wa%|Gymm}=G!A`6 z1Roo_s9sZnu(C-UVr{VZQPDQ`R(L4RVy42zVo+bO{>@d!uT=%!DwZ{3$4@khYNE+* z#X($(s@RFFx{2NG*exqEfd;Z}w^b4;rCIEXLv|2#9oT=%vbJuo(-ap`pJm7Lx~yo= S>~0ObZe<-scH))QXa4~tnbgn#