Browse Source

设备获取域名接口使用阿里云ip解析,返回推送域名

locky 2 years ago
parent
commit
9557044d72
5 changed files with 170 additions and 82 deletions
  1. 34 0
      .pre-commit-config.yaml
  2. 90 52
      Controller/DeviceConfirmRegion.py
  3. 21 12
      Model/models.py
  4. 25 3
      Object/IPWeatherObject.py
  5. 0 15
      us_test_manage.py

+ 34 - 0
.pre-commit-config.yaml

@@ -0,0 +1,34 @@
+repos:
+    # 删除未使用导入和变量
+  - repo: https://github.com/PyCQA/autoflake
+    rev: v2.2.0
+    hooks:
+      - id: autoflake
+
+    # 导入排序
+#  - repo: https://github.com/PyCQA/isort
+#    rev: 5.12.0
+#    hooks:
+#      - id: isort
+#        args: ["--line-length=120"]
+
+    # 格式化代码
+#  - repo: https://github.com/psf/black
+#    rev: 22.3.0
+#    hooks:
+#      - id: black
+#        args: ["--line-length=120"]
+
+  - repo: https://github.com/PyCQA/flake8
+    rev: 5.0.4
+    hooks:
+      - id: flake8
+        args: ["--max-line-length=120"]
+
+    # 安全性检查
+#  - repo: https://github.com/PyCQA/bandit
+#    rev: 1.7.1
+#    hooks:
+#      - id: bandit
+
+fail_fast: false

+ 90 - 52
Controller/DeviceConfirmRegion.py

@@ -1,52 +1,66 @@
-import logging
 import time
 
 from django.utils.decorators import method_decorator
+from django.views import View
 
 from django.views.decorators.csrf import csrf_exempt
-from django.views.generic import TemplateView
-from Model.models import CountryModel, RegionModel, P2PIpModel, DeviceDomainModel, DeviceDomainRegionModel
+from Model.models import CountryModel, RegionModel, P2PIpModel, DeviceDomainModel, DeviceDomainRegionModel, IPAddr
 from Object.ResponseObject import ResponseObject
 from Service.CommonService import CommonService
+from Object.IPWeatherObject import IPQuery
 
 
-#确认设备所在地区
-class ConfirmRegion(TemplateView):
+class ConfirmRegion(View):
+    # 设备根据ip获取域名
     @method_decorator(csrf_exempt)
     def dispatch(self, *args, **kwargs):
         return super(ConfirmRegion, self).dispatch(*args, **kwargs)
 
-    def get(self, request, *args, **kwargs):
+    @staticmethod
+    def get(request, *args, **kwargs):
         response = ResponseObject()
         request.encoding = 'utf-8'
         try:
             ip = CommonService.get_ip_address(request)
-            device_domain_data = {'ip': ip}
-            ipInfo = CommonService.getIpIpInfo(ip, 'CN')
-            logger = logging.getLogger('info')
-            logger.info('设备获取域名---ip:{},country_code:{}'.format(ip, ipInfo['country_code']))
-            if ipInfo['country_code']:
-                device_domain_data['country_name'] = ipInfo['country_code']
-                device_request_url = CountryModel.objects.filter(country_code=ipInfo['country_code']).values("region__api")
-                if device_request_url.exists():
-                    api = device_request_url[0]['region__api']
-                    device_domain_data['api'] = api
-                    DeviceDomainModel.objects.create(**device_domain_data)
-                    return response.json(0, {'request_api_url': api})
-
-            # 不存在默认返回美洲地区api。
-            api = RegionModel.objects.filter(continent_code='NA').values("api")
-            device_domain_data['country_name'] = 'NA'
-            device_domain_data['api'] = api[0]['api']
-            DeviceDomainModel.objects.create(**device_domain_data)
-            return response.json(0, {'request_api_url': api[0]['api']})
+            device_domain_qs = DeviceDomainModel.objects.filter(ip=ip)
+
+            # 获取国家编码
+            ip_addr_qs = IPAddr.objects.filter(ip=ip).values('country_code')
+            if ip_addr_qs.exists():
+                country_code = ip_addr_qs[0]['country_code']
+            else:
+                ip_qs = IPQuery(ip)
+                country_code = ip_qs.country_id
+
+            if country_code:
+                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)
+
+                    return response.json(0, {'request_api_url': api, 'push_api_url': push_api})
+
+            # 不存在则返回美洲域名
+            region_qs = RegionModel.objects.filter(continent_code='NA').values('api', 'push_api')
+            api = region_qs[0]['api']
+            push_api = region_qs[0]['push_api']
+
+            if not device_domain_qs.exists():
+                DeviceDomainModel.objects.create(ip=ip, country_name='NA', api=api)
+
+            return response.json(0, {'request_api_url': api, 'push_api_url': push_api})
         except Exception as e:
             print(e)
