utils.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. import datetime
  2. import json
  3. import os
  4. import random
  5. import sched
  6. import threading
  7. import time
  8. import urllib
  9. import urllib.request
  10. from random import Random
  11. import requests
  12. from tools import loggerKit, redis_client
  13. # 随机生成token
  14. def get_token():
  15. length_r = 32
  16. token = ''
  17. chars = '01'
  18. length = len(chars) - 1
  19. random = Random()
  20. for i in range(length_r):
  21. token += chars[random.randint(0, length)]
  22. return token
  23. # 随机获取user_agent
  24. def get_random_browser():
  25. user_agent = [
  26. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36",
  27. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
  28. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36",
  29. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36",
  30. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36",
  31. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
  32. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/82.0.4085.133 Safari/537.36",
  33. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
  34. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36",
  35. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
  36. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
  37. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",
  38. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36",
  39. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
  40. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
  41. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36",
  42. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",
  43. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
  44. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36",
  45. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
  46. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0",
  47. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0",
  48. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0",
  49. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0",
  50. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0",
  51. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0",
  52. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0",
  53. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0",
  54. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0",
  55. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0",
  56. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0",
  57. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0",
  58. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0",
  59. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0",
  60. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",
  61. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0",
  62. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0",
  63. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0",
  64. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0",
  65. "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0",
  66. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36 Edg/88.0.705.81",
  67. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66",
  68. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36 Edg/86.0.622.69",
  69. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Edg/85.0.564.63",
  70. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36 Edg/84.0.522.63",
  71. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36 Edg/83.0.478.45",
  72. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/82.0.4086.0 Safari/537.36 Edg/82.0.459.1",
  73. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edg/81.0.416.72",
  74. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36 Edg/80.0.361.62",
  75. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 Edg/79.0.309.71",
  76. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 Edg/78.0.276.19",
  77. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36 Edg/77.0.235.27",
  78. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36 Edg/76.0.182.6",
  79. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 Edg/75.0.139.20",
  80. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36 Edg/74.1.96.24",
  81. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36 Edg/73.0.139.7",
  82. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36 Edg/72.0.130.14",
  83. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36 Edg/71.0.194.0",
  84. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edg/70.0.3538.102",
  85. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15",
  86. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Safari/605.1.15",
  87. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.2 Safari/605.1.15",
  88. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15",
  89. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/10.1.2 Safari/605.1.15",
  90. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/9.1.2 Safari/605.1.15",
  91. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/8.1.2 Safari/605.1.15",
  92. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/7.1.2 Safari/605.1.15",
  93. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/6.1.2 Safari/605.1.15",
  94. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/5.1.2 Safari/605.1.15",
  95. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/4.1.2 Safari/605.1.15",
  96. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/3.1.2 Safari/605.1.15",
  97. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/2.1.2 Safari/605.1.15",
  98. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/1.1.2 Safari/605.1.15",
  99. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/0.1.2 Safari/605.1.15",
  100. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/99.1.2 Safari/605.1.15",
  101. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/98.1.2 Safari/605.1.15",
  102. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/97.1.2 Safari/605.1.15",
  103. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/96.1.2 Safari/605.1.15",
  104. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/95.1.2 Safari/605.1.15",
  105. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
  106. ]
  107. return random.choice(user_agent)
  108. def get_proxy_ip(page, page_size):
  109. response = requests.get(
  110. f"https://proxy.webshare.io/api/v2/proxy/list/?mode=direct&page={page}&page_size={page_size}",
  111. # headers={"Authorization": "Token pmdz7f3wdrwhwp88zwxmgtvn9dsusk0557vd16sp"}
  112. headers={"Authorization": "Token 0pl6i8wbtukg4sdnf3b61wwzhi0h95pze47w5h3p"}
  113. )
  114. if response.status_code == 200:
  115. content = json.loads(response.text)
  116. # print(content["results"])
  117. random_proxy = random.choice(content["results"])
  118. print(random_proxy)
  119. if random_proxy['valid']:
  120. username = random_proxy['username']
  121. password = random_proxy['password']
  122. proxy_address_ip = random_proxy['proxy_address']
  123. port = random_proxy['port']
  124. # print(proxy_address_ip, port)
  125. proxy = f'{username}:{password}@{proxy_address_ip}:{port}'
  126. return proxy
  127. else:
  128. return None, None
  129. """
  130. 每天预先半小时存储好(早上8点半定时执行)
  131. """
  132. def save_proxy_ip(page, page_size):
  133. response = requests.get(
  134. f"https://proxy.webshare.io/api/v2/proxy/list/?mode=direct&page={page}&page_size={page_size}",
  135. headers={"Authorization": "Token 0pl6i8wbtukg4sdnf3b61wwzhi0h95pze47w5h3p"}
  136. )
  137. if response.status_code == 200:
  138. data = json.loads(response.text)
  139. # print(content['results'])
  140. # total = page * page_size
  141. print(f"代理总数:{data['count']}, 下一页:{data['next']}, 上一页:{data['previous']}")
  142. i = page * page_size - 1
  143. for r_proxy in data['results']:
  144. if r_proxy['valid']:
  145. username = r_proxy['username']
  146. password = r_proxy['password']
  147. proxy_address_ip = r_proxy['proxy_address']
  148. port = r_proxy['port']
  149. proxy = f'{username}:{password}@{proxy_address_ip}:{port}'
  150. # 连接Redis并存储代理IP
  151. redis_client.set(f'proxy_{str(i)}', proxy)
  152. i = i - 1
  153. def save_all_proxy_ip(page_size, total_page):
  154. for t in range(1, total_page):
  155. loggerKit.info(f't:{t}')
  156. response = requests.get(
  157. f"https://proxy.webshare.io/api/v2/proxy/list/?mode=direct&page={t}&page_size={page_size}",
  158. headers={"Authorization": "Token 0pl6i8wbtukg4sdnf3b61wwzhi0h95pze47w5h3p"}
  159. )
  160. if response.status_code == 200:
  161. data = json.loads(response.text)
  162. loggerKit.info(f"代理总数:{data['count']}, 下一页:{data['next']}, 上一页:{data['previous']}")
  163. i = t * page_size - 1
  164. for r_proxy in data['results']:
  165. if r_proxy['valid']:
  166. username = r_proxy['username']
  167. password = r_proxy['password']
  168. proxy_address_ip = r_proxy['proxy_address']
  169. port = r_proxy['port']
  170. proxy = f'{username}:{password}@{proxy_address_ip}:{port}'
  171. # 连接Redis并存储代理IP
  172. redis_client.set(f'proxy_{str(i)}', proxy)
  173. i = i - 1
  174. def get_proxy_poc():
  175. response = requests.get(
  176. "https://proxy.webshare.io/api/v2/proxy/list/?page=1&page_size=10",
  177. headers={"Authorization": "Token 0pl6i8wbtukg4sdnf3b61wwzhi0h95pze47w5h3p"}
  178. )
  179. if response.status_code == 200:
  180. data = json.loads(response.text)
  181. print(f"{json.loads(data)}")
  182. def get_random_proxy_at_redis(total):
  183. random_index = random.randint(0, total - 1)
  184. # 连接Redis并获取代理IP
  185. single_proxy = redis_client.get(f'proxy_{str(random_index)}')
  186. return single_proxy, random_index
  187. def process_account(account_number):
  188. print(f"Processing account {account_number}")
  189. def task_running(num_account):
  190. threads = []
  191. for account_number in range(num_account):
  192. thread = threading.Thread(target=process_account, args=(account_number,))
  193. threads.append(thread)
  194. thread.start()
  195. for thread in threads:
  196. thread.join()
  197. class Singleton(type):
  198. _instances = {}
  199. def __call__(cls, *args, **kwargs):
  200. if cls not in cls._instances:
  201. cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
  202. return cls._instances[cls]
  203. class FileWriter(metaclass=Singleton):
  204. def __init__(self, file_path):
  205. if not isinstance(file_path, str):
  206. raise TypeError("file_path should be a string")
  207. self.file_path = file_path
  208. if not os.path.exists(self.file_path):
  209. with open(self.file_path, 'a') as f:
  210. print(f'File {self.file_path} created successfully!')
  211. def write_to_file(self, content):
  212. try:
  213. with open(self.file_path, 'a') as file:
  214. file.write(content)
  215. except Exception as e:
  216. print(f"An error occurred: {e}")
  217. def run_daily_task(hour, minute, page, page_size):
  218. # 获取当前日期和时间
  219. now = datetime.datetime.now()
  220. # 计算下次运行时间
  221. run_time = datetime.datetime(now.year, now.month, now.day, hour, minute)
  222. if run_time < now:
  223. # 如果运行时间小于当前时间,则在明天的相应时间运行任务
  224. run_time = run_time + datetime.timedelta(days=1)
  225. # 计算等待时间
  226. wait_time = (run_time - now).total_seconds()
  227. # 创建定时器对象
  228. scheduler = sched.scheduler(time.time, time.sleep)
  229. # 添加定时任务
  230. scheduler.enter(wait_time, 1, save_proxy_ip, (page, page_size))
  231. # 启动定时器
  232. scheduler.run()
  233. def get_external_ip():
  234. # 获取公网出口IP地址
  235. url = "https://api.ipify.org/?format=json" # 定义查询 API 的 URL
  236. try:
  237. response = urllib.request.urlopen(url) # 向查询 API 发送请求并获取响应
  238. data = response.read() # 读取响应中的数据(字节流)
  239. data = data.decode("utf-8") # 将响应数据从字节流转换为字符串
  240. data = json.loads(data) # 将响应数据解析为 JSON 格式
  241. public_ip = data["ip"] # 从 JSON 数据中提取公网IP地址
  242. loggerKit.info(f"公网出口IP地址:{public_ip}")
  243. return public_ip
  244. except Exception as ex:
  245. err_msg = "无法获取公网出口IP地址" # 查询失败时输出提示信息
  246. loggerKit.error(f'err_msg: {err_msg}')
  247. def redis_del_poc():
  248. redis_client.delete('proxy_370')
  249. if __name__ == "__main__":
  250. # 代理池
  251. # print(get_proxy_ip(2, 100))
  252. # 多线程
  253. # num = 5
  254. # task_running(num)
  255. # 写文件
  256. # file_writer = FileWriter('output.txt')
  257. # file_writer.write_to_file('Hello, World!')
  258. # 代理池存储到redis
  259. # save_proxy_ip(9, 100)
  260. # 每天早上8点30开始执行
  261. # run_daily_task(8, 30, 1, 100)
  262. # 打印本机网络出口IP
  263. # external_ip = get_external_ip()
  264. # print(f"本机网络出口 IP 地址:", external_ip)
  265. # IP代理池一次性存储到redis
  266. # save_all_proxy_ip(100, 9)
  267. # get_proxy_poc()
  268. redis_del_poc()