#!/usr/bin/env python
# -*- coding: utf-8 -*-
import platform
import psutil
import subprocess
import re
import datetime
import base64
import json
from typing import Dict
from flask import Flask, jsonify, request
app = Flask(__name__)
class SystemInfoEncoder:
@staticmethod
def encrypt_system_info(info: Dict) -> str:
system_data = {
"os": info["os"],
"cpu": info["processor"],
"ram": info["ram"],
}
json_str = json.dumps(system_data)
return base64.b64encode(json_str.encode('utf-8')).decode('utf-8')
@staticmethod
def decrypt_system_info(encrypted_str: str) -> Dict:
decoded_bytes = base64.b64decode(encrypted_str)
return json.loads(decoded_bytes.decode('utf-8'))
class SystemInfo:
def __init__(self):
self.os_info = self._get_os_info()
self.cpu_info = self._get_cpu_info()
self.ram_info = self._get_ram_info()
def _get_os_info(self) -> str:
try:
version = platform.win32_ver()
return f"Windows {version[0]} (Build {version[1]})"
except:
return "Unknown Windows Version"
def _get_cpu_info(self) -> str:
methods = [
self._get_cpu_via_wmic,
self._get_cpu_via_powershell,
self._get_cpu_via_registry
]
for method in methods:
try:
if cpu_info := method():
return self._clean_cpu_name(cpu_info)
except:
continue
return platform.processor() or "Unknown Processor"
def _get_cpu_via_wmic(self) -> str:
output = subprocess.check_output(
"wmic cpu get name",
shell=True,
text=True,
stderr=subprocess.DEVNULL,
timeout=3
)
lines = [line.strip() for line in output.split('\n') if line.strip()]
return lines[1] if len(lines) > 1 else None
def _get_cpu_via_powershell(self) -> str:
command = 'powershell -command "Get-WmiObject Win32_Processor | Select-Object -ExpandProperty Name"'
return subprocess.check_output(
command,
shell=True,
text=True,
stderr=subprocess.DEVNULL,
timeout=3
).strip()
def _get_cpu_via_registry(self) -> str:
command = (
'reg query "HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\'
'CentralProcessor\\0" /v ProcessorNameString'
)
output = subprocess.check_output(
command,
shell=True,
text=True,
stderr=subprocess.DEVNULL,
timeout=3
)
if "ProcessorNameString" in output:
return output.split("REG_SZ")[-1].strip()
return None
def _get_ram_info(self) -> str:
try:
ram_gb = psutil.virtual_memory().total // (1024 ** 3)
return f"{ram_gb} GB"
except:
return "Unknown RAM"
@staticmethod
def _clean_cpu_name(cpu_name: str) -> str:
return re.sub(r'\s+', ' ', cpu_name).strip()
def get_full_info(self) -> Dict:
return {
"os": self.os_info,
"processor": self.cpu_info,
"ram": self.ram_info
}
system_info = SystemInfo()
@app.route('/system-info', methods=['GET'])
def get_system_info():
if request.args.get('encrypted') == 'true':
encrypted = SystemInfoEncoder.encrypt_system_info(system_info.get_full_info())
return jsonify({"encrypted_data": encrypted})
return jsonify({
"data": system_info.get_full_info(),
})
@app.route('/decode-info', methods=['POST'])
def decode_info():
try:
encrypted_data = request.json.get('encrypted_data')
if not encrypted_data:
return jsonify({"error": "Не предоставлены данные"}), 400
decrypted = SystemInfoEncoder.decrypt_system_info(encrypted_data)
return jsonify({
"status": "success",
"decrypted_data": decrypted
})
except Exception as e:
return jsonify({"error": str(e)}), 400
if __name__ == '__main__':
print("\nТестирование шифрования:")
sample_data = system_info.get_full_info()
encrypted = SystemInfoEncoder.encrypt_system_info(sample_data)
decrypted = SystemInfoEncoder.decrypt_system_info(encrypted)
print(f"Оригинальные данные: {sample_data}")
print(f"Зашифрованная строка (первые 50 символов): {encrypted[:50]}...")
print(f"Расшифрованные данные: {decrypted}")
app.run(host='0.0.0.0', port=8181, debug=False)