unity 接入火山引擎API,包括即梦AI

部署运行你感兴趣的模型镜像

风格化图生图

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Security.Cryptography;
using System.Text;
using UnityEngine.Networking;
using Newtonsoft.Json;

//
[Serializable]
public class AlgorithmBaseResp
{
    public int status_code;
    public string status_message;
}
[Serializable]
public class Data
{
    public AlgorithmBaseResp algorithm_base_resp;
    public List<string> binary_data_base64;
    public List<string> image_urls;
}
[Serializable]
public class Result
{
    public int code;
    public Data data;
    public string message;
    public string request_id;
    public int status;
    public string time_elapsed;
}


public class PicToPic : MonoBehaviour
{
    public Result result;

    private static readonly char[] HexDigits = "0123456789ABCDEF".ToCharArray();
    private string _region= "cn-north-1";
    private string _service= "cv";
    private string _schema;
    private string _host= "visual.volcengineapi.com";
    private string _path= "/";
    private string _ak = "替换你自己的Access Key ID";
    private string _sk= "替换你自己的Secret Access Key";

    public string req_key;
    public string sub_req_key;

    public Texture2D texture2D;
    public void SignMenthod(string region, string service, string schema, string host, string path, string ak, string sk)
    {
        _region = region;
        _service = service;
        _schema = schema;
        _host = host;
        _path = path;
        _ak = ak;
        _sk = sk;
    }
    [ContextMenu("StartUpload")]
    public void StartUpload()
    {
        ImgToImg(req_key, sub_req_key);
    }

    public void ImgToImg(string key, string value)
    {
        try
        {
            string filePath = Application.dataPath + "/chooseState/1.png";
           // string baseImage = ImageToBase64(filePath);
            string baseImage = T2dToBase64(texture2D); 

            // 火山官网密钥写入
            string AccessKeyID = _ak;
            string SecretAccessKey = _sk;
            // 请求域名
            string endpoint = "visual.volcengineapi.com";
            string path = "/"; // 路径,不包含 Query// 请求接口信息
            string service = "cv";
            string region = "cn-north-1";
            string schema = "https";
            SignMenthod(region, service, schema, endpoint, path, AccessKeyID, SecretAccessKey);
            // 参考接口文档Query参数
            string action = "CVProcess";
            string version = "2022-08-31";
            DateTime date = DateTime.UtcNow;


            // 参考接口文档Body参数
            var req = new Dictionary<string, object>
            {
                { "req_key", key},
                { "sub_req_key",value},
                { "binary_data_base64", new List<string> { baseImage } },
                { "return_url",true}
            };
            StopCoroutine("DoRequest2");
            StartCoroutine(DoRequest2("POST", new Dictionary<string, string>(), Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(req)), date, action, version));
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }


    //public string ImageToBase64(string filepath)
    //{
    //    using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(filepath))
    //    {
    //        MemoryStream ms = new MemoryStream();
    //        bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    //        byte[] arr = new byte[ms.Length];
    //        ms.Position = 0;
    //        ms.Read(arr, 0, (int)ms.Length);
    //        ms.Close();
    //        return Convert.ToBase64String(arr);
    //    }
    //}
    public string T2dToBase64(Texture2D texture2D)
    {
        // 将 Texture2D 编码成 PNG 或 JPG
        byte[] imageBytes = texture2D.EncodeToJPG(100); // 或使用 EncodeToJPG()

        // 转换为 Base64 字符串
        return Convert.ToBase64String(imageBytes);
    }