-            return response.json(0, {'request_api_url': 'https://www.dvema.com'})
+            return response.json(0, {'request_api_url': 'https://www.dvema.com',
+                                     'push_api_url': 'https://push.dvema.com'})
 
 
-# 根据设备的ip返回域名和地区id
-class ConfirmRegionV2(TemplateView):
+class ConfirmRegionV2(View):
+    # 设备根据ip获取域名V2接口
     @method_decorator(csrf_exempt)
     def dispatch(self, *args, **kwargs):
         return super(ConfirmRegionV2, self).dispatch(*args, **kwargs)
@@ -60,57 +74,78 @@ class ConfirmRegionV2(TemplateView):
             data_dict = {'serial_number': serial_number}
             device_domain_region_qs = DeviceDomainRegionModel.objects.filter(serial_number=serial_number)
 
-            # 根据请求ip确认地区
+            # 获取ip
             request.encoding = 'utf-8'
             ip = CommonService.get_ip_address(request)
             data_dict['ip'] = ip
-            ipInfo = CommonService.getIpIpInfo(ip, 'CN')
-            country_code = ipInfo['country_code']
+
+            # 获取国家编码
+            ip_addr_qs = IPAddr.objects.filter(ip=ip).values('country_code')
+            if ip_addr_qs.exists():
+                country_code = ip_addr_qs[0]['country_code']
+            else:
+                ip_qs = IPQuery(ip)
+                country_code = ip_qs.country_id
 
             if country_code:
-                data_dict['country_name'] = ipInfo['country_name']
+                data_dict['country_code'] = country_code
                 country_qs = CountryModel.objects.filter(country_code=country_code).\
-                    values('region__api', 'region__id')
+                    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']
-                else:   # 默认返回美洲地区api
-                    api, region_id = self.get_default_api()
+                else:
+                    # 返回美洲域名
+                    data_dict['country_code'] = 'NA'
+                    api, push_api, region_id = self.get_default_api()
             else:
-                # 默认返回美洲地区api
-                api, region_id = self.get_default_api()
+                # 返回美洲域名
+                data_dict['country_code'] = 'NA'
+                api, push_api, region_id = self.get_default_api()
 
             # 更新或创建设备域名数据
-            data_dict['api'] = api
             data_dict['region_id'] = region_id
             if device_domain_region_qs.exists():
                 device_domain_region_qs.update(**data_dict)
             else:
                 device_domain_region_qs.create(**data_dict)
-            res = {'request_api_url': api, 'region_id': region_id}
+
+            # 响应数据
+            res = {
+                'request_api_url': api,
+                'push_api_url': push_api,
+                'region_id': region_id
+            }
             return response.json(0, res)
         except Exception as e:
-            print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            print(repr(e))
+            api, push_api, region_id = self.get_default_api()
+            res = {
+                'request_api_url': api,
+                'push_api_url': push_api,
+                'region_id': region_id
+            }
+            return response.json(0, res)
 
     # 获取区域表美洲的相关数据
     @staticmethod
     def get_default_api():
-        region_qs = RegionModel.objects.filter(continent_code='NA').values('api', 'id')
+        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']
-        return api, region_id
+        return api, push_api, region_id
+
 
-#确认设备所在地区
 class 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")
+            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
@@ -119,7 +154,7 @@ class Device_Region(object):
 
 
 # 根据p2p的ip统计设备所在地区
-class StatisticsIpRegion(TemplateView):
+class StatisticsIpRegion(View):
     @method_decorator(csrf_exempt)
     def dispatch(self, *args, **kwargs):
         return super(StatisticsIpRegion, self).dispatch(*args, **kwargs)
@@ -149,7 +184,8 @@ class StatisticsIpRegion(TemplateView):
                 # 已存在数据,更新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)
+                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')
@@ -163,13 +199,15 @@ class StatisticsIpRegion(TemplateView):
                 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)
