DeviceConfirmRegion.py 8.2 KB

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