    public IEnumerator DoRequest2(string method, Dictionary<string, string> queryList, byte[] body,
                          DateTime date, string action, string version)
    {
        if (body == null)
        {
            body = new byte[0];
        }

        string xContentSha256 = HashSHA256(body);
        string xDate = date.ToString("yyyyMMddTHHmmssZ");
        string shortXDate = xDate.Substring(0, 8);
        string contentType = "application/json";
        string signHeader = "host;x-date;x-content-sha256;content-type";

        var realQueryList = new SortedDictionary<string, string>(queryList)
        {
            { "Action", action },
            { "Version", version }
        };

        var queryStringBuilder = new StringBuilder();
        foreach (var kvp in realQueryList)
        {
            queryStringBuilder.Append(UrlEncode(kvp.Key))
                              .Append("=")
                              .Append(UrlEncode(kvp.Value))
                              .Append("&");
        }

        queryStringBuilder.Length--; // Remove the last '&'

        string canonicalStringBuilder = $"{method}\n{_path}\n{queryStringBuilder}\n" +
                                        $"host:{_host}\n" +
                                        $"x-date:{xDate}\n" +
                                        $"x-content-sha256:{xContentSha256}\n" +
                                        $"content-type:{contentType}\n" +
                                        "\n" +
                                        $"{signHeader}\n" +
                                        $"{xContentSha256}";

        Debug.Log(canonicalStringBuilder);

        string hashCanonicalString = HashSHA256(Encoding.UTF8.GetBytes(canonicalStringBuilder));
        string credentialScope = $"{shortXDate}/{_region}/{_service}/request";
        string signString = $"HMAC-SHA256\n{xDate}\n{credentialScope}\n{hashCanonicalString}";

        byte[] signKey = GenSigningSecretKeyV4(_sk, shortXDate, _region, _service);
        string signature = BitConverter.ToString(HmacSHA256(signKey, signString)).Replace("-", "").ToLower();

        var url = $"{_schema}://{_host}{_path}?{queryStringBuilder}";
        url = "https://visual.volcengineapi.com?Action=CVProcess&Version=2022-08-31";

        using (UnityWebRequest webRequest = new UnityWebRequest(url, "POST"))
        {
            // 设置请求内容
            webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(body);
            webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
            webRequest.SetRequestHeader("Content-Type", "application/json");
            webRequest.SetRequestHeader("Host", _host);
            webRequest.SetRequestHeader("X-Date", xDate);
            webRequest.SetRequestHeader("X-Content-Sha256", xContentSha256);
            webRequest.SetRequestHeader("Authorization",
                $"HMAC-SHA256 Credential={_ak}/{credentialScope}, SignedHeaders={signHeader}, Signature={signature}");

            yield return webRequest.SendWebRequest();
            if (webRequest.result != UnityWebRequest.Result.ConnectionError || webRequest.result != UnityWebRequest.Result.ProtocolError)
            {
                try
                {
                    string responseText = webRequest.downloadHandler.text;

                    Debug.Log(responseText);
                    //print(responseText);
                    result = JsonConvert.DeserializeObject<Result>(responseText);
                    //Data.Binarycount = result.data.binary_data_base64;
                    //Base64ToSave(result.data.binary_data_base64[0], null);
                    //显示以及后续处理                 
                }
                catch (Exception ex)
                {
                    Debug.Log($"发送失败:{ex.Message}");
                }
            }
            else
            {
                //失败提示处理
            }
            webRequest.Dispose();

        }
    }


    //public void Base64ToSave(string base64, Action<Bitmap> action)
    //{
    //    try
    //    {
    //        string imgPath = $"{Application.dataPath}\\saveImg\\" + "XXX.png";
    //        string imgeName = DateTime.Now.ToString("hh_mm_ss") + ".png";
    //        byte[] bytes = Convert.FromBase64String(base64);
    //        using (MemoryStream mStream = new MemoryStream(bytes))
    //        {
    //            System.Drawing.Image mImage = System.Drawing.Image.FromStream(mStream);
    //            Bitmap bmp = new Bitmap(mImage);
    //            bmp.Save(imgPath, System.Drawing.Imaging.ImageFormat.Png);
    //            action((Bitmap)bmp.Clone());
    //            bmp.Dispose();
    //            mImage.Dispose();
    //        }
    //    }
    //    catch (Exception ex)
    //    {
    //        Debug.Log($"保存图片出现异常:{ex.Message}");
    //    }
    //}

    private string UrlEncode(string source)
    {
        if (string.IsNullOrEmpty(source))
        {
            return source;
        }

        var encoded = new StringBuilder(source.Length);
        foreach (var symbol in Encoding.UTF8.GetBytes(source))
        {
            if (symbol >= 97 && symbol <= 122 || symbol >= 65 && symbol <= 90 || symbol >= 48 && symbol <= 57 ||
                symbol == (byte)'-' || symbol == (byte)'_' || symbol == (byte)'.' || symbol == (byte)'~')
            {
                encoded.Append((char)symbol);
            }
            else if (symbol == 32)
            {
                encoded.Append("%20");
            }
            else
            {
                encoded.Append('%');
                encoded.Append(HexDigits[symbol >> 4]);
                encoded.Append(HexDigits[symbol & 15]);
            }
        }

        return encoded.ToString();
    }

    public static string HashSHA256(byte[] content)
    {
        using (SHA256 sha256 = SHA256.Create())
        {
            byte[] hash = sha256.ComputeHash(content);
            return BitConverter.ToString(hash).Replace("-", "").ToLower();
        }
    }

    public static byte[] HmacSHA256(byte[] key, string content)
    {
        using (HMACSHA256 hmac = new HMACSHA256(key))
        {
            return hmac.ComputeHash(Encoding.UTF8.GetBytes(content));
        }
    }