+                                          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统计设备所在国家的程序,

+ 21 - 12
Model/models.py

@@ -159,8 +159,8 @@ class Device_User(AbstractBaseUser):
                                        verbose_name=u'头像',
                                        # 图片将处理成85x85的尺寸
                                        processors=[ResizeToFill(85, 85)], )
-    userIconUrl = models.URLField(blank=True, max_length=128, default=SERVER_DOMAIN
-                                                                      + 'account/getAvatar/User/defaultUser.png')
+    userIconUrl = models.URLField(blank=True, max_length=128,
+                                  default=SERVER_DOMAIN + 'account/getAvatar/User/defaultUser.png')
     NickName = models.CharField(blank=True, max_length=64, default='', verbose_name=u'用户昵称')
     is_superuser = models.IntegerField(blank=True, default=0, verbose_name=u'用户类型')
     is_active = models.BooleanField(blank=True, default=False, verbose_name=u'用户活动状态')
@@ -1482,12 +1482,12 @@ class UserExModel(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='自增id')
     userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE)
     appBundleId = models.CharField(default='', max_length=32, verbose_name=u'appID')
+    # {'cn': '简体中文', 'tc': '繁体中文', 'fr': '法文', 'ru': '俄文', 'es': '西班牙文',
+    # 'pl': '波兰文', 'ja': '日文', 'de': '德文', 'en': '英文'}
     region = models.CharField(default='', max_length=16, verbose_name='区域语言')
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
 
-    # {'cn': '简体中文', 'tc': '繁体中文', 'fr': '法文', 'ru': '俄文', 'es': '西班牙文', 'pl': '波兰文', 'ja': '日文', 'de': '德文', 'en': '英文'}
-
     class Meta:
         db_table = 'user_ex'
         verbose_name = '用户扩展信息表'
@@ -1504,8 +1504,6 @@ class UserOauth2Model(models.Model):
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
 
-    # {'cn': '简体中文', 'tc': '繁体中文', 'fr': '法文', 'ru': '俄文', 'es': '西班牙文', 'pl': '波兰文', 'ja': '日文', 'de': '德文', 'en': '英文'}
-
     class Meta:
         db_table = 'user_oauth2'
         verbose_name = '用户oauth2关联'
@@ -1852,7 +1850,6 @@ class CDKcontextModel(models.Model):
     is_activate = models.SmallIntegerField(default=0, verbose_name='是否已激活')  # 0 未激活  1 已激活
     is_down = models.SmallIntegerField(default=0, verbose_name='是否已下载')  # 0 未下载 1 已下载
     rank = models.ForeignKey(Store_Meal, to_field='id', default='', on_delete=models.CASCADE, verbose_name='套餐类型')
-    # order = models.ForeignKey(Order_Model, blank=True, max_length=20, to_field='orderID', on_delete=models.CASCADE, verbose_name='订单id', unique=True)
     order = models.CharField(max_length=20, blank=True, unique=True, verbose_name='订单id')
     express_id = models.CharField(blank=True, max_length=128, verbose_name='速卖通订单id')
 
