• 使用python编写的简单远程管理软件


    因为用户可以选择是否同意被控制,所以并不算是木马。

    使用python3.7,spyder,在windows 10 开发。

    client为控制端,server为被控端。

    参考 mygithub https://github.com/TouwaErioH/simple-trojan

    server.py

    # -*- coding: utf-8 -*-
    """
    Created on Sun Jun 23 19:33:37 2019
    @author: frame by SmallBillows(GWT)  function by erio(LQ)
    """
    
    import wx
    import os
    import numpy as np
    from PIL import ImageGrab 
    import socket
    import sys
    import struct
    import cv2
    import pyaudio
    import wave
    
    HOST = '127.0.0.1'
    PORT = 51327
    input_filenamescr = "screen.jpg"                         
    input_filepath = "E:"          
    in_pathscr = input_filepath + input_filenamescr  
    input_filename = "record.wav"                          # 麦克风采集的语音输入
    input_filepath = "E:"              # 输入文件的path
    in_pathrec = input_filepath + input_filename  
    input_filenamecam = "camera.jpg"                         
    input_filepath = "E:"          
    in_pathcam = input_filepath + input_filenamecam   
    
    
    
    def get_screen(filepatha):    #摄像头截图
           img = ImageGrab.grab()
           img.save(filepatha)
    
    
    def get_audio(filepath):  #麦克风录音
            CHUNK = 256                 #定义数据流块
            FORMAT = pyaudio.paInt16    #量化位数(音量级划分)
            CHANNELS = 1               # 声道数;声道数:可以是单声道或者是双声道
            RATE = 8000                # 采样率;采样率:一秒内对声音信号的采集次数,常用的有8kHz, 16kHz, 32kHz, 48kHz, 11.025kHz, 22.05kHz, 44.1kHz
            RECORD_SECONDS = 10          #录音秒数
            WAVE_OUTPUT_FILENAME = filepath     #wav文件路径
            p = pyaudio.PyAudio()               #实例化
    
            stream = p.open(format=FORMAT,
                            channels=CHANNELS,
                            rate=RATE,
                            input=True,
                            frames_per_buffer=CHUNK)
           # print("*"*10, "开始录音:请在5秒内输入语音")
            frames = []                                                 #定义一个列表
            for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):      #循环,采样率11025 / 256 * 5
                data = stream.read(CHUNK)                               #读取chunk个字节 保存到data中
                frames.append(data)                                     #向列表frames中添加数据data
          #  print(frames)
          #  print("*" * 10, "录音结束
    ")
    
            stream.stop_stream()
            stream.close()          #关闭
            p.terminate()           #终结
    
            wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')                  #打开wav文件创建一个音频对象wf,开始写WAV文件
            wf.setnchannels(CHANNELS)                                   #配置声道数
            wf.setsampwidth(p.get_sample_size(FORMAT))                  #配置量化位数
            wf.setframerate(RATE)                                       #配置采样率
            wf.writeframes(b''.join(frames))                            #转换为二进制数据写入文件
            wf.close()              #关闭
            
    #拍照
     
    def get_camera(filepath):
       cap=cv2.VideoCapture(0)
       ret,frame = cap.read()
       i=0;
       cv2.imwrite(filepath,frame)
       cap.release()
       cv2.destroyAllWindows()        
    
    
    class MainWindow(wx.Frame):
        def __init__(self,parent,title):
            self.dirname = ''
            wx.Frame.__init__(self,parent,title=title,size=(200,-1))
            self.contrl = wx.Frame() #暂时不用这个控件
            self.CreateStatusBar()# 创建位于窗口的底部的状态栏
    
            #设置菜单
            filemenu = wx.Menu()
    
            menuOpen = filemenu.Append(wx.ID_OPEN,"&Open","Open a file")
            menuAbout = filemenu.Append(wx.ID_ABOUT,"&About","Information about this program") #(ID, 项目名称, 状态栏信息)
            filemenu.AppendSeparator()  #分割线
            menuExit = filemenu.Append(wx.ID_EXIT,"&Exit","Terminate the program") # (ID, 项目名称, 状态栏信息)
    
    
            #创建菜单栏
            menuBar = wx.MenuBar()
            menuBar.Append(filemenu, "&File") #在菜单栏中添加filemenu菜单
            self.SetMenuBar(menuBar) #在frame中添加菜单栏
    
            #设置 events
            self.Bind(wx.EVT_MENU, self.OnOpen, menuOpen)
            self.Bind(wx.EVT_MENU, self.OnAbout,menuAbout)
            self.Bind(wx.EVT_MENU, self.OnExit,menuExit)
    
            #设置 sizer
            self.sizer2 = wx.BoxSizer(wx.HORIZONTAL)
            self.buttons = []
            self.buttons.append(wx.Button(self, -1, "开启服务器"))
            self.sizer2.Add(self.buttons[0], 1, wx.SHAPED)
            self.buttons.append(wx.Button(self, -1, "quit"))
            self.sizer2.Add(self.buttons[1], 1, wx.SHAPED)
            self.sizer = wx.BoxSizer(wx.VERTICAL)
            self.sizer.Add(self.contrl,1,wx.EXPAND)
            self.sizer.Add(self.sizer2,0,wx.GROW)
            
            self.Bind(wx.EVT_BUTTON, self.OpenServer, self.buttons[0])
            self.Bind(wx.EVT_BUTTON, self.Quit, self.buttons[1])
    
            #激活sizer
            self.SetSizer(self.sizer)
            self.SetAutoLayout(True)
            self.sizer.Fit(self)
            self.Show(True)
            
            
        def OpenServer(self,e):
                s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                print('waiting ------->')
                s.connect((HOST,PORT))       
                dlg = wx.MessageDialog(None, "connected with:"+HOST+"对方将控制你的机器", "Check", wx.YES_NO)
                if dlg.ShowModal() == wx.ID_NO:
                        trigger = '0'
                        s.sendall(trigger.encode())
                        dlg = wx.MessageDialog(self,'拒绝被控制',"Connection",wx.OK)
                        dlg.ShowModal() #显示对话框
                        dlg.Destroy()   #当结束之后关闭对话框
                        self.Close(True)
                else:
                     dlg = wx.MessageDialog(self,'同意被控制',"Connection",wx.OK)
                     dlg.ShowModal() #显示对话框
                     dlg.Destroy()   #当结束之后关闭对话框
                     trigger = '1'
                     s.sendall(trigger.encode())
                while True:
                 data = s.recv(1024)
                 data = data.decode()
                 if data.lower() == '1':
                   print('对方将获取你的屏幕截图')
                   get_screen(in_pathscr)
                   filepath = in_pathscr
                   if os.path.isfile(filepath):
                       fileinfo_size = struct.calcsize('128sl')
                       fhead = struct.pack('128sl', bytes(os.path.basename(filepath).encode()),os.stat(filepath).st_size)  #encode很重要
                       s.send(fhead)
                       print ('client filepath: {0}'.format(filepath))  #
                       fp = open(filepath, 'rb')  # rb 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
                       while 1:
                           data = fp.read(1024)
                           if not data:
                               print ('{0} file send over...'.format(filepath))
                               break
                           s.send(data)
                 elif data.lower() == '2':
                       print('对方将获取你的录音')
                       get_audio(in_pathrec)
                       filepath = in_pathrec
                       if os.path.isfile(filepath):
                           fileinfo_size = struct.calcsize('128sl')
                           fhead = struct.pack('128sl', bytes(os.path.basename(filepath).encode()),os.stat(filepath).st_size)  #encode很重要
                           s.send(fhead)
                           print ('client filepath: {0}'.format(filepath))  #
                           fp = open(filepath, 'rb')  # rb 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
                           while 1:
                               data = fp.read(1024)
                               if not data:
                                   print ('{0} file send over...'.format(filepath))
                                   break
                               s.send(data)    
                 elif data.lower() == '3':
                       print('对方将获取你的摄像头拍照')
                       get_camera(in_pathcam)
                       filepath = in_pathcam
                       if os.path.isfile(filepath):
                           fileinfo_size = struct.calcsize('128sl')
                           fhead = struct.pack('128sl', bytes(os.path.basename(filepath).encode()),os.stat(filepath).st_size)  #encode很重要
                           s.send(fhead)
                           print ('client filepath: {0}'.format(filepath))  #
                           fp = open(filepath, 'rb')  # rb 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
                           while 1:
                               data = fp.read(1024)
                               if not data:
                                   print ('{0} file send over...'.format(filepath))
                                   break
                               s.send(data) 
                 elif data.lower() == '4':
                     fileinfo_size=struct.calcsize('128sl')
                     buf = s.recv(fileinfo_size)
                     if buf:
                         filename, filesize = struct.unpack('128sl', buf)
                         fn = filename.decode().strip('0')                             #Python strip() 方法用于删除字符串头部和尾部指定的字符,默认字符为所有空字符,包括空格、换行(
    )、制表符(	)等。
                         new_filename = os.path.join('./', 'new_' + fn)
                         print ('file new name is {0}, filesize is {1}'.format(new_filename,
                                                                         filesize))
                         
                         recvd_size = 0  # 定义已接收文件的大小
                         dlg = wx.MessageDialog(self,'在server路径下收到文件'+new_filename,"Connection",wx.OK)
                         dlg.ShowModal() #显示对话框
                         dlg.Destroy()   #当结束之后关闭对话框
                         fp = open(new_filename, 'wb')
                         print ('start receiving...')
                         
                         while not recvd_size == filesize:
                             if filesize - recvd_size > 1024:
                                 data = s.recv(1024)
                                 recvd_size += len(data)
                             else:
                                     data = s.recv(filesize - recvd_size)
                                     recvd_size = filesize
                             fp.write(data)
                         fp.close()
                         print ('end receive...')
                 elif data.lower() == '5':
                       print('对方将获取你的E:jojo.txt') #这里应该先接收路径,处理后将该文件发给client
                       filepath = 'E:jojo.txt'   #简单点,发送E:jojo.txt
                       if os.path.isfile(filepath):
                           fileinfo_size = struct.calcsize('128sl')
                           fhead = struct.pack('128sl', bytes(os.path.basename(filepath).encode()),os.stat(filepath).st_size)  #encode很重要
                           s.send(fhead)
                           print ('client filepath: {0}'.format(filepath))  #
                           fp = open(filepath, 'rb')  # rb 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
                           while 1:
                               data = fp.read(1024)
                               if not data:
                                   print ('{0} file send over...'.format(filepath))
                                   break
                               s.send(data) 
                 elif data.lower() == '-1':
                      s.close()
                      self.Close(True)
                       
                
    
        def Quit(self,e):
            self.Close(True)
            
        def OnAbout(self,e):
            #创建一个带"OK"按钮的对话框。wx.OK是wxWidgets提供的标准ID
            dlg = wx.MessageDialog(self,"小组成员:刘Q 郭WT","About Editors",wx.OK)
            dlg.ShowModal() #显示对话框
            dlg.Destroy()   #当结束之后关闭对话框
    
        def OnExit(self,e):
            self.Close(True)  #关闭整个frame
    
        def OnOpen(self,e):
            dlg = wx.FileDialog(self,"Choose a file",self.dirname,"","*·*",wx.FD_OPEN)
            if dlg.ShowModal() == wx.ID_OK:
                self.filename = dlg.GetFilename()
                self.dirname = dlg.GetDirectory()
                f = open(os.path.join(self.dirname,self.filename),'r')#暂时只读
                self.contrl.SetValue(f.read())
                f.colse()
            dlg.Destroy()
            
    if __name__ == '__main__':
        
        app = wx.App(False)
        frame = MainWindow(None,title="Server")
        app.MainLoop()
        
                
                

    client.py

    # -*- coding: utf-8 -*-
    """
    Created on Sun Jun 23 19:33:37 2019
    
    @author: frame by SmallBillows(GWT)  function by erio(LQ)
    """
    
    import wx
    import os
    import numpy as np
    import time
    from PIL import ImageGrab 
    import socket
    import sys
    import struct
    
    HOST = '127.0.0.1'
    PORT = 51327
    func='-1'
    
    class MainWindow(wx.Frame):
        def __init__(self,parent,title):
            self.dirname = ''
            wx.Frame.__init__(self,parent,title=title,size=(200,-1))
            self.contrl = wx.Frame() #暂时不用这个控件
            self.CreateStatusBar()# 创建位于窗口的底部的状态栏
    
            #设置菜单
            filemenu = wx.Menu()
    
            menuOpen = filemenu.Append(wx.ID_OPEN,"&Open","Open a file")
            menuAbout = filemenu.Append(wx.ID_ABOUT,"&About","Information about this program") #(ID, 项目名称, 状态栏信息)
            filemenu.AppendSeparator()  #分割线
            menuExit = filemenu.Append(wx.ID_EXIT,"&Exit","Terminate the program") # (ID, 项目名称, 状态栏信息)
    
    
            #创建菜单栏
            menuBar = wx.MenuBar()
            menuBar.Append(filemenu, "&File") #在菜单栏中添加filemenu菜单
            self.SetMenuBar(menuBar) #在frame中添加菜单栏
    
            #设置 events
            self.Bind(wx.EVT_MENU, self.OnOpen, menuOpen)
            self.Bind(wx.EVT_MENU, self.OnAbout,menuAbout)
            self.Bind(wx.EVT_MENU, self.OnExit,menuExit)
    
            #设置 sizer
            self.sizer2 = wx.BoxSizer(wx.HORIZONTAL)
            self.buttons = []
            self.buttons.append(wx.Button(self, -1, "文件浏览"))
            self.sizer2.Add(self.buttons[0], 1, wx.SHAPED)
            self.buttons.append(wx.Button(self, -1, "文件上传"))
            self.sizer2.Add(self.buttons[1], 1, wx.SHAPED)
            self.buttons.append(wx.Button(self, -1, "文件下载"))
            self.sizer2.Add(self.buttons[2], 1, wx.SHAPED)
            self.buttons.append(wx.Button(self, -1, "文件执行"))
            self.sizer2.Add(self.buttons[3], 1, wx.SHAPED)
            self.buttons.append(wx.Button(self, -1, "开启摄像头"))
            self.sizer2.Add(self.buttons[4], 1, wx.SHAPED)
            self.buttons.append(wx.Button(self, -1, "开启麦克风"))
            self.sizer2.Add(self.buttons[5], 1, wx.SHAPED)
            self.buttons.append(wx.Button(self, -1, "OpenClient"))
            self.sizer2.Add(self.buttons[6], 1, wx.SHAPED)
            self.buttons.append(wx.Button(self, -1, "屏幕截屏"))
            self.sizer2.Add(self.buttons[7], 1, wx.SHAPED)
            self.buttons.append(wx.Button(self, -1, "quit"))
            self.sizer2.Add(self.buttons[8], 1, wx.SHAPED)
            self.sizer = wx.BoxSizer(wx.VERTICAL)
            self.sizer.Add(self.contrl,1,wx.EXPAND)
            self.sizer.Add(self.sizer2,0,wx.GROW)
            
            self.Bind(wx.EVT_BUTTON, self.Fileview, self.buttons[0])
            self.Bind(wx.EVT_BUTTON, self.FileUpload, self.buttons[1])
            self.Bind(wx.EVT_BUTTON, self.FileDownload, self.buttons[2])
            self.Bind(wx.EVT_BUTTON, self.FileExecute, self.buttons[3])
            self.Bind(wx.EVT_BUTTON, self.OpenCamera, self.buttons[4])
            self.Bind(wx.EVT_BUTTON, self.OpenMicrophone, self.buttons[5])
            self.Bind(wx.EVT_BUTTON, self.OpenClient, self.buttons[6])
            self.Bind(wx.EVT_BUTTON, self.ScreenView, self.buttons[7])
            self.Bind(wx.EVT_BUTTON, self.Quit, self.buttons[8])
    
            #激活sizer
            self.SetSizer(self.sizer)
            self.SetAutoLayout(True)
            self.sizer.Fit(self)
            self.Show(True)
            
            
            
            
            
        def Fileview(self,e):
            
            dlg = wx.MessageDialog(self,"使用简单的遍历就可以获取路径,思路简单。但是我想要做成图形化的显示,时间所限暂时未完成","Fileview",wx.OK)
            dlg.ShowModal() #显示对话框
            dlg.Destroy()
            
        def FileUpload(self,e):
            func='4'
            dlg = wx.MessageDialog(self,"将上传指定文件到server路径下","FileUpload",wx.OK)
            dlg.ShowModal() #显示对话框
            dlg.Destroy()
            #print('将上传指定文件到server路径下')
            send = func
            conn.sendall(send.encode())
            '''
            path_text = wx.TextCtrl(frame, pos=(5, 5), size=(350, 24))
            print(path_text)
            这里可以用textctrl获取想要上传的文件的路径。
            方便起见,我们先上传固定路径的某个文件
            '''
            filepath = 'E:test.txt'
            if os.path.isfile(filepath):
                       fileinfo_size = struct.calcsize('128sl')
                       fhead = struct.pack('128sl', bytes(os.path.basename(filepath).encode()),os.stat(filepath).st_size)  #encode很重要
                       conn.send(fhead)
                       print ('client filepath: {0}'.format(filepath))  #
                       fp = open(filepath, 'rb')  # rb 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
                       while 1:
                           data = fp.read(1024)
                           if not data:
                               print ('{0} file send over...'.format(filepath))
                               break
                           conn.send(data)
            dlg = wx.MessageDialog(self,"Upload E:test.txt","FileUpload",wx.OK)
            dlg.ShowModal() #显示对话框
            dlg.Destroy()
            
        def FileDownload(self,e):
            func='5'
            dlg = wx.MessageDialog(self,"将下载指定文件到client路径下","FileDownload",wx.OK)
            dlg.ShowModal() #显示对话框
            dlg.Destroy()
           # print('将下载指定文件到client路径下')
            send = func                            #这里应该输入fileview获取的server某个文件的路径,传送到server,server将该文件传送过来
            conn.sendall(send.encode())
            fileinfo_size=struct.calcsize('128sl')   #简单点,只下载server E:jojo.txt
            buf = conn.recv(fileinfo_size)
            if buf:
                filename, filesize = struct.unpack('128sl', buf)
                fn = filename.decode().strip('0')                             #Python strip() 方法用于删除字符串头部和尾部指定的字符,默认字符为所有空字符,包括空格、换行(
    )、制表符(	)等。
                new_filename = os.path.join('./', 'new_' + fn)
                print ('file new name is {0}, filesize is {1}'.format(new_filename,
                                                                     filesize))
    
                recvd_size = 0  # 定义已接收文件的大小
                fp = open(new_filename, 'wb')
                print ('start receiving...')
    
                while not recvd_size == filesize:
                    if filesize - recvd_size > 1024:
                        data = conn.recv(1024)
                        recvd_size += len(data)
                    else:
                        data = conn.recv(filesize - recvd_size)
                        recvd_size = filesize
                    fp.write(data)
                fp.close()
                print ('end receive...')
            
            dlg = wx.MessageDialog(self,"Download E:jojo.txt from server to client's path!","FileDownload",wx.OK)
            dlg.ShowModal() #显示对话框
            dlg.Destroy()
            
        def FileExecute(self,e):
            
            dlg = wx.MessageDialog(self,"使用os.system转换路径,然后执行文件。时间所限暂时未完成","FileExecute",wx.OK)
            dlg.ShowModal() #显示对话框
            dlg.Destroy()
        
        def OpenCamera(self,e):
            func='3'
            print('将获取被控制端的摄像头拍照')
            send = func
            conn.sendall(send.encode())
            fileinfo_size=struct.calcsize('128sl')
            buf = conn.recv(fileinfo_size)
            if buf:
                filename, filesize = struct.unpack('128sl', buf)
                fn = filename.decode().strip('0')                             #Python strip() 方法用于删除字符串头部和尾部指定的字符,默认字符为所有空字符,包括空格、换行(
    )、制表符(	)等。
                new_filename = os.path.join('./', 'new_' + fn)
                print ('file new name is {0}, filesize is {1}'.format(new_filename,
                                                                     filesize))
    
                recvd_size = 0  # 定义已接收文件的大小
                fp = open(new_filename, 'wb')
                print ('start receiving...')
    
                while not recvd_size == filesize:
                    if filesize - recvd_size > 1024:
                        data = conn.recv(1024)
                        recvd_size += len(data)
                    else:
                        data = conn.recv(filesize - recvd_size)
                        recvd_size = filesize
                    fp.write(data)
                fp.close()
                print ('end receive...')
            dlg = wx.MessageDialog(self,"已经收到被控端摄像头拍照文件","Camera",wx.OK)
            dlg.ShowModal() #显示对话框
            dlg.Destroy()
           # frame2 = wx.Frame(None,-1,title='OpenCamera',size=(400,-1))
           # frame2.Show()
            
        def OpenMicrophone(self,e):
            func='2'
            print('将获取被控制端的麦克风录音')
            send = func
            conn.sendall(send.encode())
            fileinfo_size=struct.calcsize('128sl')
            buf = conn.recv(fileinfo_size)
            if buf:
                filename, filesize = struct.unpack('128sl', buf)
                fn = filename.decode().strip('0')                             #Python strip() 方法用于删除字符串头部和尾部指定的字符,默认字符为所有空字符,包括空格、换行(
    )、制表符(	)等。
                new_filename = os.path.join('./', 'new_' + fn)
                print ('file new name is {0}, filesize is {1}'.format(new_filename,
                                                                     filesize))
    
                recvd_size = 0  # 定义已接收文件的大小
                fp = open(new_filename, 'wb')
                print ('start receiving...')
    
                while not recvd_size == filesize:
                    if filesize - recvd_size > 1024:
                        data = conn.recv(1024)
                        recvd_size += len(data)
                    else:
                        data = conn.recv(filesize - recvd_size)
                        recvd_size = filesize
                    fp.write(data)
                fp.close()
                print ('end receive...')
            dlg = wx.MessageDialog(self,"已经收到被控端录音文件","Camera",wx.OK)
            dlg.ShowModal() #显示对话框
            dlg.Destroy()
           # frame3 = wx.Frame(None,-1,title='OpenMicrophone',size=(400,-1))
           # frame3.Show()
            
        def OpenClient(self,e):
            global line
            line = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            line.bind((HOST,PORT))
            line.listen(3)
            global conn,addr
            conn,addr=line.accept()
            '''
            dlg = wx.MessageDialog(self,addr,"Connected",wx.OK)
            dlg.ShowModal() #显示对话框
            dlg.Destroy()   #当结束之后关闭对话框
            '''
            data = conn.recv(1024)
            data = data.decode() 
            if data=='0':
             dlg = wx.MessageDialog(self,'对方拒绝被控制,断开连接',"Connection",wx.OK)
             dlg.ShowModal() #显示对话框
             dlg.Destroy()   #当结束之后关闭对话框
            else:
             dlg = wx.MessageDialog(self,'对方同意被控制',"Connection",wx.OK)
             dlg.ShowModal() #显示对话框
             dlg.Destroy()   #当结束之后关闭对话框
            
            
        def ScreenView(self,e):
            func='1'
            print('将获取被控制端的屏幕截图')
            send = func
            conn.sendall(send.encode())
            fileinfo_size=struct.calcsize('128sl')
            buf = conn.recv(fileinfo_size)
            if buf:
                filename, filesize = struct.unpack('128sl', buf)
                fn = filename.decode().strip('0')                             #Python strip() 方法用于删除字符串头部和尾部指定的字符,默认字符为所有空字符,包括空格、换行(
    )、制表符(	)等。
                new_filename = os.path.join('./', 'new_' + fn)
                print ('file new name is {0}, filesize is {1}'.format(new_filename,
                                                                     filesize))
    
                recvd_size = 0  # 定义已接收文件的大小
                fp = open(new_filename, 'wb')
                print ('start receiving...')
    
                while not recvd_size == filesize:
                    if filesize - recvd_size > 1024:
                        data = conn.recv(1024)
                        recvd_size += len(data)
                    else:
                        data = conn.recv(filesize - recvd_size)
                        recvd_size = filesize
                    fp.write(data)
                fp.close()
                print ('end receive...')
            dlg = wx.MessageDialog(self,"已经收到被控端截屏文件","Camera",wx.OK)
            dlg.ShowModal() #显示对话框
            dlg.Destroy()
            #frame4 = wx.Frame(None,-1,title='ScreenView',size=(400,-1))
            #frame4.Show()
        
        def Quit(self,e):
            func='-1'
            conn.sendall(func.encode())
            line.close()                 #initial 否则可能造成下次打开,用到的端口还在被占用
            self.Close(True)
            
        def OnAbout(self,e):
            #创建一个带"OK"按钮的对话框。wx.OK是wxWidgets提供的标准ID
            dlg = wx.MessageDialog(self,"小组成员:刘强 郭文涛","About Editors",wx.OK)
            dlg.ShowModal() #显示对话框
            dlg.Destroy()   #当结束之后关闭对话框
    
        def OnExit(self,e):
            self.Close(True)  #关闭整个frame
    
        def OnOpen(self,e):
            dlg = wx.FileDialog(self,"Choose a file",self.dirname,"","*·*",wx.FD_OPEN)
            if dlg.ShowModal() == wx.ID_OK:
                self.filename = dlg.GetFilename()
                self.dirname = dlg.GetDirectory()
                f = open(os.path.join(self.dirname,self.filename),'r')#暂时只读
                self.contrl.SetValue(f.read())
                f.colse()
            dlg.Destroy()
            
    if __name__ == '__main__':
        
        app = wx.App(False)
        frame = MainWindow(None,title="Client")
        app.MainLoop()

    functions.py

    # -*- coding: utf-8 -*-
    """
    Created on Mon Jun 24 14:47:35 2019
    
    @author: erio
    """
    
    from PIL import Image,ImageGrab
    import cv2
    import pyaudio
    import wave
    
    
    
    '''
    #录音
    input_filename = "record.wav"                          # 麦克风采集的语音输入
    input_filepath = "E:"              # 输入文件的path
    in_pathrec = input_filepath + input_filename         #通俗解释就是wav文件路径
    
    def get_audio(filepath):
            CHUNK = 256                 #定义数据流块
            FORMAT = pyaudio.paInt16    #量化位数(音量级划分)
            CHANNELS = 1               # 声道数;声道数:可以是单声道或者是双声道
            RATE = 8000                # 采样率;采样率:一秒内对声音信号的采集次数,常用的有8kHz, 16kHz, 32kHz, 48kHz, 11.025kHz, 22.05kHz, 44.1kHz
            RECORD_SECONDS = 10          #录音秒数
            WAVE_OUTPUT_FILENAME = filepath     #wav文件路径
            p = pyaudio.PyAudio()               #实例化
    
            stream = p.open(format=FORMAT,
                            channels=CHANNELS,
                            rate=RATE,
                            input=True,
                            frames_per_buffer=CHUNK)
           # print("*"*10, "开始录音:请在5秒内输入语音")
            frames = []                                                 #定义一个列表
            for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):      #循环,采样率11025 / 256 * 5
                data = stream.read(CHUNK)                               #读取chunk个字节 保存到data中
                frames.append(data)                                     #向列表frames中添加数据data
          #  print(frames)
          #  print("*" * 10, "录音结束
    ")
    
            stream.stop_stream()
            stream.close()          #关闭
            p.terminate()           #终结
    
            wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')                  #打开wav文件创建一个音频对象wf,开始写WAV文件
            wf.setnchannels(CHANNELS)                                   #配置声道数
            wf.setsampwidth(p.get_sample_size(FORMAT))                  #配置量化位数
            wf.setframerate(RATE)                                       #配置采样率
            wf.writeframes(b''.join(frames))                            #转换为二进制数据写入文件
            wf.close()              #关闭
            
    get_audio(in_pathrec)
    '''
    
    
    
    #截屏
    input_filenamescr = "screen.jpg"                         
    input_filepath = "E:"          
    in_pathscr = input_filepath + input_filenamescr      
    def get_screen(filepath):
       img = ImageGrab.grab()
       img.save(filepath)
    
    get_screen(in_pathscr)
    
    
    
    
    
    '''
    #拍照
    input_filenamecam = "camera.jpg"                         
    input_filepath = "E:"          
    in_pathcam = input_filepath + input_filenamecam    
    def get_camera(filepath):
       cap=cv2.VideoCapture(0)
       ret,frame = cap.read()
       i=0;
       cv2.imwrite(filepath,frame)
       cap.release()
       cv2.destroyAllWindows()
       
    get_camera(in_pathcam)
    '''
    
    
    
    '''
    #录制视频
    cap = cv2.VideoCapture(0)#创建一个 VideoCapture 对象
    
    flag = 1 #设置一个标志,用来输出视频信息
    num = 1 #递增,用来保存文件名
    while(cap.isOpened()):#循环读取每一帧
        ret_flag, Vshow = cap.read() #返回两个参数,第一个是bool是否正常打开,第二个是照片数组,如果只设置一个则变成一个tumple包含bool和图片
        cv2.imshow("Capture_Test",Vshow)  #窗口显示,显示名为 Capture_Test
        k = cv2.waitKey(1) & 0xFF #每帧数据延时 1ms,延时不能为 0,否则读取的结果会是静态帧
        if k == ord('s'):  #若检测到按键 ‘s’,打印字符串
            cv2.imwrite("D:/pycharmthings/IMF/getpics/"+ str(num) + ".jpg", Vshow)
            print(cap.get(3)); #得到长宽
            print(cap.get(4));
            print("success to save"+str(num)+".jpg")
            print("-------------------------")
            num += 1
        elif k == ord('q'): #若检测到按键 ‘q’,退出
            break
    cap.release() #释放摄像头
    cv2.destroyAllWindows()#删除建立的全部窗口
    '''
  • 相关阅读:
    IIS主机托管的FSO设置用户权限问题
    关于使用UTF8开发ASP网站
    构建Android开发环境
    iOS如何取得APP的版本信息跟服务器对比进行升级提示?
    经典讲解VB.NET线程方法之访问数据库
    IIS7.0下ASP+Access(MDB)应用环境设置要点
    一文明白数据库事务隔离级别
    EA鼻祖,Zachman,6 行(视点)+ 6 列(W5H)+ 6 条规则
    C语言位运算详解
    关于while 和if
  • 原文地址:https://www.cnblogs.com/lqerio/p/11087367.html
Copyright © 2020-2023  润新知