import { Hono } from "hono"; import type { Variables, WithAuth } from "./middlewares.ts"; import querystring from "node:querystring"; import crypto from "node:crypto"; import { Buffer } from "node:buffer"; function generateVodSignature(secret_id: string, secret_key: string) { // 确定 app 的云 API 密钥 // var secret_id = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // var secret_key = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; // 确定签名的当前时间和失效时间 const current = parseInt(((new Date()).getTime() / 1000).toString()); const expired = current + 86400; // 签名有效期:1天 // 向参数列表填入参数 const arg_list = { secretId: secret_id, currentTimeStamp: current, expireTime: expired, random: Math.round(Math.random() * Math.pow(2, 32)), }; // 计算签名 const orignal = querystring.stringify(arg_list); const orignal_buffer = Buffer.from(orignal, "utf8"); const hmac = crypto.createHmac("sha1", secret_key); const hmac_buffer = hmac.update(orignal_buffer).digest(); const signature = Buffer.concat([hmac_buffer, orignal_buffer]).toString( "base64", ); return signature; } export function createVodRoutes(withAuth: WithAuth) { const vodRoutes = new Hono<{ Variables: Variables }>(); // VOD签名生成 vodRoutes.get("/signature", withAuth, async (c) => { try { const secretId = Deno.env.get("VOD_SECRET_ID"); const secretKey = Deno.env.get("VOD_SECRET_KEY"); if (!secretId || !secretKey) { throw new Error("缺少VOD密钥配置"); } const signature = generateVodSignature(secretId, secretKey); return c.json({ signature, }); } catch (error) { console.error("VOD签名生成错误:", error); return c.json({ error: "签名生成失败", }, 500); } }); return vodRoutes; }