1
0

network_info.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. import socket
  2. import requests
  3. import uuid
  4. import speedtest
  5. import psutil
  6. import netifaces
  7. from pythonping import ping as python_ping
  8. import time
  9. import os
  10. # --- Утилитарные функции ---
  11. def get_size(bytes_count):
  12. """
  13. Преобразует байты в удобочитаемый формат (B, KB, MB, GB, TB).
  14. """
  15. if not isinstance(bytes_count, (int, float)) or bytes_count is None:
  16. return "N/A"
  17. for unit in ['B', 'KB', 'MB', 'GB', 'TB', 'PB']:
  18. if bytes_count < 1024.0:
  19. return f"{bytes_count:.2f} {unit}"
  20. bytes_count /= 1024.0
  21. return f"{bytes_count:.2f} PB"
  22. def format_report(data, target_host):
  23. """
  24. Форматирует все собранные данные в одну строку для вывода в файл и консоль.
  25. """
  26. # Добавляем метку времени начала отчета
  27. timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
  28. report_lines = []
  29. report_lines.append("="*50)
  30. report_lines.append(" СВОДНАЯ ИНФОРМАЦИЯ О СЕТИ")
  31. report_lines.append("="*50)
  32. report_lines.append(f"Дата и время отчета: {timestamp}")
  33. report_lines.append("-" * 30)
  34. # Блок 1: Системная информация
  35. report_lines.append("🖥️ Система:")
  36. report_lines.append(f" Имя компьютера: {data.get('hostname', 'N/A')}")
  37. report_lines.append(f" Сетевой адаптер: {data.get('interface_name', 'N/A')}")
  38. report_lines.append(f" MAC-адрес: {data.get('mac_address', 'N/A')}")
  39. report_lines.append("-" * 30)
  40. # Блок 2: IP-адреса и шлюз
  41. report_lines.append(f"🌐 IP-адреса:")
  42. report_lines.append(f" Внутренний IP: {data.get('local_ip', 'N/A')}")
  43. report_lines.append(f" IP шлюза (роутера): {data.get('gateway_ip', 'N/A')}")
  44. report_lines.append(f" Внешний IP: {data.get('external_ip', 'N/A')}")
  45. report_lines.append("-" * 30)
  46. # Блок 3: Объем данных
  47. report_lines.append(f"📊 Общий объем данных (с момента загрузки ОС):")
  48. report_lines.append(f" Отправлено: {get_size(data.get('total_sent'))}")
  49. report_lines.append(f" Получено: {get_size(data.get('total_recv'))}")
  50. report_lines.append("-" * 30)
  51. # Блок 4: Пинг
  52. report_lines.append(f"⏱️ Пинг и потеря пакетов:")
  53. # Пинг до шлюза
  54. report_lines.append(f" - До шлюза ({data.get('gateway_ip', 'N/A')}):")
  55. ping_gw = data.get('ping_gateway_ms')
  56. loss_gw = data.get('loss_gateway_percent')
  57. if ping_gw is not None:
  58. report_lines.append(f" Средний пинг: {ping_gw:.2f} мс")
  59. report_lines.append(f" Потеря пакетов: {loss_gw:.2f}%")
  60. else:
  61. report_lines.append(" Не удалось проверить.")
  62. # Пинг до ya.ru
  63. report_lines.append(f" - До {target_host}:")
  64. ping_ext = data.get('ping_ya_ru_ms')
  65. loss_ext = data.get('loss_ya_ru_percent')
  66. if ping_ext is not None:
  67. report_lines.append(f" Средний пинг: {ping_ext:.2f} мс")
  68. report_lines.append(f" Потеря пакетов: {loss_ext:.2f}%")
  69. else:
  70. report_lines.append(" Не удалось проверить (проверьте подключение к Интернету).")
  71. report_lines.append("-" * 30)
  72. # Блок 5: Скорость
  73. report_lines.append(f"📶 Скорость Интернета (Speedtest):")
  74. dl_speed = data.get('download_speed_mbps')
  75. ul_speed = data.get('upload_speed_mbps')
  76. if dl_speed is not None:
  77. report_lines.append(f" Скорость загрузки: {dl_speed:.2f} Мбит/с")
  78. report_lines.append(f" Скорость выгрузки: {ul_speed:.2f} Мбит/с")
  79. report_lines.append(f" Сервер: {data.get('server_name')} ({data.get('server_location')})")
  80. report_lines.append(f" Задержка до сервера: {data.get('server_latency'):.2f} мс")
  81. else:
  82. report_lines.append(" Тестирование скорости не было выполнено или завершилось ошибкой.")
  83. report_lines.append("="*50)
  84. return "\n".join(report_lines)
  85. # --- Функции для измерения ---
  86. def get_network_io_total():
  87. """Получает общий объем отправленных и полученных данных."""
  88. try:
  89. net_io = psutil.net_io_counters()
  90. return {"total_sent": net_io.bytes_sent, "total_recv": net_io.bytes_recv}
  91. except Exception:
  92. return None
  93. def get_network_speed():
  94. """Измеряет скорость загрузки, выгрузки и получает данные о сервере Speedtest."""
  95. try:
  96. st = speedtest.Speedtest()
  97. st.get_best_server()
  98. server = st.best
  99. download_speed = st.download() / 10**6
  100. upload_speed = st.upload() / 10**6
  101. return {
  102. "download_speed_mbps": download_speed, "upload_speed_mbps": upload_speed,
  103. "server_name": server['host'], "server_location": f"{server['country']} ({server['name']})",
  104. "server_latency": server['latency']
  105. }
  106. except Exception:
  107. return None
  108. def get_ping_and_loss(target, count=4):
  109. """Измеряет средний пинг и процент потери пакетов."""
  110. try:
  111. result = python_ping(target, count=count, timeout=2)
  112. return {"avg_ping_ms": result.rtt_avg_ms, "packet_loss_percent": result.packet_loss}
  113. except Exception:
  114. return None
  115. def get_local_net_details():
  116. """Получает локальный IP, MAC-адрес, имя активного интерфейса и IP шлюза."""
  117. details = {"local_ip": None, "mac_address": None, "interface_name": None, "gateway_ip": None}
  118. try:
  119. gws = netifaces.gateways()
  120. default_route = gws.get('default', {}).get(netifaces.AF_INET)
  121. if default_route:
  122. details['gateway_ip'] = default_route[0]
  123. active_interface = default_route[1]
  124. details['interface_name'] = active_interface
  125. addrs = netifaces.ifaddresses(active_interface)
  126. if netifaces.AF_INET in addrs:
  127. details['local_ip'] = addrs[netifaces.AF_INET][0]['addr']
  128. if netifaces.AF_LINK in addrs:
  129. details['mac_address'] = addrs[netifaces.AF_LINK][0]['addr'].upper().replace('-', ':')
  130. except Exception:
  131. pass
  132. return details
  133. def get_system_info():
  134. """Собирает имя хоста и внешний IP."""
  135. info = {"hostname": None, "external_ip": None}
  136. try:
  137. info["hostname"] = socket.gethostname()
  138. except:
  139. pass
  140. try:
  141. response = requests.get('https://api.ipify.org?format=json', timeout=5)
  142. response.raise_for_status()
  143. info["external_ip"] = response.json().get('ip')
  144. except:
  145. pass
  146. return info
  147. # --- Основной запуск ---
  148. if __name__ == "__main__":
  149. data = {}
  150. target_host = 'ya.ru'
  151. output_filename = "network_info_report.txt"
  152. # Сбор данных
  153. print("--- 1. Сбор базовой информации (IP, MAC, Hostname) ---")
  154. data.update(get_system_info())
  155. data.update(get_local_net_details())
  156. io_data = get_network_io_total()
  157. if io_data:
  158. data.update(io_data)
  159. print("Базовые данные собраны. ✅")
  160. # Пинги
  161. if data.get('gateway_ip'):
  162. print(f"\n--- 2. Проверка пинга до шлюза ({data['gateway_ip']}) ---")
  163. ping_gw_data = get_ping_and_loss(data['gateway_ip'])
  164. if ping_gw_data:
  165. data["ping_gateway_ms"] = ping_gw_data["avg_ping_ms"]
  166. data["loss_gateway_percent"] = ping_gw_data["packet_loss_percent"]
  167. print("Проверка завершена. 📶")
  168. print(f"\n--- 3. Проверка пинга до {target_host} ---")
  169. ping_ext_data = get_ping_and_loss(target=target_host)
  170. if ping_ext_data:
  171. data["ping_ya_ru_ms"] = ping_ext_data["avg_ping_ms"]
  172. data["loss_ya_ru_percent"] = ping_ext_data["packet_loss_percent"]
  173. print("Проверка завершена. 🎯")
  174. # Speedtest
  175. print("\n--- 4. Проверка скорости сети (Speedtest) ---")
  176. speed_data = get_network_speed()
  177. if speed_data:
  178. data.update(speed_data)
  179. print("Тестирование скорости завершено. 🚀")
  180. else:
  181. print("Тестирование скорости не выполнено (проверьте интернет-соединение).")
  182. # Форматирование и вывод отчета
  183. report_content = format_report(data, target_host)
  184. print(report_content)
  185. try:
  186. with open(output_filename, 'w', encoding='utf-8') as f:
  187. f.write(report_content)
  188. print(f"\n✅ Отчет успешно сохранен в файле: {output_filename} в папке {os.getcwd()}")
  189. except Exception as e:
  190. print(f"\n❌ Ошибка при записи отчета в файл: {e}")