wuyouip.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import time
  2. from typing import Any
  3. import requests
  4. from net.task_api import task_api
  5. from tools.log import logger
  6. class WyIP:
  7. def __init__(self):
  8. self.token = None
  9. self.local_node_list = []
  10. self.node_list = []
  11. self._initialize_node_list()
  12. self._initialize_local_node_list()
  13. self.error_count = 0
  14. def _initialize_node_list(self):
  15. t = 0
  16. while True:
  17. result, _list = self.get_node_list()
  18. if not result:
  19. t += 1
  20. if t == 10:
  21. task_api.notify('无忧IP取账号节点列表失败')
  22. logger.error('无忧IP取账号节点列表失败,5秒后重新获取')
  23. time.sleep(5)
  24. continue
  25. else:
  26. self.node_list = _list
  27. break
  28. def _initialize_local_node_list(self):
  29. t = 0
  30. while True:
  31. self.local_node_list = self.get_local_node_list()
  32. if len(self.local_node_list) < 1:
  33. t += 1
  34. if t == 10:
  35. task_api.notify('无忧IP取本地节点列表失败')
  36. logger.error('无忧IP取本地节点列表失败,10秒后重新获取')
  37. time.sleep(10)
  38. continue
  39. else:
  40. break
  41. def set_wy_token(self):
  42. try:
  43. result = requests.get('http://120.92.154.154:8888/loging/getWuYToken',timeout=10)
  44. if result.status_code == 200:
  45. data = result.json()
  46. if data['code'] == 0:
  47. self.token = data['data']['token']
  48. return
  49. raise Exception('获取token失败')
  50. except Exception as e:
  51. raise Exception(e)
  52. def get_node_list(self) -> tuple[bool, str] | tuple[bool, list[Any]]:
  53. self.set_wy_token()
  54. if not self.token:
  55. return False, 'token为空'
  56. try:
  57. node_list = []
  58. for i in range(1, 5):
  59. header = {
  60. 'content-type': 'application/x-www-form-urlencoded',
  61. 'cookie': self.token,
  62. }
  63. data = f'rows=500&page={i}&NodeWheres%5BType%5D=&NodeWheres%5BNodeType%5D=all&NodeWheres%5BDeviceType%5D=all&NodeWheres%5BItemNumber%5D=all&NodeWheres%5BRegionState%5D=all&NodeWheres%5BRegionNumber%5D=all&NodeWheres%5BNodeIsUsed%5D=all&NodeWheres%5BGroupNumber%5D=all&NodeWheres%5BNodePrice%5D=all&NodeWheres%5BIsGlobalDynamic%5D=all&TimeDesc='
  64. result = requests.post('https://user.wuyouip.com/Node/Home/ListUserNodewData', data=data,
  65. headers=header,timeout=10)
  66. if result.status_code == 200:
  67. text = result.text
  68. if 'DOCTYPE' in text:
  69. return False, 'get_node_list:登录已过期,请重新登录'
  70. data = result.json()
  71. if data['success']:
  72. node_list.extend(data['rows'])
  73. if data['total'] <= 500 * i:
  74. return True, node_list
  75. return False, '获取账号节点列表失败'
  76. except Exception as e:
  77. return False, str(e)
  78. @staticmethod
  79. def get_local_node_list() -> list[Any]:
  80. try:
  81. result = requests.get('http://127.0.0.1:54321/api/v1/getNodeBindDataList', timeout=10)
  82. if result.status_code == 200:
  83. data = result.json()
  84. if data['message'] == '':
  85. return data['data']
  86. return []
  87. except Exception as e:
  88. return []
  89. def switch_node_area(self, node_id: str, price_id: str, region: str) -> tuple[bool, str]:
  90. header = {
  91. 'content-type': 'application/x-www-form-urlencoded',
  92. 'cookie': self.token
  93. }
  94. data = f'id={node_id}&pId={price_id}&regions={region}'
  95. try:
  96. result = requests.post('https://user.wuyouip.com/Node/Home/SwitchNodeAreaV2', data=data, headers=header, timeout=10)
  97. if result.status_code == 200:
  98. text = result.text
  99. logger.info(f'{node_id}-{region}-{price_id}-切换地区接口返回:{text}')
  100. if 'DOCTYPE' in text:
  101. return False, 'switch_node_area:登录已过期,请重新登录'
  102. data = result.json()
  103. if data['success']:
  104. return True, 'switch_node_area:切换成功'
  105. if data['error']:
  106. return False, f'switch_node_area:{data["message"]}'
  107. return False, '切换失败'
  108. except Exception as e:
  109. return False, f'switch_node_area:{e}'
  110. def get_node_id_by_emulator_index(self, emulator_index: int) -> tuple[bool, str] | tuple[
  111. bool, tuple[Any, Any | None]]:
  112. node_order = None
  113. for node in self.local_node_list:
  114. for order in node['simulatorOrders']:
  115. if int(order) == emulator_index:
  116. node_order = node['nodeOrder']
  117. if not node_order:
  118. return False, 'get_node_id_by_emulator_index:未找到对应的本地节点'
  119. for node in self.node_list:
  120. if node['UserNodeBuyOrder'] == node_order:
  121. return True, (node['NodeId'], node_order)
  122. return False, 'get_node_id_by_emulator_index:未找到对应的账号节点'
  123. def switch_emulator_area(self, emulator_index: int, price_id: str, region: str) -> tuple[bool, str]:
  124. if not self.token:
  125. self.error_count += 1
  126. return False, '未登录'
  127. if not self.node_list:
  128. self._initialize_node_list()
  129. if not self.local_node_list:
  130. self._initialize_local_node_list()
  131. result, tup = self.get_node_id_by_emulator_index(emulator_index)
  132. if not result:
  133. self.error_count += 1
  134. if self.error_count == 5:
  135. task_api.notify(f'模拟器{emulator_index}切换地区失败,请检查')
  136. return result, tup
  137. result, message = self.switch_node_area(tup[0], price_id, region)
  138. if not result:
  139. self.error_count += 1
  140. if self.error_count == 5:
  141. task_api.notify(f'模拟器{emulator_index}切换地区失败,请检查')
  142. return result, message
  143. self.error_count = 0
  144. time.sleep(5)
  145. result, message = self.update_node(tup[1])
  146. return True, message
  147. def queryProcessProxyRegion(self,pid) -> tuple[bool, str]:
  148. try:
  149. result = requests.get(f'http://127.0.0.1:54321/api/v1/queryProcessIsProxy?pid={pid}', timeout=10)
  150. if result.status_code == 200:
  151. data = result.json()
  152. if data['result'] == 0:
  153. return True, data['data']['region']
  154. return False, f'queryProcessIsProxy 错误:{data["message"]}'
  155. return False, f'queryProcessIsProxy 错误:{result.status_code}'
  156. except Exception as e:
  157. return False, f'queryProcessIsProxy 错误:{str(e)}'
  158. def update_node(self, node_order) -> tuple[bool, Any]:
  159. try:
  160. result = requests.get(f'http://127.0.0.1:54321/api/v1/nodeRequestSwitch?nodeOrder={node_order}', timeout=10)
  161. if result.status_code == 200:
  162. data = result.json()
  163. if data['result'] == 0:
  164. return True, data['data']
  165. return False, f'update_node 错误:{data["message"]}'
  166. return False, f'update_node 错误:{result.status_code}'
  167. except Exception as e:
  168. return False, f'update_node 错误:{str(e)}'