from datetime import datetime import requests from rest_framework import viewsets from rest_framework.decorators import action from rest_framework.response import Response from django.conf import settings from apps.jqr.models import JqrHookUser, JqrExternalQun, JqrSendnewusermsgrecord, JqrSendmsgrecordinfo, JqrExternalUser from apps.jqr.parsers import WechatContentParser from apps.jqr.renderers import WechatPublicContentRenderer from apps.jqr.serializers import WechatPublicTokenSerializer, WechatEncryptSerializer, HeartBeatSerializer, \ TbMessageModelSerializer from apps.qc.models import QcCorpinfo from utils.base_viewsets import BaseViewSet from utils.response import ApiResponse class WechatWorkerViewSet(viewsets.GenericViewSet): @action(methods=['GET'], detail=False, serializer_class=WechatPublicTokenSerializer, url_path=r'callback/(?P\w+)', ) def verify(self, request, path, *args, **kwargs): # if not settings.DEBUG: # params = request.query_params # # cbtest.xbtool.cn # url = f'https://46i859447w.yicp.fun/event/callback/{path}' # res = requests.get(url, params=params) # data = res.text # return Response(data=int(data)) [business, corpid, agentid, uid] = path.split('_') corp = QcCorpinfo.objects.get(corpid=corpid, agentid=agentid, uid=uid) context = self.get_serializer_context() context['corp'] = corp serializer = self.get_serializer(data=request.query_params, context=context) serializer.is_valid(raise_exception=True) enchostr = serializer.data.get('echostr') return Response(data=int(enchostr)) # return Response(data=enchostr) @verify.mapping.post def message(self, request, path, *args, **kwargs): # if not settings.DEBUG: # data = request.data # # cbtest.xbtool.cn # renderer = WechatPublicContentRenderer() # data = renderer.render(data) # url = f'https://46i859447w.yicp.fun/event/callback/{path}' # res = requests.post(url, data=data, headers={'Content-Type': 'text/xml'}) # return Response(data=res.json()) [business, corpid, agentid, uid] = path.split('_') corp = QcCorpinfo.objects.get(corpid=corpid, agentid=agentid, uid=uid) context = self.get_serializer_context() context['corp'] = corp serializer = WechatEncryptSerializer(data=request.data, context=context) serializer.is_valid(raise_exception=True) serializer.save() return Response(data=serializer.data) def get_parsers(self): if self.request.method == 'POST': return [WechatContentParser()] return super().get_parsers() def get_renderers(self): if self.request.method == 'POST': return [WechatPublicContentRenderer()] return super().get_renderers() class HookClientController(BaseViewSet): permission_classes = [] authentication_classes = [] serializer_class = { 'heartbeat': HeartBeatSerializer, 'pushmsg': TbMessageModelSerializer, } @action(methods=['post'], detail=False, url_path='client/heartbeat') def heartbeat(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return ApiResponse() @action(methods=['post'], detail=False, url_path='client/pushmsg') def pushmsg(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return ApiResponse() @action(methods=['get'], detail=False, url_path='usersend/getnonvid') def novide(self, request, *args, **kwargs): corpid = request.query_params.get('corpid') external_users = JqrExternalUser.objects.filter(vid__isnull=True, corpid=corpid).all().values('id', 'external_userid') quns = JqrExternalQun.objects.filter(vid__isnull=True, corpid=corpid).all().values('id', 'chat_id') return ApiResponse(data={ 'external_users': external_users, 'quns': quns, }) @action(methods=['post'], detail=False, url_path='usersend/setvid') def setvid(self, request, *args, **kwargs): data = request.data external_users = data.get('external_users', []) external_users = [JqrExternalUser(**external_user, utime=datetime.now()) for external_user in external_users] quns = data.get('quns', []) quns = [JqrExternalQun(**qun, utime=datetime.now()) for qun in quns] JqrExternalUser.objects.bulk_update(external_users, fields=['vid', 'utime']) JqrExternalQun.objects.bulk_update(quns, fields=['vid', 'utime']) return ApiResponse() @action(methods=['post'], detail=False, url_path='usersend/updatestatus') def updatestatus(self, request, *args, **kwargs): data = request.data sendnewusermsgrecord = data.get('sendnewusermsgrecord', []) sendnewusermsgrecord = [JqrSendnewusermsgrecord(**sendnewusermsgrecord, utime=datetime.now()) for sendnewusermsgrecord in sendnewusermsgrecord] JqrSendnewusermsgrecord.objects.bulk_update(sendnewusermsgrecord, fields=['sendstate', 'utime']) sendmsgrecordinfo = data.get('sendmsgrecordinfo', []) sendmsgrecordinfo = [JqrSendmsgrecordinfo(**sendmsgrecordinfo, utime=datetime.now()) for sendmsgrecordinfo in sendmsgrecordinfo] JqrSendmsgrecordinfo.objects.bulk_update(sendmsgrecordinfo, fields=['sendstate', 'utime']) return ApiResponse()