| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 | import timefrom Ansjer.config import LOGGERfrom django.http import HttpResponsefrom django.utils.decorators import method_decoratorfrom django.views import Viewfrom django.views.decorators.csrf import csrf_exemptfrom Model.models import CountryModel, RegionModel, P2PIpModel, DeviceDomainModel, DeviceDomainRegionModel, IPAddrfrom Object.ResponseObject import ResponseObjectfrom Service.CommonService import CommonServicefrom Object.IPWeatherObject import IPQueryclass ConfirmRegion(View):    # 设备根据ip获取域名    @method_decorator(csrf_exempt)    def dispatch(self, *args, **kwargs):        return super(ConfirmRegion, self).dispatch(*args, **kwargs)    @staticmethod    def get(request, *args, **kwargs):        response = ResponseObject()        request.encoding = 'utf-8'        try:            ip = CommonService.get_ip_address(request)            device_domain_qs = DeviceDomainModel.objects.filter(ip=ip)            # 获取国家编码            ip_addr_qs = IPAddr.objects.filter(ip=ip, is_geoip2=False).values('country_code', 'region')            if ip_addr_qs.exists():                country_code = ip_addr_qs[0]['country_code']                region = ip_addr_qs[0]['region']            else:                ip_qs = IPQuery(ip)                country_code = ip_qs.country_id                region = ip_qs.region            if country_code:                # 港澳台返回美洲域名                if country_code == 'CN' and region in ['香港', '澳门', '台湾']:                    api, push_api, region_id, push_region = get_default_api()                else:                    country_qs = CountryModel.objects.filter(country_code=country_code).\                        values('region__api', 'region__push_api')                    if country_qs.exists():                        api = country_qs[0]['region__api']                        push_api = country_qs[0]['region__push_api']                        if not device_domain_qs.exists():                            DeviceDomainModel.objects.create(ip=ip, country_name=country_code, api=api)                    else:                        api, push_api, region_id, push_region = get_default_api()                    push_region = get_push_region(api)                    res = {                        'request_api_url': api,                        'push_api_url': push_api,                        'push_region': push_region                    }                    return response.json(0, res)            # 不存在则返回美洲域名            api, push_api, region_id, push_region = get_default_api()            if not device_domain_qs.exists():                DeviceDomainModel.objects.create(ip=ip, country_name='NA', api=api)            res = {                'request_api_url': api,                'push_api_url': push_api,                'push_region': push_region            }            return response.json(0, res)        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))class ConfirmRegionV2(View):    # 设备根据ip获取域名V2接口    @method_decorator(csrf_exempt)    def dispatch(self, *args, **kwargs):        return super(ConfirmRegionV2, self).dispatch(*args, **kwargs)    @staticmethod    def get(request, *args, **kwargs):        response = ResponseObject()        # 获取ip        request.encoding = 'utf-8'        ip = CommonService.get_ip_address(request)        serial_number = request.GET.get('serial_number', None)        if not serial_number:            return response.json(444)        try:            data_dict = {'ip': ip}            device_domain_region_qs = DeviceDomainRegionModel.objects.filter(serial_number=serial_number)            # 获取国家编码            ip_addr_qs = IPAddr.objects.filter(ip=ip, is_geoip2=False).values('country_code', 'region')            if ip_addr_qs.exists():                country_code = ip_addr_qs[0]['country_code']                region = ip_addr_qs[0]['region']            else:                ip_qs = IPQuery(ip)                country_code = ip_qs.country_id                region = ip_qs.region            if country_code:                data_dict['country_code'] = country_code                # 港澳台返回美洲域名                if country_code == 'CN' and region in ['香港', '澳门', '台湾']:                    api, push_api, region_id, push_region = get_default_api()                else:                    country_qs = CountryModel.objects.filter(country_code=country_code).\                        values('region__api', 'region__push_api', 'region__id')                    if country_qs.exists():                        api = country_qs[0]['region__api']                        push_api = country_qs[0]['region__push_api']                        region_id = country_qs[0]['region__id']                        push_region = get_push_region(api)                    else:                        # 返回美洲域名                        data_dict['country_code'] = 'N/A'                        api, push_api, region_id, push_region = get_default_api()            else:                # 返回美洲域名                data_dict['country_code'] = 'N/A'                api, push_api, region_id, push_region = get_default_api()            # 更新或创建设备域名数据            data_dict['region_id'] = region_id            if device_domain_region_qs.exists():                device_domain_region_qs.update(**data_dict)            else:                data_dict['serial_number'] = serial_number                device_domain_region_qs.create(**data_dict)            LOGGER.info('获取域名V2接口信息:{},{}'.format(serial_number, data_dict))            # 响应数据            res = {                'request_api_url': api,                'push_api_url': push_api,                'region_id': region_id,                'push_region': push_region            }            return response.json(0, res)        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))def get_default_api():    # 获取默认域名(美洲服域名)    region_qs = RegionModel.objects.filter(continent_code='NA').values('api', 'push_api', 'id')    api = region_qs[0]['api']    push_api = region_qs[0]['push_api']    region_id = region_qs[0]['id']    push_region = 1  # 推送图片S3存储地区,1:国外, 2:国内    return api, push_api, region_id, push_regiondef get_push_region(api):    """    根据域名获取推送图片S3存储地区    @param api:    @return: push_region    """    push_region = 2 if '.cn' in api else 1    return push_regionclass Device_Region(object):    def get_device_region(self, ip):        ipInfo = CommonService.getIpIpInfo(ip, "CN")        # 暂时测试国外        if ipInfo['country_code']:            device_request_url = CountryModel.objects.filter(country_code=ipInfo['country_code']).\                values("region__api", "region__id")            if device_request_url.exists():                return device_request_url[0]['region__id']        # 不存在默认返回美洲地区api        api = RegionModel.objects.filter(continent_code='NA').values("id")        return api[0]['id']# 根据p2p的ip统计设备所在地区class StatisticsIpRegion(View):    @method_decorator(csrf_exempt)    def dispatch(self, *args, **kwargs):        return super(StatisticsIpRegion, self).dispatch(*args, **kwargs)    def get(self, request, *args, **kwargs):        request.encoding = 'utf-8'        return self.ipRegion(request.GET)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        return self.ipRegion(request.POST)    def ipRegion(self, request_dict):        response = ResponseObject()        ip = request_dict.get('ip', None)        uid = request_dict.get('uid', None)        p2p_request_times = int(request_dict.get('p2p_request_times', 0))        relay_request_times = int(request_dict.get('relay_request_times', 0))        if not all([ip, uid]) or (not p2p_request_times and not relay_request_times):            return response.json(444)        try:            now_time = int(time.time())            p2p_ip_qs = P2PIpModel.objects.filter(uid=uid).values('p2p_request_times', 'relay_request_times')            if p2p_ip_qs.exists():                # 已存在数据,更新p2p请求次数和relay请求次数                p2p_request_times = p2p_ip_qs[0]['p2p_request_times'] + p2p_request_times                relay_request_times = p2p_ip_qs[0]['relay_request_times'] + relay_request_times                p2p_ip_qs.update(p2p_request_times=p2p_request_times, relay_request_times=relay_request_times,                                 update_time=now_time)            else:                # 根据ip确定位置信息                ip_info = CommonService.getIpIpInfo(ip, 'CN')                # 获取大洲,国家,地区,城市                continent_code = ip_info['continent_code']                country_name = ip_info['country_name']                if continent_code == 'AP' and country_name != 'CN':                    # 如果大洲代码为'AP',国家不为'CN',为亚洲                    continent_code = 'AS'                continent_name = RegionModel.objects.filter(continent_code=continent_code).values('name')[0]['name']                region_name = ip_info['region_name']                city_name = ip_info['city_name']                P2PIpModel.objects.create(uid=uid, ip=ip, continent_name=continent_name, country_name=country_name,                                          region_name=region_name, city_name=city_name,                                          p2p_request_times=p2p_request_times, relay_request_times=relay_request_times,                                          add_time=now_time, update_time=now_time)            return response.json(0)        except Exception as e:            print(e)            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))def confirm_country_with_ip(request):    '''    根据ip统计设备所在国家的程序,    ip.txt放在ASJServer目录下    '''    response = ResponseObject()    try:        with open('country.txt', 'w', encoding='utf-8') as wf:            with open('ip.txt', 'r') as rf:                for ip in rf.readlines():                    if not ip or ip == '\n':                        country = 'N/A'                    else:                        if '\n' in ip:                            ip = ip[:-1]                        ipInfo = CommonService.getIpIpInfo(ip, "CN")                        country = ipInfo['country_name'] if ipInfo['country_name'] else 'N/A'                    wf.write(country+'\n')        return response.json(0)    except Exception as e:        print(e)        return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))def confirm_region_with_ip(request):    """    app下载链接确认地区    @param request:    @return:    """    try:        request.encoding = 'utf-8'        ip = CommonService.get_ip_address(request)        # 获取地区和国家信息        ip_addr_qs = IPAddr.objects.filter(ip=ip, is_geoip2=False).values('region', 'country_code')        if ip_addr_qs.exists():            region = ip_addr_qs[0]['region']            country_code = ip_addr_qs[0]['country_code']        else:            ip_qs = IPQuery(ip)            region = ip_qs.region            country_code = ip_qs.country_id        # 海外返回200状态码,国内403        if country_code != 'CN':            return HttpResponse()        elif region in ['香港', '澳门', '台湾']:            return HttpResponse()        return HttpResponse(status=403)    except Exception as e:        return HttpResponse(status=500,                            content='error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 |