ihuan_proxy.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. '''
  4. @Contact : liuyuqi.gov@msn.cn
  5. @Time : 2023/03/26 16:50:34
  6. @License : Copyright © 2017-2022 liuyuqi. All Rights Reserved.
  7. @Desc : ihuan proxy
  8. '''
  9. from . import Proxy
  10. import requests
  11. import time,datetime
  12. import re,os,sys,re
  13. from outlook_muti_register import api
  14. import logging
  15. class IhuaProxy(Proxy):
  16. def __init__(self, debug=False):
  17. self.debug = debug
  18. self.logger = logging.getLogger('outlook_muti_register')
  19. if debug:
  20. self.logger.setLevel(logging.DEBUG)
  21. else:
  22. self.logger.setLevel(logging.INFO)
  23. self.logger.info('init ihuan proxy')
  24. # todo
  25. self.headers = {}
  26. def set_global_chek_timeout(self, ip_list, max_bad_number=None):
  27. if not ip_list:
  28. print(ip_list)
  29. raise Exception('ip_list is None')
  30. bad_number = 0
  31. success_number = 0
  32. if max_bad_number is None:
  33. max_bad_number = len(ip_list)/2
  34. for ip, port, tp in ip_list:
  35. tp = tp.lower()
  36. try:
  37. ip_url = '{}:{}'.format(ip, port)
  38. requests.get(url=url, headers=headers, proxies={
  39. tp: '{}://'.format(tp)+ip_url}, timeout=check_timeout)
  40. success_number += 1
  41. except Exception:
  42. bad_number += 1
  43. print('try to set timeout={} \t success:{} \t fail:{}'.format(
  44. check_timeout, success_number, bad_number))
  45. if bad_number > max_bad_number:
  46. check_timeout += 1.5
  47. if check_timeout >= 10:
  48. raise TimeoutError
  49. return self.set_global_chek_timeout(ip_list, max_bad_number)
  50. if success_number > len(ip_list) - max_bad_number:
  51. d = datetime.now()
  52. with open('check_timeout.txt', 'w') as f:
  53. f.write('{} {} {} {} {}'.format(
  54. d.year, d.month, d.day, d.hour, check_timeout))
  55. return check_timeout
  56. def get_ip_list(self):
  57. '''get ip list from ihuan
  58. Returns: ip_list
  59. '''
  60. d = datetime.now()
  61. year = d.year
  62. month = d.month
  63. day = d.day
  64. hour = d.hour
  65. req_url = api.proxy_host_ihuan + '/today/{}/{:02d}/{{:02d}}/{{:02d}}.html'.format(
  66. year,
  67. month
  68. )
  69. ip_list = []
  70. while True:
  71. try:
  72. cur_url = req_url.format(day, hour)
  73. self.logger.info('try to get ip list page: ' + cur_url)
  74. response = requests.get(cur_url, headers=self.headers)
  75. ip_list = re.findall(
  76. r'<br>([\d\.]*?):(\d*)@(.*?)#',
  77. response.text,
  78. re.S
  79. )
  80. if ip_list:
  81. break
  82. hour -= 1
  83. except Exception as ex:
  84. print(ex)
  85. time.sleep(2)
  86. hour -= 1
  87. if hour == 0:
  88. raise Exception('get ip timeout')
  89. self.logger.info('get ip list page success')
  90. if os.path.exists('check_timeout.txt'):
  91. l = []
  92. with open('check_timeout.txt', 'r') as f:
  93. f_read = f.read()
  94. if f_read:
  95. l = list(map(float, f_read.split(' ')))
  96. if l and [year, month, day, hour] == l[:-1]:
  97. check_timeout = l[-1]
  98. else:
  99. self.set_global_chek_timeout(ip_list[-5:])
  100. else:
  101. self.set_global_chek_timeout(ip_list[-5:])
  102. used_ip = ''
  103. if os.path.exists('used_ip.txt'):
  104. with open('used_ip.txt', 'r') as f:
  105. used_ip = f.read()
  106. return [[tp, '{}:{}'.format(ip, port)] for ip, port, tp in ip_list if ip not in used_ip]
  107. if __name__=='__main__':
  108. ihuan_proxy = IhuaProxy()
  109. print(ihuan_proxy.get_ip_list())