RTCController.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # @Author : Rocky
  2. # @File : RTCController.py
  3. # @Time : 2025/3/14 8:49
  4. import random
  5. import time
  6. from hashlib import sha1
  7. import hmac
  8. import base64
  9. import binascii
  10. from optparse import OptionParser
  11. from django.views.generic.base import View
  12. from Model.models import Device_Info
  13. from Object.Enums.RTCEnum import RTCConfigEnum
  14. from Service.CommonService import CommonService
  15. class RTCView(View):
  16. def get(self, request, *args, **kwargs):
  17. request.encoding = 'utf-8'
  18. operation = kwargs.get('operation')
  19. return self.validation(request.GET, request, operation)
  20. def post(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. operation = kwargs.get('operation')
  23. return self.validation(request.POST, request, operation)
  24. def validation(self, request_dict, request, operation):
  25. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  26. if token_code != 0:
  27. return response.json(token_code)
  28. if operation == 'getToken': # 获取token
  29. return self.get_token(request_dict, response)
  30. @classmethod
  31. def get_token(cls, request_dict, response):
  32. """
  33. 获取token
  34. https://cloud.baidu.com/doc/RTC/s/Qjxbh7jpu#%E5%9C%A8appserver%E4%B8%8A%E9%83%A8%E7%BD%B2token%E7%94%9F%E6%88%90%E6%9C%8D%E5%8A%A1
  35. @param request_dict:
  36. @param response:
  37. @return: res
  38. """
  39. uid = request_dict.get('uid', None)
  40. if not uid:
  41. return response.json(444)
  42. try:
  43. # 查询主用户user id
  44. device_info_qs = Device_Info.objects.filter(UID=uid).values('vodPrimaryUserID')
  45. if not device_info_qs.exists():
  46. return response.json(173)
  47. pri_user_id = device_info_qs[0]['vodPrimaryUserID']
  48. # 签名
  49. now_time = int(time.time())
  50. expect_time = 999999999
  51. random_str = cls.generate_random_str()
  52. data = "ACS{}{}{}{}{}{}".format(RTCConfigEnum.AppID.value, now_time, random_str, uid, pri_user_id, expect_time)
  53. signature = hmac.new(RTCConfigEnum.AppKey.value, data, sha1).digest() # .encode('base64').rstrip()
  54. signature = binascii.b2a_hex(signature)
  55. token = '{}{}{}{}{}'.format('004', signature, now_time, random_str, expect_time)
  56. res = {
  57. 'token': token
  58. }
  59. return response.json(0, res)
  60. except Exception as e:
  61. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  62. @staticmethod
  63. def generate_random_str():
  64. # 生成一个随机整数
  65. random_int = random.randint(0, 2 ** 32 - 1) # 生成一个 0 到 2^32 - 1 的随机整数
  66. # 将整数转换为 16 进制字符串
  67. hex_string = hex(random_int)[2:] # 去掉前缀 '0x'
  68. # 补齐至 8 位
  69. random_str = hex_string.zfill(8)
  70. return random_str