DeviceConfirmRegion.py 9.6 KB

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