repo_description: ✨ Light and Fast AI Assistant. Support: Web | iOS | MacOS | Android |  Linux | Windows
repo_topics: calclaude chatgpt claude cross-platform desktop fe gemini gemini-pro gemini-server gemini-ultra gpt-4o groq nextjs ollama react tauri tauri-app vercel webui
code: import { sign, hash as getHash, hex } from "./hmac";
  
  // 使用 SHA-256 和 secret 进行 HMAC 加密
  function sha256(message: any, secret: any, encoding?: string) {
    const result = sign(secret, message);
    return encoding == "hex" ? hex(result).toString() : result;
  }
  
  function getDate(timestamp: number) {
    const date = new Date(timestamp * 1000);
    const year = date.getUTCFullYear();
    const month = ("0" + (date.getUTCMonth() + 1)).slice(-2);
    const day = ("0" + date.getUTCDate()).slice(-2);
    return `${year}-${month}-${day}`;
  }
  
  export async function getHeader(
    payload: any,
    SECRET_ID: string,
    SECRET_KEY: string,
  ) {
    // https://cloud.tencent.com/document/api/1729/105701
  
    const endpoint = "hunyuan.tencentcloudapi.com";
    const service = "hunyuan";
    const region = ""; // optional
    const action = "ChatCompletions";
    const version = "2023-09-01";
    const timestamp = Math.floor(Date.now() / 1000);
    //时间处理, 获取世界时间日期
    const date = getDate(timestamp);
  
    // ************* 步骤 1：拼接规范请求串 *************
  
    const hashedRequestPayload = getHash(payload);
    const httpRequestMethod = "POST";
    const contentType = "application/json";
    const canonicalUri = "/";
    const canonicalQueryString = "";
    const canonicalHeaders =
      `content-type:${contentType}\n` +
      "host:" +
      endpoint +
      "\n" +
      "x-tc-action:" +
      action.toLowerCase() +
      "\n";
    const signedHeaders = "content-type;host;x-tc-action";
  
    const canonicalRequest = [
      httpRequestMethod,
      canonicalUri,
      canonicalQueryString,
      canonicalHeaders,
      signedHeaders,
      hashedRequestPayload,
    ].join("\n");
  
    // ************* 步骤 2：拼接待签名字符串 *************
    const algorithm = "TC3-HMAC-SHA256";
    const hashedCanonicalRequest = getHash(canonicalRequest);
    const credentialScope = date + "/" + service + "/" + "tc3_request";
    const stringToSign =
      algorithm +
      "\n" +
      timestamp +
      "\n" +
      credentialScope +
      "\n" +
      hashedCanonicalRequest;
  
    // ************* 步骤 3：计算签名 *************
    const kDate = sha256(date, "TC3" + SECRET_KEY);
    const kService = sha256(service, kDate);
    const kSigning = sha256("tc3_request", kService);
    const signature = sha256(stringToSign, kSigning, "hex");
  
    // ************* 步骤 4：拼接 Authorization *************
    const authorization =
      algorithm +
      " " +
      "Credential=" +
      SECRET_ID +
      "/" +
      credentialScope +
      ", " +
      "SignedHeaders=" +
      signedHeaders +
      ", " +
      "Signature=" +
      signature;
  
    return {
      Authorization: authorization,
      "Content-Type": contentType,
      Host: endpoint,
      "X-TC-Action": action,
      "X-TC-Timestamp": timestamp.toString(),
      "X-TC-Version": version,
      "X-TC-Region": region,
    };
  }
  