DeviceConfirmRegion.py 9.1 KB

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