DeviceConfirmRegion.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. import logging
  2. import time
  3. from django.utils.decorators import method_decorator
  4. from django.views.decorators.csrf import csrf_exempt
  5. from django.views.generic import TemplateView
  6. from Model.models import CountryModel, RegionModel, P2PIpModel, DeviceDomainModel, DeviceDomainRegionModel
  7. from Object.ResponseObject import ResponseObject
  8. from Service.CommonService import CommonService
  9. #确认设备所在地区
  10. class ConfirmRegion(TemplateView):
  11. @method_decorator(csrf_exempt)
  12. def dispatch(self, *args, **kwargs):
  13. return super(ConfirmRegion, self).dispatch(*args, **kwargs)
  14. def get(self, request, *args, **kwargs):
  15. response = ResponseObject()
  16. request.encoding = 'utf-8'
  17. try:
  18. ip = CommonService.get_ip_address(request)
  19. device_domain_data = {'ip': ip}
  20. ipInfo = CommonService.getIpIpInfo(ip, 'CN')
  21. logger = logging.getLogger('info')
  22. logger.info('设备获取域名---ip:{},country_code:{}'.format(ip, ipInfo['country_code']))
  23. if ipInfo['country_code']:
  24. device_domain_data['country_name'] = ipInfo['country_code']
  25. device_request_url = CountryModel.objects.filter(country_code=ipInfo['country_code']).values("region__api")
  26. if device_request_url.exists():
  27. api = device_request_url[0]['region__api']
  28. # 欧洲暂时返回美洲域名
  29. if api == 'https://api.zositeche.com/':
  30. api = 'https://www.dvema.com/'
  31. device_domain_data['api'] = api
  32. DeviceDomainModel.objects.create(**device_domain_data)
  33. return response.json(0, {'request_api_url': api})
  34. # 不存在默认返回美洲地区api。
  35. api = RegionModel.objects.filter(continent_code='NA').values("api")
  36. device_domain_data['country_name'] = 'NA'
  37. device_domain_data['api'] = api[0]['api']
  38. DeviceDomainModel.objects.create(**device_domain_data)
  39. return response.json(0, {'request_api_url': api[0]['api']})
  40. except Exception as e:
  41. print(e)
  42. return response.json(0, {'request_api_url': 'https://www.dvema.com'})
  43. # 根据设备的ip返回域名和地区id
  44. class ConfirmRegionV2(TemplateView):
  45. @method_decorator(csrf_exempt)
  46. def dispatch(self, *args, **kwargs):
  47. return super(ConfirmRegionV2, self).dispatch(*args, **kwargs)
  48. def get(self, request, *args, **kwargs):
  49. response = ResponseObject()
  50. serial_number = request.GET.get('serial_number', None)
  51. if not serial_number:
  52. return response.json(444)
  53. try:
  54. data_dict = {'serial_number': serial_number}
  55. device_domain_region_qs = DeviceDomainRegionModel.objects.filter(serial_number=serial_number)
  56. # 根据请求ip确认地区
  57. request.encoding = 'utf-8'
  58. ip = CommonService.get_ip_address(request)
  59. data_dict['ip'] = ip
  60. ipInfo = CommonService.getIpIpInfo(ip, 'CN')
  61. country_code = ipInfo['country_code']
  62. if country_code:
  63. data_dict['country_name'] = ipInfo['country_name']
  64. country_qs = CountryModel.objects.filter(country_code=country_code).\
  65. values('region__api', 'region__id')
  66. if country_qs.exists():
  67. api = country_qs[0]['region__api']
  68. region_id = country_qs[0]['region__id']
  69. # 欧洲暂时返回美洲域名
  70. if api == 'https://api.zositeche.com/':
  71. api, region_id = self.get_default_api()
  72. else: # 默认返回美洲地区api
  73. api, region_id = self.get_default_api()
  74. else:
  75. # 默认返回美洲地区api
  76. api, region_id = self.get_default_api()
  77. # 更新或创建设备域名数据
  78. data_dict['api'] = api
  79. data_dict['region_id'] = region_id
  80. if device_domain_region_qs.exists():
  81. device_domain_region_qs.update(**data_dict)
  82. else:
  83. device_domain_region_qs.create(**data_dict)
  84. res = {'request_api_url': api, 'region_id': region_id}
  85. return response.json(0, res)
  86. except Exception as e:
  87. print(e)
  88. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  89. # 获取区域表美洲的相关数据
  90. @staticmethod
  91. def get_default_api():
  92. region_qs = RegionModel.objects.filter(continent_code='NA').values('api', 'id')
  93. api = region_qs[0]['api']
  94. region_id = region_qs[0]['id']
  95. return api, region_id
  96. #确认设备所在地区
  97. class Device_Region(object):
  98. def get_device_region(self, ip):
  99. ipInfo = CommonService.getIpIpInfo(ip, "CN")
  100. #暂时测试国外
  101. if ipInfo['country_code']:
  102. device_request_url = CountryModel.objects.filter(country_code=ipInfo['country_code']).values("region__api","region__id")
  103. if device_request_url.exists():
  104. return device_request_url[0]['region__id']
  105. # 不存在默认返回美洲地区api
  106. api = RegionModel.objects.filter(continent_code='NA').values("id")
  107. return api[0]['id']
  108. # 根据p2p的ip统计设备所在地区
  109. class StatisticsIpRegion(TemplateView):
  110. @method_decorator(csrf_exempt)
  111. def dispatch(self, *args, **kwargs):
  112. return super(StatisticsIpRegion, self).dispatch(*args, **kwargs)
  113. def get(self, request, *args, **kwargs):
  114. request.encoding = 'utf-8'
  115. return self.ipRegion(request.GET)
  116. def post(self, request, *args, **kwargs):
  117. request.encoding = 'utf-8'
  118. return self.ipRegion(request.POST)
  119. def ipRegion(self, request_dict):
  120. response = ResponseObject()
  121. ip = request_dict.get('ip', None)
  122. uid = request_dict.get('uid', None)
  123. p2p_request_times = int(request_dict.get('p2p_request_times', 0))
  124. relay_request_times = int(request_dict.get('relay_request_times', 0))
  125. if not all([ip, uid]) or (not p2p_request_times and not relay_request_times):
  126. return response.json(444)
  127. try:
  128. now_time = int(time.time())
  129. p2p_ip_qs = P2PIpModel.objects.filter(uid=uid).values('p2p_request_times', 'relay_request_times')
  130. if p2p_ip_qs.exists():
  131. # 已存在数据,更新p2p请求次数和relay请求次数
  132. p2p_request_times = p2p_ip_qs[0]['p2p_request_times'] + p2p_request_times
  133. relay_request_times = p2p_ip_qs[0]['relay_request_times'] + relay_request_times
  134. p2p_ip_qs.update(p2p_request_times=p2p_request_times, relay_request_times=relay_request_times, update_time=now_time)
  135. else:
  136. # 根据ip确定位置信息
  137. ip_info = CommonService.getIpIpInfo(ip, 'CN')
  138. # 获取大洲,国家,地区,城市
  139. continent_code = ip_info['continent_code']
  140. country_name = ip_info['country_name']
  141. if continent_code == 'AP' and country_name != 'CN':
  142. # 如果大洲代码为'AP',国家不为'CN',为亚洲
  143. continent_code = 'AS'
  144. continent_name = RegionModel.objects.filter(continent_code=continent_code).values('name')[0]['name']
  145. region_name = ip_info['region_name']
  146. city_name = ip_info['city_name']
  147. P2PIpModel.objects.create(uid=uid, ip=ip, continent_name=continent_name, country_name=country_name,
  148. region_name=region_name, city_name=city_name, p2p_request_times=p2p_request_times,
  149. relay_request_times=relay_request_times, add_time=now_time, update_time=now_time)
  150. return response.json(0)
  151. except Exception as e:
  152. print(e)
  153. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  154. def confirm_country_with_ip(request):
  155. '''
  156. 根据ip统计设备所在国家的程序,
  157. ip.txt放在ASJServer目录下
  158. '''
  159. response = ResponseObject()
  160. try:
  161. with open('country.txt', 'w', encoding='utf-8') as wf:
  162. with open('ip.txt', 'r') as rf:
  163. for ip in rf.readlines():
  164. if not ip or ip == '\n':
  165. country = 'N/A'
  166. else:
  167. if '\n' in ip:
  168. ip = ip[:-1]
  169. ipInfo = CommonService.getIpIpInfo(ip, "CN")
  170. country = ipInfo['country_name'] if ipInfo['country_name'] else 'N/A'
  171. wf.write(country+'\n')
  172. return response.json(0)
  173. except Exception as e:
  174. print(e)
  175. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))