routes_vod.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { Hono } from "hono";
  2. import type { Variables, WithAuth } from "./middlewares.ts";
  3. import querystring from "node:querystring";
  4. import crypto from "node:crypto";
  5. import { Buffer } from "node:buffer";
  6. function generateVodSignature(secret_id: string, secret_key: string) {
  7. // 确定 app 的云 API 密钥
  8. // var secret_id = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
  9. // var secret_key = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
  10. // 确定签名的当前时间和失效时间
  11. const current = parseInt(((new Date()).getTime() / 1000).toString());
  12. const expired = current + 86400; // 签名有效期:1天
  13. // 向参数列表填入参数
  14. const arg_list = {
  15. secretId: secret_id,
  16. currentTimeStamp: current,
  17. expireTime: expired,
  18. random: Math.round(Math.random() * Math.pow(2, 32)),
  19. };
  20. // 计算签名
  21. const orignal = querystring.stringify(arg_list);
  22. const orignal_buffer = Buffer.from(orignal, "utf8");
  23. const hmac = crypto.createHmac("sha1", secret_key);
  24. const hmac_buffer = hmac.update(orignal_buffer).digest();
  25. const signature = Buffer.concat([hmac_buffer, orignal_buffer]).toString(
  26. "base64",
  27. );
  28. return signature;
  29. }
  30. export function createVodRoutes(withAuth: WithAuth) {
  31. const vodRoutes = new Hono<{ Variables: Variables }>();
  32. // VOD签名生成
  33. vodRoutes.get("/signature", withAuth, async (c) => {
  34. try {
  35. const secretId = Deno.env.get("VOD_SECRET_ID");
  36. const secretKey = Deno.env.get("VOD_SECRET_KEY");
  37. if (!secretId || !secretKey) {
  38. throw new Error("缺少VOD密钥配置");
  39. }
  40. const signature = generateVodSignature(secretId, secretKey);
  41. return c.json({
  42. signature,
  43. });
  44. } catch (error) {
  45. console.error("VOD签名生成错误:", error);
  46. return c.json({
  47. error: "签名生成失败",
  48. }, 500);
  49. }
  50. });
  51. return vodRoutes;
  52. }