@@ -2463,8 +2460,7 @@ class DeviceDomainRegionModel(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键')
     serial_number = models.CharField(default='', max_length=9, verbose_name='序列号')
     ip = models.CharField(default='', max_length=32, verbose_name='ip')
-    country_name = models.CharField(default='', max_length=20, verbose_name='国家名')
-    api = models.CharField(default='', max_length=50, verbose_name='使用的域名')
+    country_code = models.CharField(default='', max_length=8, verbose_name='国家编码')
     region_id = models.SmallIntegerField(default=0, verbose_name='对应tb_region表id')
     add_time = models.DateTimeField(blank=True, auto_now_add=True, verbose_name='添加时间')
     update_time = models.DateTimeField(blank=True, auto_now=True, verbose_name='更新时间')
@@ -2638,8 +2634,8 @@ class PaypalWebHookEvent(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     webhook_event_id = models.CharField(max_length=200, blank=True, verbose_name='webhook事件ID', default='')
     resource_type = models.CharField(max_length=11, verbose_name='资源类型', blank=True, default='')
-    ## event_type: 1=PAYMENT.SALE.COMPLETED(付款,订阅成功后钩子),2=PAYMENT.SALE.REVERSED(付款撤销)
-    ## event_type: 3=BILLING.SUBSCRIPTION.CANCELLED(订阅取消),4=BILLING.SUBSCRIPTION.SUSPENDED(订阅暂停),
+    # event_type: 1=PAYMENT.SALE.COMPLETED(付款,订阅成功后钩子),2=PAYMENT.SALE.REVERSED(付款撤销)
+    # event_type: 3=BILLING.SUBSCRIPTION.CANCELLED(订阅取消),4=BILLING.SUBSCRIPTION.SUSPENDED(订阅暂停),
     # event_type:  5=BILLING.SUBSCRIPTION.PAYMENT.FAILED(订阅付款失败),6=PAYMENT.SALE.REFUNDED(退款)
     event_type = models.SmallIntegerField(default=0, verbose_name='事件类型')
     summary = models.CharField(max_length=500, verbose_name='事件概要', blank=True, default='')
@@ -2761,7 +2757,7 @@ class GatewaySubDevice(models.Model):
     nickname = models.CharField(default='', max_length=32, verbose_name=u'设备名称')
     ieee_addr = models.CharField(default='', max_length=64, verbose_name=u'长地址')
     src_addr = models.CharField(default='', max_length=16, verbose_name=u'短地址')
-    status = models.SmallIntegerField(default=0, verbose_name='状态')  # 0:关闭, 1:开启
+    status = models.SmallIntegerField(default=1, verbose_name='在线状态')  # 1:在线, 0:离线
     # 0:正常, 1:被拆动, 智能按钮紧急开关状态: 0:关闭, 1:开启
     is_tampered = models.SmallIntegerField(default=0, verbose_name='拆动状态')
     mac = models.CharField(default='', max_length=32, verbose_name=u'mac地址')
@@ -3585,3 +3581,16 @@ class CityInformation(models.Model):
         db_table = 'city_information'
         verbose_name = '城市信息'
         verbose_name_plural = verbose_name
+
+
+class IPAddr(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='主键')
+    ip = models.CharField(default='', max_length=32, verbose_name='ip')
+    district = models.CharField(default='', max_length=32, verbose_name='区')
+    city = models.CharField(default='', max_length=32, verbose_name='市')
+    region = models.CharField(default='', max_length=32, verbose_name='省/州')
+    country_code = models.CharField(default='', max_length=8, verbose_name='国家编码')
+
+    class Meta:
+        db_table = 'ip_addr'
+        verbose_name = 'ip地址信息'

+ 25 - 3
Object/IPWeatherObject.py

@@ -3,6 +3,8 @@
 # @Time      : 2023/8/16 8:56
 import requests
 
+from Model.models import IPAddr
+
 
 class IPQuery:
     """
@@ -15,7 +17,10 @@ class IPQuery:
         self.host = 'https://c2ba.api.huachen.cn'
         self.path = '/ip'
 
-        self.district = None
+        self.district = ''  # 区
+        self.city = ''      # 市
+        self.region = ''    # 省/州
+        self.country_id = ''
 
         param = 'ip=' + ip
         url = self.host + self.path + '?' + param
@@ -28,8 +33,25 @@ class IPQuery:
             res_data = eval(res.content.decode('utf-8'))
             if res_data['ret'] == 200:
                 district = res_data['data']['district']
-                city = res_data['data']['city'] + '市'
-                self.district = district if district else city
+
+                # 城市数据不为空字符,拼上'市'字
+                city = res_data['data']['city']
+                if city != '':
+                    city += '市'
+
+                region = res_data['data']['region']
+                country_id = res_data['data']['country_id']
+
+                # ip地址信息存表
+                IPAddr.objects.create(ip=ip, district=district, city=city, region=region, country_code=country_id)
+
+                # 确定天气城市
+                if district != '':
+                    self.district = district
+                elif city != '':
+                    self.district = city
+
+                self.country_id = country_id
 
 
 class WeatherInfo:

+ 0 - 15
us_test_manage.py

@@ -1,15 +0,0 @@
-#!/usr/bin/env python
-import os
-import sys
-
-if __name__ == "__main__":
-    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Ansjer.us_config.test_settings")
-    try:
-        from django.core.management import execute_from_command_line
-    except ImportError as exc:
-        raise ImportError(
-            "Couldn't import Django. Are you sure it's installed and "
-            "available on your PYTHONPATH environment variable? Did you "
-            "forget to activate a virtual environment?"
-        ) from exc
-    execute_from_command_line(sys.argv)