    private byte[] GenSigningSecretKeyV4(string secretKey, string date, string region, string service)
    {
        byte[] kDate = HmacSHA256(Encoding.UTF8.GetBytes(secretKey), date);
        byte[] kRegion = HmacSHA256(kDate, region);
        byte[] kService = HmacSHA256(kRegion, service);
        return HmacSHA256(kService, "request");
    }
}

即梦AI图生图

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Security.Cryptography;
using System.Text;
using UnityEngine.Networking;
using Newtonsoft.Json;


[Serializable]
public class JMData
{
    public List<string> PreviewImage_121;
    public AlgorithmBaseResp algorithm_base_resp;
    public List<object> binary_data_base64;
    public double comfyui_cost;
    public List<string> image_urls;
}
[Serializable]
public class JMResult
{
    public int code;
    public JMData data;
    public string message;
    public string request_id;
    public int status;
    public string time_elapsed;
}


public class JMAI : MonoBehaviour
{
    public JMResult result;

    private static readonly char[] HexDigits = "0123456789ABCDEF".ToCharArray();
    private string _region = "cn-north-1";
    private string _service = "cv";
    private string _schema;
    private string _host = "visual.volcengineapi.com";
    private string _path = "/";
    private string _ak = "替换你自己的Access Key ID";
    private string _sk= "替换你自己的Secret Access Key";

    public string prompt;

    public Texture2D texture2D;
    public void SignMenthod(string region, string service, string schema, string host, string path, string ak, string sk)
    {
        _region = region;
        _service = service;
        _schema = schema;
        _host = host;
        _path = path;
        _ak = ak;
        _sk = sk;
    }
    [ContextMenu("StartUpload")]
    public void StartUpload()
    {
        ImgToImg(prompt);
    }

    public void ImgToImg(string prompt)
    {
        try
        {
            string filePath = Application.dataPath + "/chooseState/1.png";
            // string baseImage = ImageToBase64(filePath);
            string baseImage = T2dToBase64(texture2D);

            // 火山官网密钥写入
            string AccessKeyID = _ak;
            string SecretAccessKey = _sk;
            // 请求域名
            string endpoint = "visual.volcengineapi.com";
            string path = "/"; // 路径,不包含 Query// 请求接口信息
            string service = "cv";
            string region = "cn-north-1";
            string schema = "https";
            SignMenthod(region, service, schema, endpoint, path, AccessKeyID, SecretAccessKey);
            // 参考接口文档Query参数
            string action = "CVProcess";
            string version = "2022-08-31";
            DateTime date = DateTime.UtcNow;


            // 参考接口文档Body参数
            var req = new Dictionary<string, object>
            {
                { "req_key", "jimeng_i2i_v30"},
                { "prompt",prompt},
                { "binary_data_base64", new List<string> { baseImage } },
                { "return_url",true}
            };
            StopCoroutine("DoRequest2");
            StartCoroutine(DoRequest2("POST", new Dictionary<string, string>(), Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(req)), date, action, version));
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }


    //public string ImageToBase64(string filepath)
    //{
    //    using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(filepath))
    //    {
    //        MemoryStream ms = new MemoryStream();
    //        bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    //        byte[] arr = new byte[ms.Length];
    //        ms.Position = 0;
    //        ms.Read(arr, 0, (int)ms.Length);
    //        ms.Close();
    //        return Convert.ToBase64String(arr);
    //    }
    //}
    public string T2dToBase64(Texture2D texture2D)
    {
        // 将 Texture2D 编码成 PNG 或 JPG
        byte[] imageBytes = texture2D.EncodeToJPG(100); // 或使用 EncodeToJPG()

        // 转换为 Base64 字符串
        return Convert.ToBase64String(imageBytes);
    }

