from http.server import BaseHTTPRequestHandler, HTTPServer import pdb import pywinauto import json import subprocess import time import zlib import os import PIL from PIL import ImageGrab from threading import Thread def SaveScreenshot(inFilePath): # grab fullscreen lScreenshot = ImageGrab.grab() # save image file lScreenshot.save('screenshot.png') class RobotDaemonServer(Thread): self.mJSONConfigurationDict={}; def __init__(self,name,inJSONConfigurationDict): Thread.__init__(self) self.name = name self.mJSONConfigurationDict=inJSONConfigurationDict def run(self,inServerAddress="127.0.0.1",inPort=8081): print('starting server...') # Server settings # Choose port 8080, for port 80, which is normally used for a http server, you need root access server_address = (inServerAddress, inPort) httpd = HTTPServer(server_address, testHTTPServer_RequestHandler) print('running server...') httpd.serve_forever() # HTTPRequestHandler class class testHTTPServer_RequestHandler(BaseHTTPRequestHandler): #ResponseContentTypeFile def SendResponseContentTypeFile(self,inContentType,inFilePath): # Send response status code self.send_response(200) # Send headers self.send_header('Content-type',inContentType) self.end_headers() lFileObject = open(inFilePath, "rb") # Write content as utf-8 data self.wfile.write(lFileObject.read()) #Закрыть файловый объект lFileObject.close() # GET def do_GET(self): #Мост между файлом и http запросом (новый формат) if self.path == "/": self.SendResponseContentTypeFile('text/html',"RobotDaemonServerWeb\\Index.xhtml") #Мост между файлом и http запросом (новый формат) if self.path == '/3rdParty/Semantic-UI-CSS-master/semantic.min.css': self.SendResponseContentTypeFile('text/css',"..\\..\\3rdParty\\Semantic-UI-CSS-master\\semantic.min.css") #Мост между файлом и http запросом (новый формат) if self.path == '/3rdParty/Semantic-UI-CSS-master/semantic.min.js': self.SendResponseContentTypeFile('application/javascript',"..\\..\\3rdParty\\Semantic-UI-CSS-master\\semantic.min.js") #Мост между файлом и http запросом (новый формат) if self.path == '/3rdParty/jQuery/jquery-3.1.1.min.js': self.SendResponseContentTypeFile('application/javascript',"..\\..\\3rdParty\\jQuery\\jquery-3.1.1.min.js") #Мост между файлом и http запросом (новый формат) if self.path == '/3rdParty/Google/LatoItalic.css': self.SendResponseContentTypeFile('font/css',"..\\..\\3rdParty\\Google\\LatoItalic.css") #Мост между файлом и http запросом (новый формат) if self.path == '/3rdParty/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff2': self.SendResponseContentTypeFile('font/woff2',"..\\..\\3rdParty\\Semantic-UI-CSS-master\\themes\\default\\assets\\fonts\\icons.woff2") #Мост между файлом и http запросом (новый формат) if self.path == '/favicon.ico': self.SendResponseContentTypeFile('image/x-icon',"..\\..\\favicon.ico") #Получить скриншот if self.path.split("?")[0] == '/GetScreenshot': #Сохранить файл на диск SaveScreenshot("Screenshot.png") self.SendResponseContentTypeFile('image/png',"Screenshot.png") #Action ObjectInspector GetObjectList if self.path == '/ObjectDetector/JSONGetWindowList': #ReadRequest #lInputByteArray=self.rfile.read() #print(str(len(os.stat(self.rfile).st_size))) # Send response status code self.send_response(200) # Send headers self.send_header('Content-type','application/json') self.end_headers() # Send message back to client #{'functionName':'', 'argsArray':[]} lRequestObject={'functionName':'ElementGetChildElementList','argsArray':[]} #Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами #ProcessChildSendObject(p,lRequestObject) #Получить ответ от дочернего процесса #lResponseObject=ProcessChildReadWaitObject(p) message = json.dumps(lResponseObject) # Write content as utf-8 data self.wfile.write(bytes(message, "utf8")) # POST def do_POST(self): #Action ObjectInspector GetObjectList if self.path == '/ObjectDetector/JSONGetWindowListArgs': #ReadRequest lInputByteArrayLength = int(self.headers.get('Content-Length')) lInputByteArray=self.rfile.read(lInputByteArrayLength) #Превращение массива байт в объект print(lInputByteArray.decode('utf8')) lInputObject=json.loads(lInputByteArray.decode('utf8')) # Send response status code self.send_response(200) # Send headers self.send_header('Content-type','application/json') self.end_headers() # Send message back to client #{'functionName':'', 'argsArray':[]} lRequestObject={'functionName':'ElementGetChildElementList','argsArray':lInputObject} #Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами #ProcessChildSendObject(p,lRequestObject) #Получить ответ от дочернего процесса #lResponseObject=ProcessChildReadWaitObject(p) print(str(lResponseObject)) message = json.dumps(lResponseObject) # Write content as utf-8 data self.wfile.write(bytes(message, "utf8")) if self.path == '/GUIAction': #ReadRequest lInputByteArrayLength = int(self.headers.get('Content-Length')) lInputByteArray=self.rfile.read(lInputByteArrayLength) #Превращение массива байт в объект lInputObject=json.loads(lInputByteArray.decode('utf8')) # Send response status code self.send_response(200) # Send headers self.send_header('Content-type','application/json') self.end_headers() # Send message back to client #{'functionName':'', 'argsArray':[]} #pdb.set_trace() lRequestObject=lInputObject #Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами #ProcessChildSendObject(p,lRequestObject) #Получить ответ от дочернего процесса #lResponseObject=ProcessChildReadWaitObject(p) message = json.dumps(lResponseObject) # Write content as utf-8 data self.wfile.write(bytes(message, "utf8")) if self.path == '/GUIActionList': #ReadRequest lInputByteArrayLength = int(self.headers.get('Content-Length')) lInputByteArray=self.rfile.read(lInputByteArrayLength) #Превращение массива байт в объект lInputObject=json.loads(lInputByteArray.decode('utf8')) # Send response status code self.send_response(200) # Send headers self.send_header('Content-type','application/json') self.end_headers() # Send message back to client #{'functionName':'', 'argsArray':[]} lRequestObject=lInputObject lOutputObject=[] #pdb.set_trace() #Циклическая отправка запросов в дочерний объект for lItem in lRequestObject: #Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами #ProcessChildSendObject(p,lItem) #Получить ответ от дочернего процесса #lResponseObject=ProcessChildReadWaitObject(p) #Добавить в выходной массив lOutputObject.append(lResponseObject) #Сформировать текстовый ответ message = json.dumps(lOutputObject) # Write content as utf-8 data self.wfile.write(bytes(message, "utf8")) return #print(ChildProcessReadWaitString(p))