Простой софт, написанный чатом GPT для просмотра статистики доменов в базе
Не знаю почему вт грязноватый, вот исходный код софта:
Запаковал в exe через auto-py-to-exe
Не знаю почему вт грязноватый, вот исходный код софта:
Python:
import sys
import locale
locale.setlocale(locale.LC_ALL, 'en_US')
from PyQt5.QtWidgets import QApplication, QWidget, QFileDialog, QVBoxLayout, QTableWidget, QTableWidgetItem, \
QPushButton, QHeaderView, QLabel
from PyQt5.QtCore import Qt, QThread, pyqtSignal
class FileLoader(QThread):
updateTable = pyqtSignal(dict)
def __init__(self, filename):
super().__init__()
self.filename = filename
def run(self):
domains = {}
try:
with open(self.filename, 'r', encoding='utf-8', errors='ignore') as f:
for line in f:
try:
email, password = line.strip().split(':')
email = email.lower()
except ValueError:
continue
domain = email.split('@')[-1]
if domain in domains:
domains[domain]['count'] += 1
else:
domains[domain] = {'count': 1, 'percentage': 0}
total = sum([domain['count'] for domain in domains.values()])
for domain in domains.values():
domain['percentage'] = domain['count'] / total * 100
sorted_domains = sorted(domains.items(), key=lambda x: x[1]['percentage'], reverse=True)
domain_data = {}
for i, (domain, stats) in enumerate(sorted_domains):
domain_data[i] = (domain, stats['count'], f'{stats["percentage"]:.2f}%')
self.updateTable.emit(domain_data)
except Exception as e:
self.updateTable.emit({-1: (f'Error: {e}', '', '')})
class EmailStats(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Email Statistics @fr33d4t4')
self.resize(400, 500)
self.table = QTableWidget(self)
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(['Domain', 'Count', 'Percentage'])
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.load_button = QPushButton('Load File', self)
self.load_button.clicked.connect(self.loadFile)
vbox = QVBoxLayout()
vbox.addWidget(self.load_button)
vbox.addWidget(self.table)
self.num_rows_label = QLabel(self)
self.num_rows_label.setAlignment(Qt.AlignRight)
vbox.addWidget(self.num_rows_label)
self.setLayout(vbox)
self.setAcceptDrops(True)
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.accept()
else:
event.ignore()
def dropEvent(self, event):
filename = event.mimeData().urls()[0].toLocalFile()
self.loadFile(filename)
def loadFile(self, filename=None):
if not filename:
filename, _ = QFileDialog.getOpenFileName(self, 'Open File', '', 'Text Files (*.txt)')
if filename:
try:
self.num_rows_label.setText('Loading file...')
self.fileLoader = FileLoader(filename)
self.fileLoader.updateTable.connect(self.updateTable)
self.fileLoader.start()
except Exception as e:
self.table.setRowCount(0)
self.table.setColumnCount(0)
self.table.setHorizontalHeaderLabels([])
self.table.setRowCount(1)
self.table.setItem(0, 0, QTableWidgetItem(f'Error: {e}'))
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
def updateTable(self, domain_data):
self.table.setRowCount(0)
self.table.setRowCount(len(domain_data))
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(['Domain', 'Count', 'Percentage'])
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
for i, data in domain_data.items():
if i == -1:
self.table.setRowCount(1)
self.table.setItem(0, 0, QTableWidgetItem(data[0]))
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
else:
self.table.setItem(i, 0, QTableWidgetItem(data[0]))
self.table.setItem(i, 1, QTableWidgetItem(str(data[1])))
self.table.setItem(i, 2, QTableWidgetItem(data[2]))
num_rows = self.table.rowCount()
self.num_rows_label.setText(f'{num_rows} rows')
# add total count of emails
if num_rows > 0:
count = sum(int(self.table.item(i, 1).text()) for i in range(num_rows))
formatted_count = locale.format_string('%d', count, grouping=True)
self.num_rows_label.setText(
f'{locale.format_string("%d", num_rows, grouping=True)} domains ({formatted_count} emails)')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = EmailStats()
ex.show()
sys.exit(app.exec_())
Запаковал в exe через auto-py-to-exe