DeviceConfirmRegion.py 12 KB

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