как сделать чтоб в python socket клиент сделал скриншот и отправялл его на сервер
Как можно сделать скриншот клиента и передать его на сервер? Я сначала подумал что это будет легкая задача но столкнулся с проблемой как можно выполнить команду для скриншота вить если просто передать команду то она не исполниться а просто сохраниться и все
Ответы (1 шт):
server.py - простой TCP сервер, который принимает любое сообщение за файл. После записи файла проверяется его настоящий mime-type. Нужно это для совместимости в виндовсом, ибо виндовс не хочет открывать файл без расширения в отличие от могучого Линукса. После происходит rename файла с добавлением его mime-type. Можно указать на каком IP адресе запустить сервер. (0.0.0.0 нужен, чтобы могли подключиться к этому серверу хосты с разных сетей. localhost - только с этого компютера). Также можна указать каталог, в который сохранять приходящие файлы.
import socket
from os.path import expanduser
import os
import magic
class Server:
def __init__(self, address='localhost', port=8080, save_dir=expanduser('~')):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind((address, port))
self.file_id = 1
self.save_dir = save_dir
self.address = address
self.port = port
def run(self):
self.socket.listen(1)
while True:
client_socket, client_address = self.socket.accept()
file_path = os.path.join(self.save_dir, str(self.file_id))
file = open(file_path, 'wb')
while 1:
data = client_socket.recv(1024)
if data:
file.write(data)
else:
break
mime = magic.from_file(file_path, mime=True).split('/')[1]
os.rename(file_path, file_path + '.' + mime)
self.file_id = self.file_id + 1
file.close()
client_socket.close()
if __name__ == '__main__':
server = Server()
server.run()
client.py - простой TCP клиент, который принимает файл и отправляет его TCP серверу. Также содержит логику, чтобы сделать скриншот с помощью библиотеки PIL
from os.path import expanduser
from PIL import ImageGrab
import socket
import os
class Client:
def __init__(self, host_address='localhost', host_port=8080):
self.socket = socket.socket()
self.host_address = host_address
self.host_port = host_port
self.socket.connect((host_address, host_port))
def send_file(self, file_name):
file = open(file_name, 'rb')
self.socket.sendfile(file)
def screenshot(to_file, mime='JPEG'):
_screenshot = ImageGrab.grab()
_screenshot.save(to_file, mime)
if __name__ == '__main__':
file_name = os.path.join(expanduser('~'), '30.jpeg')
screenshot(file_name)
cli = Client()
cli.send_file(file_name)
Запуск происходит двух файлов по отдельности. Сначала сервер, потом клиент. Каждый раз, когда хотите загрузить скриншот компютера, нужно запустить client.py Кажется, вам не придеться даже устанавливать сторонние зависимости и кажется, что он кросс-платформенный(проверено только на Ubuntu 20.04)