    public IEnumerator DoRequest2(string method, Dictionary<string, string> queryList, byte[] body,
                          DateTime date, string action, string version)
    {
        if (body == null)
        {
            body = new byte[0];
        }

        string xContentSha256 = HashSHA256(body);
        string xDate = date.ToString("yyyyMMddTHHmmssZ");
        string shortXDate = xDate.Substring(0, 8);
        string contentType = "application/json";
        string signHeader = "host;x-date;x-content-sha256;content-type";

        var realQueryList = new SortedDictionary<string, string>(queryList)
        {
            { "Action", action },
            { "Version", version }
        };

        var queryStringBuilder = new StringBuilder();
        foreach (var kvp in realQueryList)
        {
            queryStringBuilder.Append(UrlEncode(kvp.Key))
                              .Append("=")
                              .Append(UrlEncode(kvp.Value))
                              .Append("&");
        }

        queryStringBuilder.Length--; // Remove the last '&'

        string canonicalStringBuilder = $"{method}\n{_path}\n{queryStringBuilder}\n" +
                                        $"host:{_host}\n" +
                                        $"x-date:{xDate}\n" +
                                        $"x-content-sha256:{xContentSha256}\n" +
                                        $"content-type:{contentType}\n" +
                                        "\n" +
                                        $"{signHeader}\n" +
                                        $"{xContentSha256}";

        Debug.Log(canonicalStringBuilder);

        string hashCanonicalString = HashSHA256(Encoding.UTF8.GetBytes(canonicalStringBuilder));
        string credentialScope = $"{shortXDate}/{_region}/{_service}/request";
        string signString = $"HMAC-SHA256\n{xDate}\n{credentialScope}\n{hashCanonicalString}";

        byte[] signKey = GenSigningSecretKeyV4(_sk, shortXDate, _region, _service);
        string signature = BitConverter.ToString(HmacSHA256(signKey, signString)).Replace("-", "").ToLower();

        var url = $"{_schema}://{_host}{_path}?{queryStringBuilder}";
        url = "https://visual.volcengineapi.com?Action=CVProcess&Version=2022-08-31";

        using (UnityWebRequest webRequest = new UnityWebRequest(url, "POST"))
        {
            // 设置请求内容
            webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(body);
            webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
            webRequest.SetRequestHeader("Content-Type", "application/json");
            webRequest.SetRequestHeader("Host", _host);
            webRequest.SetRequestHeader("X-Date", xDate);
            webRequest.SetRequestHeader("X-Content-Sha256", xContentSha256);
            webRequest.SetRequestHeader("Authorization",
                $"HMAC-SHA256 Credential={_ak}/{credentialScope}, SignedHeaders={signHeader}, Signature={signature}");

            yield return webRequest.SendWebRequest();
            if (webRequest.result != UnityWebRequest.Result.ConnectionError || webRequest.result != UnityWebRequest.Result.ProtocolError)
            {
                try
                {
                    string responseText = webRequest.downloadHandler.text;

                    Debug.Log(responseText);
                    //print(responseText);
                    result = JsonConvert.DeserializeObject<JMResult>(responseText);
                    //Data.Binarycount = result.data.binary_data_base64;
                    //Base64ToSave(result.data.binary_data_base64[0], null);
                    //显示以及后续处理                 
                }
                catch (Exception ex)
                {
                    Debug.Log($"发送失败:{ex.Message}");
                }
            }
            else
            {
                //失败提示处理
            }
            webRequest.Dispose();

        }
    }


    //public void Base64ToSave(string base64, Action<Bitmap> action)
    //{
    //    try
    //    {
    //        string imgPath = $"{Application.dataPath}\\saveImg\\" + "XXX.png";
    //        string imgeName = DateTime.Now.ToString("hh_mm_ss") + ".png";
    //        byte[] bytes = Convert.FromBase64String(base64);
    //        using (MemoryStream mStream = new MemoryStream(bytes))
    //        {
    //            System.Drawing.Image mImage = System.Drawing.Image.FromStream(mStream);
    //            Bitmap bmp = new Bitmap(mImage);
    //            bmp.Save(imgPath, System.Drawing.Imaging.ImageFormat.Png);
    //            action((Bitmap)bmp.Clone());
    //            bmp.Dispose();
    //            mImage.Dispose();
    //        }
    //    }
    //    catch (Exception ex)
    //    {
    //        Debug.Log($"保存图片出现异常:{ex.Message}");
    //    }
    //}

    private string UrlEncode(string source)
    {
        if (string.IsNullOrEmpty(source))
        {
            return source;
        }

        var encoded = new StringBuilder(source.Length);
        foreach (var symbol in Encoding.UTF8.GetBytes(source))
        {
            if (symbol >= 97 && symbol <= 122 || symbol >= 65 && symbol <= 90 || symbol >= 48 && symbol <= 57 ||
                symbol == (byte)'-' || symbol == (byte)'_' || symbol == (byte)'.' || symbol == (byte)'~')
            {
                encoded.Append((char)symbol);
            }
            else if (symbol == 32)
            {
                encoded.Append("%20");
            }
            else
            {
                encoded.Append('%');
                encoded.Append(HexDigits[symbol >> 4]);
                encoded.Append(HexDigits[symbol & 15]);
            }
        }

        return encoded.ToString();
    }

    public static string HashSHA256(byte[] content)
    {
        using (SHA256 sha256 = SHA256.Create())
        {
            byte[] hash = sha256.ComputeHash(content);
            return BitConverter.ToString(hash).Replace("-", "").ToLower();
        }
    }

