#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved. @AUTHOR: ASJRD018 @NAME: azoauth @software: PyCharm @DATE: 2020/1/13 17:01 @Version: python3.6 @MODIFY DECORD:ansjer dev @file: index.py @Contact: chanjunkai@163.com """ import json import time import requests from django.views.generic import TemplateView from django.shortcuts import render_to_response from django.http import JsonResponse from object.ResObject import ResObject import subprocess # from gevent.pool import Pool from model.models import UserModel, UidRtspModel from object.tkObject import tkObject from service.CommonService import CommonService from object.RedisObject import RedisObject from azoauth.config import * class authView(TemplateView): def post(self, request, *args, **kwargs): request.encoding = 'utf-8' request_dict = json.loads(request.body.decode('utf-8')) return self.validate(request_dict) def get(self, request, *args, **kwargs): request.encoding = 'utf-8' request_dict = request.GET return self.validate(request_dict) def validate(self, request_dict): state = request_dict.get("state", '') client_id = request_dict.get("client_id", '') response_type = request_dict.get("response_type", '') scope = request_dict.get("scope", '') redirect_uri = request_dict.get("redirect_uri", '') context = { 'state': state, 'client_id': client_id, 'response_type': response_type, 'scope': scope, 'redirect_uri': redirect_uri } return render_to_response("login.html", context) # return render_template('./login.html', **context) class loginHandleView(TemplateView): def post(self, request, *args, **kwargs): request.encoding = 'utf-8' request_dict = json.loads(request.body.decode('utf-8')) return self.validate(request_dict) def get(self, request, *args, **kwargs): request.encoding = 'utf-8' request_dict = request.GET return self.validate(request_dict) def validate(self, request_dict): response = ResObject() user = request_dict.get("user", '') pwd = request_dict.get("pwd", '') state = request_dict.get("state", '') client_id = request_dict.get("client_id", '') response_type = request_dict.get("response_type", '') scope = request_dict.get("scope", '') redirect_uri = request_dict.get("redirect_uri", '') # 返回code print(user) print(pwd) auth_request_url = '{SERVER_PREFIX}/oalexa/auth'. \ format(SERVER_PREFIX=SERVER_PREFIX) print(auth_request_url) # auth_request_url = 'http://192.168.136.40:8077/oalexa/auth' requests_data = {'userName': user, 'userPwd': pwd} res = requests.post(url=auth_request_url, data=requests_data) print(res.json()) print(res.json()['result_code']) res_json = res.json() if res_json['result_code'] == 0: userID = res_json['result']['userID'] # uid_arr = res_json['result']['uid_arr'] nowTime = int(time.time()) user_qs = UserModel.objects.filter(userID=userID) if not user_qs.exists(): UserModel.objects.create( userID=userID, addTime=nowTime, updTime=nowTime) user_qs = UserModel.objects.filter(userID=userID) code = CommonService.encrypt_data(32) user_qs.update(code=code) redirect_uri = redirect_uri + '?code=' + code + '&state=' + state return response.json(0, res=redirect_uri) else: return response.json(10, res={'msg': 'error'}, extra={'msg': res_json['reason']}) class oa2TokenView(TemplateView): def post(self, request, *args, **kwargs): request.encoding = 'utf-8' # request_dict = json.loads(request.body.decode('utf-8')) request_dict = request.POST return self.validate(request_dict) def get(self, request, *args, **kwargs): request.encoding = 'utf-8' request_dict = request.GET return self.validate(request_dict) def validate(self, request_dict): # 增加对code和client_id的校验代码,返回access_token和refresh_token code = request_dict.get("code", None) client_id = request_dict.get("client_id", None) refresh_token = request_dict.get("refresh_token", None) from var_dump import var_dump var_dump(request_dict) print('refresh_token:') print(refresh_token) print('code:') print(code) print('client_id:') print(client_id) user_qs = UserModel.objects.filter(code=code) if not user_qs.exists(): user_qs = UserModel.objects.filter(refresh_token=refresh_token) if user_qs.exists(): access_token = CommonService.encrypt_data(randomlength=32) refresh_token = CommonService.encrypt_data(randomlength=32) is_update = user_qs.update(access_token=access_token, refresh_token=refresh_token) print(is_update) if is_update: res_json = { "access_token": access_token, "token_type": "bearer", "expires_in": 3600, "refresh_token": refresh_token } print(res_json) return JsonResponse(res_json) else: return JsonResponse({'msg': 'error'}) else: res_json = {'msg': 'code not exists'} print(res_json) return JsonResponse(res_json) # import threading def runSendRtspMsg_thread(UID, PWD, MSG): command = "./pushtool {UID} {PWD} {MSG} 1".format(UID=UID, PWD=PWD, MSG=MSG) print('command=>{command}'.format(command=command)) try: back = subprocess. \ Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE). \ communicate(timeout=10) except Exception as e: return False else: print("back0----", back[0].decode()) # 注意需要进行解码操作,默认输出的是字节 print("back1----", back[1].decode()) # back是一个元祖,可以通过元祖取值的方式获取结果 return True class oa2RtspStartView(TemplateView): def post(self, request, *args, **kwargs): request.encoding = 'utf-8' request_dict = request.POST # request_dict = json.loads(request.body.decode('utf-8')) return self.validate(request_dict) def get(self, request, *args, **kwargs): request.encoding = 'utf-8' request_dict = request.GET return self.validate(request_dict) def validate(self, request_dict): ''' VVDHCVBYDKFMJRWA111A ''' access_token = request_dict.get("access_token", '') st = request_dict.get("st", 0) id = request_dict.get("id", '') redisObj = RedisObject(db=9) key = '{UID}_rtsp_key'.format(UID=id) redis_data = redisObj.get_data(key=key) print(st) if redis_data and st == 0: print('select by redis data') # time.sleep(3) res_json = eval(redis_data) return JsonResponse(res_json, safe=False) if access_token == '6ovF9wiXm7su9YXO67PSOkrEPb2LIOf1': print('pass yes') user_qs = UserModel.objects.filter(userID='154483823297313800138000') else: user_qs = UserModel.objects.filter(access_token=access_token) if user_qs.exists(): print('select by mysql data') # userID = user_qs[0].userID ur_qs = UidRtspModel.objects.filter(uid=id).values('uid', 'nick', 'rtsp_url', 'password', 'region') # ur_qs = UidRtspModel.objects.filter(usermodel__userID=userID,uid=) UID = ur_qs[0]['uid'] region = ur_qs[0]['region'] PWD = ur_qs[0]['password'] stream_name = ur_qs[0]['rtsp_url'] nick = ur_qs[0]['nick'] RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA[region] MSG = '{RTSP_PREFIX}://{RESP_SERVER_DOMAIN}:{PORT_PREFIX}/{stream_name}'. \ format(RESP_SERVER_DOMAIN=RESP_SERVER_DOMAIN, stream_name=stream_name, PORT_PREFIX=PORT_PREFIX, RTSP_PREFIX=RTSP_PREFIX) # po = Pool(10) # po.apply_async(self.runSendRtspMsg, (UID, PWD, MSG)) print(UID) print(PWD) print(MSG) if int(st) == 1: send_flag = self.runSendStop(UID, PWD, MSG) if send_flag: return JsonResponse({'msg': 'stop yes', 'code': 0}) else: return JsonResponse({'msg': 'stop no', 'code': 0}) # threading.Thread(target=runSendRtspMsg_thread, args=(UID, PWD, MSG)).start() # send_flag = self.runReqRtspMsg(UID, PWD, MSG) send_flag = self.runSendRtspMsg(UID, PWD, MSG) rtsp_uri = '{RTSP_PREFIX}://{RESP_SERVER_DOMAIN}:443/{stream_name}'. \ format(RESP_SERVER_DOMAIN=RESP_SERVER_DOMAIN, stream_name=stream_name, RTSP_PREFIX=RTSP_PREFIX) res_json = { 'endpointId': id, 'manufacturerName': 'Axis', 'manufacturerId': 'axis-ACCC8E5E7513', 'modelName': 'P1425-LE', 'friendlyName': 'Camera {nick}'.format(nick=nick), 'description': 'Camera {nick}'.format(nick=nick), 'resolutions': [{'width': 1280, 'height': 720}], 'videoCodecs': ['H264'], # 'audioCodecs': ['ACC'], 'audioCodecs': ['G711'], 'protocols': ['RTSP'], 'authorizationTypes': ['NONE'], 'uri': rtsp_uri, 'msg': send_flag } # time.sleep(1.5) redisObj.set_data(key=key, val=str(res_json), expire=15) return JsonResponse(res_json, safe=False) else: return JsonResponse({'msg': 'wrong'}) def runReqRtspMsg(self, UID, PWD, MSG): request_url = 'http://localhost:5000/?UID={UID}&MSG={MSG}&CMD=1&PWD={PWD}'. \ format(UID=UID, PWD=PWD, MSG=MSG) res = requests.get(url=request_url) print(res) return True def runSendRtspMsg(self, UID, PWD, MSG): # return True command = "./pushtool {UID} {PWD} {MSG} 1".format(UID=UID, PWD=PWD, MSG=MSG) print('command=>{command}'.format(command=command)) try: back = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE). \ communicate(timeout=10) except Exception as e: return repr(e) else: print("back0----", back[0].decode()) # 注意需要进行解码操作,默认输出的是字节 print("back1----", back[1].decode()) # back是一个元祖,可以通过元祖取值的方式获取结果 return str(back[0].decode()) + str(back[1].decode()) return True def runSendStop(self, UID, PWD, MSG): command = "./pushtool {UID} {PWD} {MSG} 0".format(UID=UID, PWD=PWD, MSG=MSG) print('command=>{command}'.format(command=command)) try: back = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE). \ communicate(timeout=10) except Exception as e: return False else: print("back0----", back[0].decode()) # 注意需要进行解码操作,默认输出的是字节 print("back1----", back[1].decode()) # back是一个元祖,可以通过元祖取值的方式获取结果 return True class oa2DiscoveryDevice(TemplateView): def post(self, request, *args, **kwargs): request.encoding = 'utf-8' request_dict = request.POST return self.validate(request_dict) def get(self, request, *args, **kwargs): request.encoding = 'utf-8' request_dict = request.GET return self.validate(request_dict) def validate(self, request_dict): # 增加对code和client_id的校验代码,返回access_token和refresh_token access_token = request_dict.get("access_token", None) region = request_dict.get("region", 'cn') try: user_qs = UserModel.objects.get(access_token=access_token) except Exception as e: return JsonResponse({'res': '11'}) else: response = ResObject() userID = user_qs.userID auth_request_url = '{SERVER_PREFIX}/oalexa/discoveryuid'.format(SERVER_PREFIX=SERVER_PREFIX) requests_data = {'sid': 'admin', 'sst': 'admin', 'alexa_user_id': userID} res = requests.post(url=auth_request_url, data=requests_data) res_json = res.json() print(res_json) if res_json['result_code'] == 0: uid_arr = res_json['result']['uid_arr'] rtko = tkObject(rank=1) now_time = int(time.time()) user_qs.uid_rtsp.clear() res_json = [] uid_rtsp_id_list = [] for uid_a in uid_arr: uid = uid_a['uid'] if uid_a['region'] == 'CN': region = 'CN' else: region = 'EN' rtsp_url = rtko.encrypt(data=uid) try: uid_rtsp_qs = UidRtspModel.objects.get(uid=uid) except UidRtspModel.DoesNotExist: uid_rtsp_qs = UidRtspModel.objects.create(uid=uid_a['uid'], password=uid_a['password'], nick=uid_a['nick'], addTime=now_time, updTime=now_time, rtsp_url=rtsp_url, region=region) else: # if uid_rtsp_qs.password != uid_a['password']: uid_rtsp_qs.password = uid_a['password'] uid_rtsp_qs.nick = uid_a['nick'] uid_rtsp_qs.region = region uid_rtsp_qs.save() uid_rtsp_id_list.append(uid_rtsp_qs.id) RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA[region] rtsp_uri = '{RTSP_PREFIX}://{RESP_SERVER_DOMAIN}:443/{stream_name}'. \ format(RESP_SERVER_DOMAIN=RESP_SERVER_DOMAIN, stream_name=rtsp_url, RTSP_PREFIX=RTSP_PREFIX) ur_data = { 'endpointId': uid_a['uid'], 'manufacturerName': 'Axis', 'manufacturerId': 'axis-ACCC8E5E7513', 'modelName': 'P1425-LE', 'friendlyName': 'Camera {nick}'.format(nick=uid_a['nick']), 'description': 'Camera {nick}'.format(nick=uid_a['nick']), 'resolutions': [{'width': 1280, 'height': 720}], 'videoCodecs': ['H264'], 'audioCodecs': ['ACC'], 'protocols': ['RTSP'], 'authorizationTypes': ['NONE'], 'uri': rtsp_uri } res_json.append(ur_data) print(uid_rtsp_id_list) user_qs.uid_rtsp.add(*uid_rtsp_id_list) return JsonResponse(res_json, safe=False) else: return response.json(0, res={'msg': 'error'}) ''' [{"endpointId":1,"manufacturerName":"Axis","manufacturerId":"axis-ACCC8E5E7513","modelName":"P1425-LE","friendlyName":"Camera VVDHCV","description":"Camera VVDHCV","resolutions":[{"width":1280,"height":720}],"videoCodecs":["H264"],"audioCodecs":["ACC"],"protocols":["RTSP"],"authorizationTypes":["NONE"],"uri":"rtsp://rtsp.zositech.xyz:8554/WVZsWkVTRU5XUWxsRVMwWk5TbEpYUVRFeE1VRT1p"},{"endpointId":2,"manufacturerName":"Axis","manufacturerId":"axis-ACCC8E5E7513","modelName":"P1425-LE","friendlyName":"Camera 5N6ZW8","description":"Camera 5N6ZW8","resolutions":[{"width":1280,"height":720}],"videoCodecs":["H264"],"audioCodecs":["ACC"],"protocols":["RTSP"],"authorizationTypes":["NONE"],"uri":"rtsp://rtsp.zositech.xyz:8554/Rk5VNDJXbGM0TnpSSE5rRXpOMWMwTmpFeE1VRT1D"},{"endpointId":3,"manufacturerName":"Axis","manufacturerId":"axis-ACCC8E5E7513","modelName":"P1425-LE","friendlyName":"Camera T3SLCA","description":"Camera T3SLCA","resolutions":[{"width":1280,"height":720}],"videoCodecs":["H264"],"audioCodecs":["ACC"],"protocols":["RTSP"],"authorizationTypes":["NONE"],"uri":"rtsp://rtsp.zositech.xyz:8554/b1ZETlRURU5CU0VvNVVERktTRmxDTkRFeE1VRT1X"}] '''