|
@@ -0,0 +1,175 @@
|
|
|
|
+package gen
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "bytes"
|
|
|
|
+ "encoding/json"
|
|
|
|
+ "errors"
|
|
|
|
+ "fmt"
|
|
|
|
+ "io"
|
|
|
|
+ "net/http"
|
|
|
|
+ "os"
|
|
|
|
+ "time"
|
|
|
|
+ "tryon/model"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+const (
|
|
|
|
+ API_URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/virtualmodel/generation/"
|
|
|
|
+ DASHSCOPE_API_KEY = "sk-36a7725c51be4ffe8d3374ea534014b6"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+type OutPutRes struct {
|
|
|
|
+ OutPut OutPut `json:"output"`
|
|
|
|
+ RequestId string `json:"request_id"`
|
|
|
|
+}
|
|
|
|
+type OutPut struct {
|
|
|
|
+ TaskStatus string `json:"task_status"`
|
|
|
|
+ TaskId string `json:"task_id"`
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func Generate(model string, shoes []string, scale float64) (string, error) {
|
|
|
|
+ fmt.Println(scale)
|
|
|
|
+ // 设置请求体
|
|
|
|
+ data := map[string]interface{}{
|
|
|
|
+ "model": "shoemodel-v1",
|
|
|
|
+ "input": map[string]interface{}{
|
|
|
|
+ "template_image_url": model,
|
|
|
|
+ "shoe_image_url": shoes,
|
|
|
|
+ "scale": scale,
|
|
|
|
+ },
|
|
|
|
+ "parameters": map[string]interface{}{
|
|
|
|
+ "n": 1,
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+ // 将请求体编码为 JSON
|
|
|
|
+ jsonData, err := json.Marshal(data)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return "", nil
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ req, err := http.NewRequest("POST", API_URL, bytes.NewBuffer(jsonData))
|
|
|
|
+ if err != nil {
|
|
|
|
+ return "", nil
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 设置请求头
|
|
|
|
+ req.Header.Set("X-DashScope-Async", "enable")
|
|
|
|
+ req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", DASHSCOPE_API_KEY))
|
|
|
|
+ req.Header.Set("Content-Type", "application/json")
|
|
|
|
+
|
|
|
|
+ // 发起 POST 请求
|
|
|
|
+ client := &http.Client{}
|
|
|
|
+ resp, err := client.Do(req)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return "", err
|
|
|
|
+ }
|
|
|
|
+ defer resp.Body.Close()
|
|
|
|
+
|
|
|
|
+ // 读取响应
|
|
|
|
+ body, err := io.ReadAll(resp.Body)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return "", err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ bodyObj := OutPutRes{}
|
|
|
|
+ err = json.Unmarshal(body, &bodyObj)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return "", err
|
|
|
|
+ }
|
|
|
|
+ fmt.Println(bodyObj)
|
|
|
|
+ return bodyObj.OutPut.TaskId, nil
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func GetReslut(taskId string, outPut string) (string, error) {
|
|
|
|
+ if len(taskId) == 0 {
|
|
|
|
+ return "", errors.New("taskId is empty")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 获取任务 ID
|
|
|
|
+ // taskID := "6488c66d-2a0c-4134-90bb-39ab957d6cdf"
|
|
|
|
+ returl := fmt.Sprintf("https://dashscope.aliyuncs.com/api/v1/tasks/%s", taskId)
|
|
|
|
+
|
|
|
|
+ // 创建 GET 请求
|
|
|
|
+ getReq, err := http.NewRequest("GET", returl, nil)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return "", err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 设置 GET 请求头
|
|
|
|
+ getReq.Header.Set("Authorization", fmt.Sprintf("Bearer %s", DASHSCOPE_API_KEY))
|
|
|
|
+
|
|
|
|
+ // 发起 GET 请求
|
|
|
|
+ client := &http.Client{}
|
|
|
|
+ getResp, err := client.Do(getReq)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return "", err
|
|
|
|
+ }
|
|
|
|
+ defer getResp.Body.Close()
|
|
|
|
+
|
|
|
|
+ // 读取响应
|
|
|
|
+ getBody, err := io.ReadAll(getResp.Body)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return "", err
|
|
|
|
+ }
|
|
|
|
+ bodyObj := model.Response{}
|
|
|
|
+ err = json.Unmarshal(getBody, &bodyObj)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return "", err
|
|
|
|
+ }
|
|
|
|
+ fmt.Println(bodyObj)
|
|
|
|
+ if bodyObj.Output.TaskStatus == "SUCCEEDED" {
|
|
|
|
+ // 下载到本地
|
|
|
|
+ return bodyObj.Output.Results[0].URL, nil
|
|
|
|
+ }
|
|
|
|
+ return bodyObj.Output.TaskStatus, errors.New("后台处理中。。。")
|
|
|
|
+
|
|
|
|
+ // {
|
|
|
|
+ // "request_id": "a052b714-29d5-92c0-b981-43dc027523db",
|
|
|
|
+ // "output": {
|
|
|
|
+ // "task_id": "5f6316e3-ef6c-4143-abb5-81ffefdbfcd0",
|
|
|
|
+ // "task_status": "SUCCEEDED",
|
|
|
|
+ // "submit_time": "2024-11-04 16:27:38.824",
|
|
|
|
+ // "scheduled_time": "2024-11-04 16:27:38.852",
|
|
|
|
+ // "end_time": "2024-11-04 16:27:54.092",
|
|
|
|
+ // "results": [
|
|
|
|
+ // {
|
|
|
|
+ // "url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/7d/08/20241104/18d9de26/2024-11-04/42b28ff3-8e67-44fa-805e-72cab9e204fc-1/res_img.png?Expires=1730795274&OSSAccessKeyId=LTAI5tQZd8AEcZX6KZV4G8qL&Signature=KlU2NsBfFKDcl9NwklzH1i2X8bk%3D"
|
|
|
|
+ // }
|
|
|
|
+ // ],
|
|
|
|
+ // "task_metrics": {
|
|
|
|
+ // "TOTAL": 1,
|
|
|
|
+ // "SUCCEEDED": 1,
|
|
|
|
+ // "FAILED": 0
|
|
|
|
+ // }
|
|
|
|
+ // },
|
|
|
|
+ // "usage": {
|
|
|
|
+ // "image_count": 1
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func Download(url string, outPut string) (string, error) {
|
|
|
|
+ // 创建 GET 请求
|
|
|
|
+ resp, err := http.Get(url)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return "", err
|
|
|
|
+ }
|
|
|
|
+ defer resp.Body.Close() // 确保在函数返回时关闭响应体
|
|
|
|
+
|
|
|
|
+ key := time.Now().Format("20060102_150405")
|
|
|
|
+ outPutFile := fmt.Sprintf("%s/%s.png", outPut, key)
|
|
|
|
+
|
|
|
|
+ out, err := os.Create(outPutFile)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return "", err
|
|
|
|
+ }
|
|
|
|
+ defer out.Close()
|
|
|
|
+
|
|
|
|
+ _, err = io.Copy(out, resp.Body)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return "", err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return outPutFile, nil
|
|
|
|
+
|
|
|
|
+}
|