    public static byte[] HmacSHA256(byte[] key, string content)
    {
        using (HMACSHA256 hmac = new HMACSHA256(key))
        {
            return hmac.ComputeHash(Encoding.UTF8.GetBytes(content));
        }
    }

    private byte[] GenSigningSecretKeyV4(string secretKey, string date, string region, string service)
    {
        byte[] kDate = HmacSHA256(Encoding.UTF8.GetBytes(secretKey), date);
        byte[] kRegion = HmacSHA256(kDate, region);
        byte[] kService = HmacSHA256(kRegion, service);
        return HmacSHA256(kService, "request");
    }
}

即梦图生视频

using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
[Serializable]
public class JMVideoData
{
    public List<object> binary_data_base64 ;
    public object image_urls ;
    public string resp_data ;
    public string status ;
    public string video_url ;
}
[Serializable]
public class JMVideoResult
{
    public int code ;
    public JMVideoData data ;
    public string message ;
    public string request_id ;
    public int status ;
    public string time_elapsed ;
}
public class JMVideo : MonoBehaviour
{
    public JMVideoResult result;

    private static readonly char[] HexDigits = "0123456789ABCDEF".ToCharArray();
    private string _region = "cn-north-1";
    private string _service = "cv";
    private string _schema;
    private string _host = "visual.volcengineapi.com";
    private string _path = "/";
    private string _ak = "替换你自己的Access Key ID";
    private string _sk= "替换你自己的Secret Access Key";

    public string prompt;

    public Texture2D texture2D;

    public string taskId;

    public void SignMenthod(string region, string service, string schema, string host, string path, string ak, string sk)
    {
        _region = region;
        _service = service;
        _schema = schema;
        _host = host;
        _path = path;
        _ak = ak;
        _sk = sk;
    }
    [ContextMenu("StartUpload")]
    public void StartUpload()
    {
        ImgToImg(prompt);
    }
    [ContextMenu("CheckTask")]
    public void CheckTask()
    {
        try
        {
            // 火山官网密钥写入
            string AccessKeyID = _ak;
            string SecretAccessKey = _sk;
            // 请求域名
            string endpoint = "visual.volcengineapi.com";
            string path = "/"; // 路径,不包含 Query// 请求接口信息
            string service = "cv";
            string region = "cn-north-1";
            string schema = "https";
            SignMenthod(region, service, schema, endpoint, path, AccessKeyID, SecretAccessKey);
            // 参考接口文档Query参数
            string action = "CVSync2AsyncGetResult";
            string version = "2022-08-31";
            DateTime date = DateTime.UtcNow;


            // 参考接口文档Body参数
            var req = new Dictionary<string, object>
            {
                { "req_key", "jimeng_vgfm_i2v_l20"},
                { "task_id",taskId}
            };
            StopCoroutine("DoRequest2");
            StartCoroutine(DoRequest2("POST", new Dictionary<string, string>(), Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(req)), date, action, version));
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }


    public void ImgToImg(string prompt)
    {
        try
        {
            //string filePath = Application.dataPath + "/chooseState/1.png";
            // string baseImage = ImageToBase64(filePath);
            string baseImage = T2dToBase64(texture2D);

            // 火山官网密钥写入
            string AccessKeyID = _ak;
            string SecretAccessKey = _sk;
            // 请求域名
            string endpoint = "visual.volcengineapi.com";
            string path = "/"; // 路径,不包含 Query// 请求接口信息
            string service = "cv";
            string region = "cn-north-1";
            string schema = "https";
            SignMenthod(region, service, schema, endpoint, path, AccessKeyID, SecretAccessKey);
            // 参考接口文档Query参数
            string action = "CVSync2AsyncSubmitTask";
            string version = "2022-08-31";
            DateTime date = DateTime.UtcNow;


            // 参考接口文档Body参数
            var req = new Dictionary<string, object>
            {
                { "req_key", "jimeng_vgfm_i2v_l20"},
                { "prompt",prompt},
                { "binary_data_base64", new List<string> { baseImage } },
                { "aspect_ratio","16:9"}
            };
            StopCoroutine("DoRequest2");
            StartCoroutine(DoRequest2("POST", new Dictionary<string, string>(), Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(req)), date, action, version));
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }


    //public string ImageToBase64(string filepath)
    //{
    //    using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(filepath))
    //    {
    //        MemoryStream ms = new MemoryStream();
    //        bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    //        byte[] arr = new byte[ms.Length];
    //        ms.Position = 0;
    //        ms.Read(arr, 0, (int)ms.Length);
    //        ms.Close();
    //        return Convert.ToBase64String(arr);
    //    }
    //}
    public string T2dToBase64(Texture2D texture2D)
    {
        // 将 Texture2D 编码成 PNG 或 JPG
        byte[] imageBytes = texture2D.EncodeToJPG(100); // 或使用 EncodeToJPG()

        // 转换为 Base64 字符串
        return Convert.ToBase64String(imageBytes);
    }

