• Как вывести в консодь unicode Python?

    @Alexa2007
    Ну это будет работать только на Вашем телефоне. В остальных консолях будет хрень.
    Я скопировал смайл из телеги и просто вставил в редактор.
  • Как сделать анимированную загрузку?

    @Alexa2007
    MinTnt, Кк только автор получит ответ на свой вопрос, сразу же начнет спрашивать, а как туда передать прогресс загрузки
    есть ли библиотека, которая функциональные этой?

    А тут и библиотека функциональнее и код готовый, удаляй лишнее и дописывай своё....

    Но раз уж хочется так, то ответ тоже оставлю
  • Как сделать анимированную загрузку?

    @Alexa2007
    MinTnt, Там рабочий вариант загрузки с прогресбаром.
  • Как передать имя базы данных в другую функцию?

    @Alexa2007
    Так же советую участки кода разбить по функционалу на функции в разные файлы и импортировать
  • Как передать имя базы данных в другую функцию?

    @Alexa2007
    # ГРАФИКА
    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()
  • Как передать имя базы данных в другую функцию?

    @Alexa2007
    Немного подкрутил

    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])
  • Как передать имя базы данных в другую функцию?

    @Alexa2007
    Смотрите..Скопируйте папку того как есть сейчас, чтоб не испортить весь труд. И вносите только те коррективы которые пожелаете. К сожалению из-за многих ненужных мне импортов я не смогу запустить код полностью, но выскажу рекомендации и ошибки.
    Во первых тут вы создаёте подключение вручную, а не из класса
    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)

    Ну и тд..
  • Как сделать анимированную загрузку?

    @Alexa2007
    Вот рабочий пример одного из вариантов
  • Как передать имя базы данных в другую функцию?

    @Alexa2007
    Проблема в том, что ошибки элементарные и вам бы не мешало самому их решать, а если желаете помощи, то выкладывайте код. Потому как в том коде что вы выложили о файловом менеджере ни слова... Вы изменили метод. И теперь необходимо менять все строки где он вызывается
  • Как передать имя базы данных в другую функцию?

    @Alexa2007
    К сожалению не видно весь код, но ошибка вызвана в той строке когда вы вызываете метод download
    Так как вы изменили метод, добавив db
    def download(db):
    То теперь в том месте где вы вызываете этот метод необходимо добавить db в скобочки
    download(db)
  • Как добавить sqlite3 в teleboy python?

    @Alexa2007
    shurshur, О! f-string круто! Перечитай вопрос. Сразу видно, что товарищ скопировал два листинга и просит их соединить. Знания python отсутствуют полностью. Так что сразу Лутца отправлять читать? По факту Да. Но я стараюсь не отталкивать людей от программирования полностью и сразу. Часто видно, что это дети. Душить в них энтузиазм толстыми книгами не хочется. А у многих в работе ситуация так сложилась, а программирование это не их(на фриланс не у всех есть средства, а вопрос легкий.. чего бы не помочь). Кто не захочет тот сам отойдёт. Но учитывая Вашу правоту в некоторых вопросах изменил код в ссылке. Спасибо за замечание.
  • Как добавить sqlite3 в teleboy python?

    @Alexa2007
    shurshur, ужас, а не комментарий. А самое главное смешной. Если вы не заметили
    работать примерно вот так
    . Ключевое слово примерно

    Кто же класс работы с базой обвешивает print'ами?
    А кто на этом сайте воооообще вопросы задаёт? По моему мнению школьники. Кому нужна рабочая база тот читает мануал. И вставляет return try..except и тд
    Плейсхолдеры не слышали, SQL-инъекций не боимся.
    Те кто слышал и боится, на этом сайте вопросы не задают.
    Блин ну что за бред вообще..Вы почитайте вопрос. Для ответа на него и одного курса видеоуроков хватит.

    Данный код не для работы, а для демонстрации работы с базой через класс.

    а если бот через неделю работы помрёт, мы что, потеряем все данные?..
    Вот тут как бы и согласен... Но ещё раз повторюсь: данный код не для рабочего приложения...
  • Как дать информацию для Телеграм бота python?

    @Alexa2007
    По моему я дал обширный ответ... лучше удалите один из вопросов, а то удалят оба.
  • Как создать скрипт или бота который будет редактировать нужный файл?

    @Alexa2007
    etozhesano, В первой идее ответа на вопрос, я хотел предложить адаптировать и использовать PIL, так как для python это оптимальный вариант. Но как выяснилось, есть возможность использовать сам Photoshop. Для этого необходимо импортировать СОМ объект и обращаться к нему. Вот пример. Впервые с ней познакомился на delphi, есть возможность запуска из .vbs файлов (CreateObject("SAPI.SpVoice").Speak"It is com object for vbs") так что думаю и для Java есть вариант.
  • Как выбрать таблицу, на которой произведен клик в списке?

    @Alexa2007
    А можно код...а то не понятно
    Сейчас я могу открывать по двойному клику таблицу

    подскажите как открывать таблицу прямо из списка
  • Как распаковать скачанный архив в приложение python + pyqt5 GUI?

    @Alexa2007
    Ну во первых: Архив распаковывается сам и автоматически, то есть вызывать функцию уже нет необходимости.
    Но если она есть: вам придется переосмыслить структуру кода. Всё зависит от того на сколько глобальный проект. Кто и как им будет пользоваться. Если это утилитка для себя... не морочтесь с классами.. пару функций и пойдет.. Если это большой проект для себя.. то классы это норм, но тогда создайте ещё один и вытягивайте от туда метод unzip в любом из своих классов. Возможно передавать этот класс в конструкторе.. Рабочий код у вас есть, а вот как правильно провести рефакторинг это сугубо личное мнение. Конкретного ответа нет ни у кого. И в данной ситуации я могу помочь только ссылками на туториалы. Но гладя на ваш код... думаю ничего нового вы не узнаете.

    К примеру парсер веб страниц привязывается к конкретным классам или другим тегам. Но стоит дизайнерам обновить страницу и весь код парсера равен нулю. Поэтому заморачиваться с таким видом утилит особо смысла нет. Вот и вы подумайте на сколько много кода вы готовы писать, улучшать, оптимизировать и стоит ли оно того

    И дефис перед именем файла пришлось убрать.. дабы не усугублять код, но можете поковыряться сами

    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_())
  • Здравствуйте! Не работает Telegram bot, созданный на питоне, а именно одна из его частей. Что делать?

    @Alexa2007
    rustam4iknagiev, Оберните пожалуйста код в >, а то проблем только добавилось.
    Так же пару вопросов: Бот вообще работал? Или это тестовая сборка. Если он работал оптимизируй вот так! И масштабировать станет легче. Но пока код оберни в теги.. А то толку от него не особо ... без отступов))