как сделать чтоб в python socket клиент сделал скриншот и отправялл его на сервер

Как можно сделать скриншот клиента и передать его на сервер? Я сначала подумал что это будет легкая задача но столкнулся с проблемой как можно выполнить команду для скриншота вить если просто передать команду то она не исполниться а просто сохраниться и все


Ответы (1 шт):

Автор решения: skoriy

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)

→ Ссылка