DeviceConfirmRegion.py 10 KB

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