    public IEnumerator DoRequest2(string method, Dictionary<string, string> queryList, byte[] body,
                          DateTime date, string action, string version)
    {
        if (body == null)
        {
            body = new byte[0];
        }

        string xContentSha256 = HashSHA256(body);
        string xDate = date.ToString("yyyyMMddTHHmmssZ");
        string shortXDate = xDate.Substring(0, 8);
        string contentType = "application/json";
        string signHeader = "host;x-date;x-content-sha256;content-type";

        var realQueryList = new SortedDictionary<string, string>(queryList)
        {
            { "Action", action },
            { "Version", version }
        };

        var queryStringBuilder = new StringBuilder();
        foreach (var kvp in realQueryList)
        {
            queryStringBuilder.Append(UrlEncode(kvp.Key))
                              .Append("=")
                              .Append(UrlEncode(kvp.Value))
                              .Append("&");
        }

        queryStringBuilder.Length--; // Remove the last '&'

        string canonicalStringBuilder = $"{method}\n{_path}\n{queryStringBuilder}\n" +
                                        $"host:{_host}\n" +
                                        $"x-date:{xDate}\n" +
                                        $"x-content-sha256:{xContentSha256}\n" +
                                        $"content-type:{contentType}\n" +
                                        "\n" +
                                        $"{signHeader}\n" +
                                        $"{xContentSha256}";

        Debug.Log(canonicalStringBuilder);

        string hashCanonicalString = HashSHA256(Encoding.UTF8.GetBytes(canonicalStringBuilder));
        string credentialScope = $"{shortXDate}/{_region}/{_service}/request";
        string signString = $"HMAC-SHA256\n{xDate}\n{credentialScope}\n{hashCanonicalString}";

        byte[] signKey = GenSigningSecretKeyV4(_sk, shortXDate, _region, _service);
        string signature = BitConverter.ToString(HmacSHA256(signKey, signString)).Replace("-", "").ToLower();

        var url = $"{_schema}://{_host}{_path}?{queryStringBuilder}";
        url = "https://visual.volcengineapi.com?Action="+action+"&Version=2022-08-31";

        using (UnityWebRequest webRequest = new UnityWebRequest(url, "POST"))
        {
            // 设置请求内容
            webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(body);
            webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
            webRequest.SetRequestHeader("Content-Type", "application/json");
            webRequest.SetRequestHeader("Host", _host);
            webRequest.SetRequestHeader("X-Date", xDate);
            webRequest.SetRequestHeader("X-Content-Sha256", xContentSha256);
            webRequest.SetRequestHeader("Authorization",
                $"HMAC-SHA256 Credential={_ak}/{credentialScope}, SignedHeaders={signHeader}, Signature={signature}");

            yield return webRequest.SendWebRequest();
            if (webRequest.result != UnityWebRequest.Result.ConnectionError || webRequest.result != UnityWebRequest.Result.ProtocolError)
            {
                try
                {
                    string responseText = webRequest.downloadHandler.text;

                    Debug.Log(responseText);
                  
                   // result = JsonConvert.DeserializeObject<JMVideoResult>(responseText);
                               
                }
                catch (Exception ex)
                {
                    Debug.Log($"发送失败:{ex.Message}");
                }
            }
            else
            {
                //失败提示处理
            }
            webRequest.Dispose();

        }
    }

  
    //public void Base64ToSave(string base64, Action<Bitmap> action)
    //{
    //    try
    //    {
    //        string imgPath = $"{Application.dataPath}\\saveImg\\" + "XXX.png";
    //        string imgeName = DateTime.Now.ToString("hh_mm_ss") + ".png";
    //        byte[] bytes = Convert.FromBase64String(base64);
    //        using (MemoryStream mStream = new MemoryStream(bytes))
    //        {
    //            System.Drawing.Image mImage = System.Drawing.Image.FromStream(mStream);
    //            Bitmap bmp = new Bitmap(mImage);
    //            bmp.Save(imgPath, System.Drawing.Imaging.ImageFormat.Png);
    //            action((Bitmap)bmp.Clone());
    //            bmp.Dispose();
    //            mImage.Dispose();
    //        }
    //    }
    //    catch (Exception ex)
    //    {
    //        Debug.Log($"保存图片出现异常:{ex.Message}");
    //    }
    //}

