есть ли библиотека, которая функциональные этой?
# ГРАФИКА
window = Tk()
# Окно
window.geometry('1015x600')
window.title("SniffPcap")
# Кнопки
# Меню (Основное)
menu = Menu(window)
window.config(menu=menu)
new_item = Menu(menu, tearoff=0)
new_item.add_command(label='Авторы')
new_item.add_separator()
new_item.add_command(label='О программе')
menu.add_cascade(label='Файл', menu=new_item)
# Меню 2(база данных)
database_item = Menu(menu, tearoff=0)
database_item.add_command(label='Создать БД', command=database)
database_item.add_separator()
database_item.add_command(label='Открыть БД', command=connect(db))
database_item.add_separator()
database_item.add_command(label='Загрузить данные в БД', command=download(db))
menu.add_cascade(label='База данных', menu=database_item)
#Таблица бд
tree = Treeview(window, columns=("ID","id", "ip_src","ip_dst","sport"),height=7, selectmode='browse')
tree.heading('#0', text='ID')
tree.heading('#1', text='id')
tree.heading('#2', text='ip_src')
tree.heading('#3', text='ip_dst')
tree.heading('#4', text='sport')
tree.heading('#5', text='dport')
tree.column('#0', stretch=YES,anchor=N)
tree.column('#1', stretch=YES,anchor=N)
tree.column('#2', stretch=YES,anchor=N)
tree.column('#3', stretch=YES,anchor=N)
tree.column('#4', stretch=YES,anchor=N)
tree.column('#5', stretch=YES,anchor=N)
tree.column('#0', width=50)
tree.column('#1', width=50)
tree.column('#2', width=110)
tree.column('#3', width=110)
tree.column('#4', width=50)
tree.column('#5', width=50)
tree['show'] = 'headings'
tree.grid(row=2, columnspan=7, sticky="N")
tree.bind('<<TreeviewSelect>>', on_select)
# Поле ввода
txt_in = scrolledtext.ScrolledText(window, width=60, height=15)
txt_out = scrolledtext.ScrolledText(window, width=60, height=15)
txt_log = scrolledtext.ScrolledText(window, width=75, height=10)
txt_in.place(x=5, y=5)
txt_out.place(x=510, y=5)
txt_log.place(x=5, y=260)
tree.place(x=635,y=260)
window.mainloop()
from tkinter import *
from scapy.all import *
from tkinter import scrolledtext
from tkinter import filedialog
from tkinter.ttk import Treeview
from scapy.utils import RawPcapReader
from base import Base as db
import dpkt
import sys
import sqlite3
import os
def clicked():
window.quit()
IPList = list()
IPList_and_port = list()
output_IPList = list()
List_IP = list()
one_session = list()
list_ip_for_sessions = list()
list_tcp = list()
list_for_bd = list()
requests = list()
responses = list()
list_id=list()
def database():
window_database = Tk()
window_database.title("Создание базы данных")
window_database.geometry('250x250')
lbl = Label(window_database, text="Введите имя базы данных:")
lbl.place(x=55, y=60)
txt = Entry(window_database, width=29)
txt.place(x=40, y=90)
btn_db = Button(window_database, text="Создать", command=clicked)
btn_db.place(x=100, y=120)
window_database.mainloop()
txt_database_name = txt.get()
try:
s1 = txt_database_name
s2 = '.db'
name_DB = s1 + s2
sqlite_connection = sqlite3.connect(name_DB)
cursor = sqlite_connection.cursor()
txt_log.insert(INSERT, "База данных SQLite успешно создана\n")
cursor.close()
except sqlite3.Error as error:
txt_log.insert(INSERT, "Ошибка при создании sqlite\n")
txt_log.insert(INSERT, error)
txt_log.insert(INSERT, "\n")
finally:
if (sqlite_connection):
sqlite_connection.close()
window_database.destroy()
def connect(db):
name_DB = filedialog.askopenfilename(filetypes=(("Database", ".db"),))
conn = db.connect(name_DB)
return conn
def download(db):
# подключение к бд
writer=connect(db)
txt_log.insert(INSERT, "База данных ")
name_db = os.path.basename(name_DB)
txt_log.insert(INSERT, name_db)
txt_log.insert(INSERT, " подключена\n")
sqlite_create_table_query='''CREATE TABLE session (id INTEGER PRIMARY KEY ,ip_src TEXT ,ip_dst TEXT ,sport TEXT , dport TEXT ,request TEXT ,response TEXT );'''
writer.create_table(sqlite_create_table_query)
txt_log.insert(INSERT, "Таблица session создана\n")
file = filedialog.askopenfilename(filetypes=(("Trafic files", ".pcap"),))
with open(file, 'rb') as f:
schet = int()
temp = True
pcap = dpkt.pcap.Reader(f)
scapy_cap = rdpcap(file)
txt_log.insert(INSERT, "\n")
txt_log.insert(INSERT, "Протоколы и их количество в файле:\n")
txt_log.insert(INSERT, scapy_cap)
txt_log.insert(INSERT, "\n")
id = 0
for timestamp, buf in pcap:
eth = dpkt.ethernet.Ethernet(buf)
if not isinstance(eth.data, dpkt.ip.IP):
txt_log.insert(INSERT, "Non IP Packet type not supported ")
txt_log.insert(INSERT, eth.data.__class__.__name__)
txt_log.insert(INSERT, "\n")
continue
ip = eth.data
List_IP.append(eth.data)
list_ip_for_sessions.append(0)
if isinstance(ip.data, dpkt.tcp.TCP):
ip_src = socket.inet_ntoa(ip.src)
ip_dst = socket.inet_ntoa(ip.dst)
sport = ip.data.sport
dport = ip.data.dport
for counter in range(len(List_IP)):
ip_dst = socket.inet_ntoa(List_IP[counter].dst)
ip_src = socket.inet_ntoa(List_IP[counter].src)
sport = List_IP[counter].data.sport
dport = List_IP[counter].data.dport
one_session.clear()
for raw in List_IP:
schet += 1
if raw.data.__hdr_len__ >= 20 and raw.data.__hdr_len__ <= 60:
if (ip_dst == socket.inet_ntoa(raw.dst)) and (ip_src == socket.inet_ntoa(raw.src)) and (
sport == raw.data.sport) and (dport == raw.data.dport):
if list_ip_for_sessions[schet] == 0:
list_ip_for_sessions[schet] = 1
try:
request = dpkt.http.Request(raw.data.data)
list_id.append(id)
list_for_bd.append(id)
list_for_bd.append(ip_src)
list_for_bd.append(ip_dst)
list_for_bd.append(sport)
list_for_bd.append(dport)
requests.append(str (request))
new_string_db = tuple(list_for_bd)
query="INSERT INTO session VALUES (?,?,?,?,?,NULL,NULL)"
writer.insert(query, new_string_db)
update_reques_db = tuple(requests)
new_string_request_db = "UPDATE session SET request= (?) WHERE id=" + str(id)
writer.insert(new_string_request_db,update_reques_db)
list_for_bd.clear()
requests.clear()
id = id + 1
except (dpkt.dpkt.NeedData, dpkt.dpkt.UnpackError):
continue
one_session.append(request)
txt_in.insert(INSERT, one_session)
txt_in.insert(INSERT, "\n")
one_session.clear()
if (ip_src == socket.inet_ntoa(raw.dst)) and (ip_dst == socket.inet_ntoa(raw.src)) and (
dport == raw.data.sport) and (sport == raw.data.dport):
if list_ip_for_sessions[schet] == 0:
list_ip_for_sessions[schet] = 1
try:
response = dpkt.http.Response(raw.data.data)
responses.append(str(response))
if len(response)!=0:
update_response_db = tuple(responses)
new_string_response_db = "UPDATE session SET response= (?) WHERE id=" + str(id-1)
dbb.insert(new_string_response_db,update_response_db)
responses.clear()
except (dpkt.dpkt.NeedData, dpkt.dpkt.UnpackError):
continue
one_session.append(response)
txt_out.insert(INSERT, one_session)
txt_out.insert(INSERT, "\n")
else:
txt_log.insert(INSERT, "Используется протокол: ")
txt_log.insert(INSERT, raw.data.__class__.__name__)
txt_log.insert(INSERT, "\n")
schet = -1
query="SELECT ip_src,ip_dst FROM session;"
writer.select_many(query,id)
for id in list_id:
table_id= str(id)
table_ip_src= "SELECT ip_src FROM session WHERE id=" + str(id)
result_ip_src=writer.select_singl(table_ip_src)
table_ip_dst= "SELECT ip_dst FROM session WHERE id=" + str(id)
result_ip_dst=writer.select_singl(table_ip_dst)
table_sport="SELECT sport FROM session WHERE id=" + str(id)
result_sport=writer.select_singl(table_sport)
table_dport="SELECT dport FROM session WHERE id=" + str(id)
result_dport=writer.select_singl(table_dport)
tree.insert("", END,text=id, values=(table_id, result_ip_src, result_ip_dst, result_sport, result_dport))
table_id=""
result_ip_src=""
result_ip_dst=""
result_sport=""
result_dport=""
# отключение бд
writer.close()
txt_log.insert(INSERT, "Соединение с SQLite закрыто\n")
def on_select(event,db):
#print(tree.selection())
# Если привязывались не к событию <<TreeviewSelect>>,
# то тут нужно проверить, что вообще что-то выбрано:
if not tree.selection():
return
# Получаем id первого выделенного элемента
selected_item = tree.selection()[0]
# Получаем значения в выделенной строке
values = tree.item(selected_item, option="values")
print(db.db_name)
print(values[0])
def database():
window_database = Tk()
.....
try:
s1 = txt_database_name
s2 = '.db'
name_DB = s1 + s2
sqlite_connection = sqlite3.connect(name_DB)
cursor = sqlite_connection.cursor()
txt_log.insert(INSERT, "База данных SQLite успешно создана\n")
cursor.close()
s1 = txt_database_name
sqlite_connection = sqlite3.connect(s1+'.db')
#Меньше кода меньше проблем с поиском, что откуда пришло
class base:
def __init__( self ):
self.main_database_name=None
создаем ненужную переменную
def connect(self,main_database_name):
self.main_database_name=main_database_name
в ненужную переменную ложим нужную
self.sqlite_connection = sqlite3.connect(main_database_name)
и только тут её используем
class base:
def __init__( self ):
pass
def connect(self,main_database_name):
self.sqlite_connection = sqlite3.connect(main_database_name)
работать примерно вот так. Ключевое слово примерно
Кто же класс работы с базой обвешивает print'ами?А кто на этом сайте воооообще вопросы задаёт? По моему мнению школьники. Кому нужна рабочая база тот читает мануал. И вставляет return try..except и тд
Плейсхолдеры не слышали, SQL-инъекций не боимся.Те кто слышал и боится, на этом сайте вопросы не задают.
а если бот через неделю работы помрёт, мы что, потеряем все данные?..Вот тут как бы и согласен... Но ещё раз повторюсь: данный код не для рабочего приложения...
import os
import shutil
import subprocess
import sys
import zipfile
from multiprocessing import process
from PyQt5.QtWidgets import QApplication, QProgressBar, QWidget, QLineEdit, QPushButton, \
QVBoxLayout, QHBoxLayout
from PyQt5.QtCore import QThread, pyqtSignal
import urllib.request
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Helper():
"""Help to you"""
def __init__(self, zip_arhiv):
super(Helper, self).__init__()
self.zip_arhiv = zip_arhiv
def unzip_all_files(self, extract_folder):
zf = zipfile.ZipFile(self.zip_arhiv, 'r')
try:
for _ in zf.namelist():
zf.extractall(extract_folder+'//'+self.zip_arhiv.split('.')[0])
return True
except Exception as e:
print(e)
return False
@property
def files(self):
_zf = zipfile.ZipFile(self.zip_arhiv, 'r')
return _zf.namelist()
class Downloader(QThread):
# Сигнал о количестве данных (PyQt5)
preprogress = pyqtSignal(float)
progress = pyqtSignal(float)
# fileUrl - url - файла, включая сам файл
# filename - имя файла
def __init__(self, fileUrl, fileName):
QThread.__init__(self)
# Флаг инициализации
self._init = False
self.fileUrl = fileUrl
self.fileName = fileName
def run(self):
# тест на локальных данных, но работать должно и с сетью
r = urllib.request.urlretrieve(self.fileUrl, self.fileName, self._progress)
if r:
arhiv = Helper(self.fileName)
print(arhiv.files)
if arhiv.unzip_all_files('c://test'):
print('All files was unziped!')
def _progress(self, block_num, block_size, total_size):
if not self._init:
self.preprogress.emit(total_size)
self._init = True
# Расчет текущего количества данных
downloaded = block_num * block_size
if downloaded < total_size:
# Отправляем промежуток
self.progress.emit(downloaded)
else:
# Чтобы было 100%
self.progress.emit(total_size)
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(100, 100, 600, 180)
self.setWindowTitle('GTO Games')
self.downloader = None
self.fileUrl = QLineEdit('https://www.7-zip.org/a/7za920.zip')
self.buttonga = QPushButton('Играть', self)
self.loadButton = QPushButton('Скачать', self)
self.buttonga.move(10, 10)
self.loadButton.move(10, 50)
lambda: self.unzipp(self.fileUrl,'c://test')
self.unzipButton = QPushButton('Распаковать', self)
self.unzipButton.move(120, 10)
self.unzipButton.clicked.connect(lambda z: self.unzipp(self.fileUrl.text().split('/')[-1],'c://test'))
self.loadButton.clicked.connect(self._loadFile)
hbox = QHBoxLayout()
hbox.addWidget(self.loadButton)
vbox = QVBoxLayout(self)
vbox.addLayout(hbox)
self.bar = QProgressBar()
vbox.addWidget(self.bar)
def initializeUI(self):
self.buttonga.clicked.connect(self.exerun)
self.show()
def _loadFile(self):
ar = self.fileUrl.text().split('/')
if len(ar) == 0:
return
fileName = f'{ar[len(ar) - 1]}'
print(fileName)
self._download = Downloader(self.fileUrl.text(), fileName)
# Устанавливаем максимальный размер данных
self._download.preprogress.connect(lambda x: self.bar.setMaximum(round(x)))
# Промежуточный/скачанный размер
self._download.progress.connect(lambda d: self.bar.setValue(round(d)))
self._download.start()
print("D_Start")
self.loadButton.hide()
def unzipp(self, arhiv_path,extract_path):
print('Hera are you')
print(arhiv_path)
print(extract_path)
arhiv = Helper(arhiv_path)
#print(arhiv.files)
if arhiv.unzip_all_files(extract_path):
print('All files was unziped!')
def exerun(self):
# z = zipfile.ZipFile('Mods.zip', 'w') # Создание нового архива
# for root, dirs, files in os.walk('./'): # Список всех файлов и папок в директории folder
# for file in files:
# z.write(os.path.join(root, file)) # Создание относительных путей и запись файлов в архив
#
# z.close()
args = [r".\Vintagestory.exe", "--connect=xx.xxx.xxx.xx", "--pw=9029"]
subprocess.call(args)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
Я скопировал смайл из телеги и просто вставил в редактор.