DeviceConfirmRegion.py 9.6 KB

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