    private string UrlEncode(string source)
    {
        if (string.IsNullOrEmpty(source))
        {
            return source;
        }

        var encoded = new StringBuilder(source.Length);
        foreach (var symbol in Encoding.UTF8.GetBytes(source))
        {
            if (symbol >= 97 && symbol <= 122 || symbol >= 65 && symbol <= 90 || symbol >= 48 && symbol <= 57 ||
                symbol == (byte)'-' || symbol == (byte)'_' || symbol == (byte)'.' || symbol == (byte)'~')
            {
                encoded.Append((char)symbol);
            }
            else if (symbol == 32)
            {
                encoded.Append("%20");
            }
            else
            {
                encoded.Append('%');
                encoded.Append(HexDigits[symbol >> 4]);
                encoded.Append(HexDigits[symbol & 15]);
            }
        }

        return encoded.ToString();
    }

    public static string HashSHA256(byte[] content)
    {
        using (SHA256 sha256 = SHA256.Create())
        {
            byte[] hash = sha256.ComputeHash(content);
            return BitConverter.ToString(hash).Replace("-", "").ToLower();
        }
    }

    public static byte[] HmacSHA256(byte[] key, string content)
    {
        using (HMACSHA256 hmac = new HMACSHA256(key))
        {
            return hmac.ComputeHash(Encoding.UTF8.GetBytes(content));
        }
    }

    private byte[] GenSigningSecretKeyV4(string secretKey, string date, string region, string service)
    {
        byte[] kDate = HmacSHA256(Encoding.UTF8.GetBytes(secretKey), date);
        byte[] kRegion = HmacSHA256(kDate, region);
        byte[] kService = HmacSHA256(kRegion, service);
        return HmacSHA256(kService, "request");
    }
}

您可能感兴趣的与本文相关的镜像

Wan2.2-I2V-A14B

Wan2.2-I2V-A14B

图生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

