123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- package aliyun
- import (
- "encoding/json"
- "errors"
- "fmt"
- avatar20220130 "github.com/alibabacloud-go/avatar-20220130/v2/client"
- openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
- util "github.com/alibabacloud-go/tea-utils/v2/service"
- "github.com/alibabacloud-go/tea/tea"
- "github.com/suyuan32/simple-admin-common/utils/uuidx"
- "strconv"
- "strings"
- "wechat-api/internal/utils/jwt"
- )
- // CreateAvatarClient 使用AK&SK初始化账号Client
- // @return Client
- // @throws Exception
- func CreateAvatarClient(accessKeyId, accessKeySecret string) (_result *avatar20220130.Client, _err error) {
- // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
- // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378661.html。
- config := &openapi.Config{
- // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
- AccessKeyId: tea.String(accessKeyId),
- // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
- AccessKeySecret: tea.String(accessKeySecret),
- }
- // Endpoint 请参考 https://api.aliyun.com/product/avatar
- config.Endpoint = tea.String("avatar.cn-zhangjiakou.aliyuncs.com")
- _result = &avatar20220130.Client{}
- _result, _err = avatar20220130.NewClient(config)
- return _result, _err
- }
- // StartInstance 启动数字人
- func StartInstance(userId uint64, jsonData AiTypes) (*avatar20220130.StartInstanceResponseBodyData, error) {
- accessKeyId := jsonData.AccessKeyId
- accessKeySecret := jsonData.AccessKeySecret
- tenantId := jsonData.TenantId
- appId := jsonData.AppId
- bizId := GenerateBizID(userId)
- userIdStr := strconv.Itoa(int(userId))
- client, _err := CreateAvatarClient(accessKeyId, accessKeySecret)
- if _err != nil {
- return nil, _err
- }
- startInstanceRequest := &avatar20220130.StartInstanceRequest{
- TenantId: tea.Int64(int64(tenantId)),
- App: &avatar20220130.StartInstanceRequestApp{
- AppId: tea.String(appId),
- },
- User: &avatar20220130.StartInstanceRequestUser{
- UserId: tea.String(userIdStr),
- },
- BizId: tea.String(bizId),
- }
- _result, _err := client.StartInstance(startInstanceRequest)
- if _err != nil {
- return nil, _err
- }
- if *_result.Body.Success {
- //fmt.Println(_result.Body.Data)
- return _result.Body.Data, nil
- }
- return nil, errors.New(*_result.Body.Message)
- }
- // SendText 发送消息
- func SendText(sessionId, text string, isStream bool, index int32, position string, jsonData AiTypes) (*avatar20220130.SendTextResponseBodyData, error) {
- accessKeyId := jsonData.AccessKeyId
- accessKeySecret := jsonData.AccessKeySecret
- tenantId := jsonData.TenantId
- client, _err := CreateAvatarClient(accessKeyId, accessKeySecret)
- if _err != nil {
- return nil, _err
- }
- unicodeCode := uuidx.NewUUID().String()
- sendTextRequest := &avatar20220130.SendTextRequest{
- TenantId: tea.Int64(int64(tenantId)),
- SessionId: &sessionId,
- UniqueCode: &unicodeCode,
- Text: &text,
- }
- if isStream == true {
- sendTextRequest.StreamExtension = &avatar20220130.SendTextRequestStreamExtension{
- Index: &index,
- Position: &position,
- IsStream: &isStream,
- }
- }
- _result, _err := client.SendText(sendTextRequest)
- if _err != nil {
- return nil, _err
- }
- if *_result.Body.Success {
- //fmt.Println(_result.Body.Data)
- return _result.Body.Data, nil
- }
- return nil, errors.New(*_result.Body.Message)
- }
- // StopInstance 停止数字人
- func StopInstance(sessionId string, jsonData AiTypes) (*avatar20220130.StopInstanceResponseBodyData, error) {
- accessKeyId := jsonData.AccessKeyId
- accessKeySecret := jsonData.AccessKeySecret
- tenantId := jsonData.TenantId
- client, _err := CreateAvatarClient(accessKeyId, accessKeySecret)
- if _err != nil {
- return nil, _err
- }
- stopInstanceRequest := &avatar20220130.StopInstanceRequest{
- TenantId: tea.Int64(int64(tenantId)),
- SessionId: &sessionId,
- }
- _result, _err := client.StopInstance(stopInstanceRequest)
- if _err != nil {
- return nil, _err
- }
- if *_result.Body.Success {
- //fmt.Println(_result.Body.Data)
- return _result.Body.Data, nil
- }
- return nil, errors.New(*_result.Body.Message)
- }
- // QueryRunningInstance 查询运行中的实例列表
- func QueryRunningInstance(jsonData AiTypes) (*avatar20220130.QueryRunningInstanceResponseBody, error) {
- accessKeyId := jsonData.AccessKeyId
- accessKeySecret := jsonData.AccessKeySecret
- appId := jsonData.AppId
- tenantId := jsonData.TenantId
- client, _err := CreateAvatarClient(accessKeyId, accessKeySecret)
- if _err != nil {
- return nil, _err
- }
- queryRunningInstanceRequest := &avatar20220130.QueryRunningInstanceRequest{
- App: &avatar20220130.QueryRunningInstanceRequestApp{
- AppId: tea.String(appId),
- },
- TenantId: tea.Int64(int64(tenantId)),
- }
- _result, _err := client.QueryRunningInstance(queryRunningInstanceRequest)
- if _err != nil {
- return nil, _err
- }
- if *_result.Body.Success {
- //fmt.Println(_result.Body.Data)
- return _result.Body, nil
- }
- return nil, errors.New(*_result.Body.Message)
- }
- func _main(args []*string) (_err error) {
- client, _err := CreateAvatarClient("", "")
- if _err != nil {
- return _err
- }
- sendMessageRequest := &avatar20220130.SendMessageRequest{
- SessionId: tea.String("your_value"),
- TenantId: tea.Int64(1),
- Feedback: tea.Bool(false),
- }
- tryErr := func() (_e error) {
- defer func() {
- if r := tea.Recover(recover()); r != nil {
- _e = r
- }
- }()
- // 复制代码运行请自行打印 API 的返回值
- _, _err = client.SendMessageWithOptions(sendMessageRequest, &util.RuntimeOptions{})
- if _err != nil {
- return _err
- }
- return nil
- }()
- if tryErr != nil {
- var error = &tea.SDKError{}
- if _t, ok := tryErr.(*tea.SDKError); ok {
- error = _t
- } else {
- error.Message = tea.String(tryErr.Error())
- }
- // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
- // 错误 message
- fmt.Println(tea.StringValue(error.Message))
- // 诊断地址
- var data interface{}
- d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data)))
- d.Decode(&data)
- if m, ok := data.(map[string]interface{}); ok {
- recommend, _ := m["Recommend"]
- fmt.Println(recommend)
- }
- _, _err = util.AssertAsString(error.Message)
- if _err != nil {
- return _err
- }
- }
- return _err
- }
- // GenerateBizID 业务请求id,最大支持 64 位字符
- // (注意 可以使用该字段做业务启动数字人的幂等,服务端确保同一个 bizId 多次调用只会开启一路实例)
- // 鉴于以上原因这里确保每个用户只启动一个实例
- func GenerateBizID(userId uint64) string {
- return jwt.HashidsEncode(int(userId))
- }
- // GetAccessKeyId 获取AccessKeyId
- func GetAccessKeyId() string {
- return "LTAI5tET2mMQVTcMDftuM8Cp"
- }
- // GetAccessKeySecret 获取AccessKeySecret
- func GetAccessKeySecret() string {
- return "AmGsD8VzwEuj8njZpUCUYnK7uUBTJa"
- }
- // GetAppId 获取AppId
- func GetAppId() string {
- return "3dt553bl52"
- }
- // GetTenantId 租户ID
- func GetTenantId() int64 {
- return int64(27174)
- }
- //func main() {
- // err := _main(tea.StringSlice(os.Args[1:]))
- // if err != nil {
- // panic(err)
- // }
- //}
|