<think>首先,用户的问题是:“请问OBS桶访问 使用AK SK 配置方法”。这涉及到使用Access Key(AK)和Secret Key(SK)来访问华为云的OBS桶。 从系统指令中,我需要: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 - 在回答中引用的段落末尾自然地添加引用标识。 - 生成相关问题。 - 对于数学表达式,使用$...$或$$...$$格式,但这里可能不涉及数学内容,所以可能不需要。 - 参考提供的引用内容。 提供的引用包括: - [^1]: 关于在Windows和Linux下使用ObsClient时内存溢出的问题。 - [^2]: 华为云创建访问密钥(AK和SK)的说明。 - [^3]: 一个Python代码示例,用于签名。 - [^4]: 华为云OBS桶授权登录链接。 用户意图是获取关于OBS桶访问使用AK和SK的配置方法。所以,我需要基于这些引用,提供一个清晰的步骤指南。 关键点: - AK和SK是用于身份验证的凭证。 - 引用[2]提到如何在华为云创建AK和SK。 - 引用[3]展示了一个签名示例,但用户可能不需要代码,除非他们问。 - 引用[1]和[4]提供了一些上下文。 回答结构: 1. **介绍**:简要解释AK和SK是什么,以及它们在OBS访问中的作用。 2. **步骤**:逐步说明如何配置AK和SK来访问OBS桶。 - 创建AK和SK(参考引用[2])。 - 使用AK和SK在代码中配置ObsClient(参考引用[1])。 - 可能涉及签名过程(参考引用[3])。 3. **代码示例**:提供一个简单的代码示例,展示如何初始化ObsClient。 4. **注意事项**:提到引用[1]中提到的内存溢出问题,以避免常见错误。 5. **结尾**:自然地添加引用标识。 6. **生成相关问题**:在最后添加相关问题。 由于用户指定了“配置方法”,我应该专注于配置步骤。 步骤大纲: 1. **创建AK和SK**:从华为云控制台创建访问密钥。 2. **配置环境**:确保AK、SK和Endpoint正确。 3. **代码实现**:在应用程序中使用ObsClient初始化。 4. **测试和验证**:运行代码并检查是否正常工作。 代码示例:使用Python或Java,因为引用[1]提到ObsClient,可能是Java或Python。 引用[1]中的代码是Java的:`ObsClient obs = new ObsClient(AK, SK, ENDPOINT);` 引用[3]是Python的签名示例。 我应该提供Java和Python的示例,以覆盖常见语言。 在回答中,引用标识: - 当提到创建AK和SK时,添加[^2]。 - 当提到ObsClient初始化时,添加[^1]。 - 当提到签名时,添加[^3]。 - 当提到OBS桶授权时,添加[^4]。 生成相关问题:基于主题,提出相关问题,如: 1. 如何管理多个AK/SK凭证? 2. OBS访问的安全最佳实践? 3. 如何处理内存溢出问题(如引用[1])? 4. OBS桶的其他访问方法? 确保回答真实可靠:基于提供的引用和一般知识。华为云文档是可靠的来源。 最终回答结构: - 标题:OBS桶访问使用AK和SK的配置方法 - 步骤说明 - 代码示例 - 注意事项 - 引用标识 - 相关问题</think>### OBS桶访问使用AK和SK的配置方法 华为云对象存储服务(OBS)通过访问密钥(AK和SK)提供安全的身份验证机制,用于管理或访问OBS桶。AK(Access Key ID)是公开标识,SK(Secret Access Key)是私密凭证,必须妥善保管。以下是基于华为云官方文档的逐步配置方法,确保真实可靠。整个过程分为创建密钥、配置环境和代码实现三个步骤。 #### 步骤1: 创建AK和SK 在华为云控制台生成AK和SK,这是访问OBS桶的基础凭证。操作步骤如下: 1. 登录华为云控制台([https://console.huaweicloud.com/](https://console.huaweicloud.com/))。 2. 导航到“我的凭证” > “访问密钥”,点击“新增访问密钥”。 3. 输入凭证名称(建议格式如“OBS-账号名”,便于管理多个密钥),然后下载或复制生成的AK和SK。 - 注意:SK仅在创建时显示一次,需立即保存,否则需重新生成[^2]。 4. 确保AK和SK权限已关联到目标OBS桶(通过“统一身份认证服务”授权桶访问策略)[^4]。 #### 步骤2: 配置环境 在使用AK和SK前,需在代码环境中设置以下参数: - **AK**:您的Access Key ID。 - **SK**:您的Secret Access Key。 - **ENDPOINT**:OBS桶的终端节点(Endpoint),格式为`https://obs.region-id.myhuaweicloud.com`(替换`region-id`为实际区域,如`cn-north-4`)。 - 确保开发环境依赖库正确安装(如Java需`esdk-obs-java`包,Python需`esdk-obs-python`包)。 注意事项: - 在Linux环境下,需检查内存管理(如JVM堆大小),避免因资源泄漏导致内存溢出(参考常见问题[^1])。 - AK/SK不应硬编码在代码中,建议使用环境变量或配置文件存储。 #### 步骤3: 代码实现 根据您的开发语言,初始化ObsClient以访问OBS桶。以下是Java和Python的示例代码: ##### Java示例 使用`ObsClient`类初始化,并执行简单操作(如列出桶内对象): ```java import com.obs.services.ObsClient; import com.obs.services.model.ObjectListing; public class OBSSample { public static void main(String[] args) { String ak = "您的AK"; // 替换为实际AK String sk = "您的SK"; // 替换为实际SK String endpoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 替换为实际Endpoint try (ObsClient obsClient = new ObsClient(ak, sk, endpoint)) { // 示例:列出默认桶内对象 ObjectListing objectListing = obsClient.listObjects("your-bucket-name"); System.out.println("Objects in bucket: " + objectListing.getObjects()); } catch (Exception e) { e.printStackTrace(); } } } ``` - **说明**:此代码在Windows和Linux均适用,但Linux需监控内存使用(如通过`-Xmx`参数限制JVM堆大小)[^1]。 ##### Python示例 使用`ObsClient`初始化,并生成请求签名(签名过程可简化访问): ```python from obs import ObsClient # 初始化ObsClient ak = '您的AK' # 替换为实际AK sk = '您的SK' # 替换为实际SK endpoint = 'https://obs.cn-north-4.myhuaweicloud.com' # 替换为实际Endpoint obs_client = ObsClient(access_key_id=ak, secret_access_key=sk, server=endpoint) # 示例:上传文件到OBS桶 resp = obs_client.putFile('your-bucket-name', 'object-key', 'local-file-path') if resp.status < 300: print("Upload successful!") else: print("Error:", resp.errorMessage) ``` - **签名说明**:对于复杂请求(如POST上传),需基于SK生成签名(参考签名算法[^3]),但ObsClient SDK已内置签名逻辑,通常无需手动处理。 #### 注意事项 - **安全最佳实践**:AK/SK应定期轮换,避免泄露。测试时使用临时凭证。 - **跨平台兼容性**:代码在Windows和Linux运行时,确保依赖库版本一致(如Java SDK在Linux需额外监控内存)[^1]。 - **错误处理**:常见错误包括无效Endpoint或SK泄露,可通过华为云日志服务排查。 - **参考文档**:更多详情见华为云OBS开发指南([https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_0401.html](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_0401.html))。 通过以上步骤,您可快速配置AK/SK访问OBS桶。如需进一步帮助,请提供具体语言或场景细节[^2][^4]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值