Foros Python
envio y acceso escritorio remoto - Versión para impresión

+- Foros Python (https://foro.recursospython.com)
+-- Foro: Desarrollo (https://foro.recursospython.com/forumdisplay.php?fid=1)
+--- Foro: General (https://foro.recursospython.com/forumdisplay.php?fid=9)
+--- Tema: envio y acceso escritorio remoto (/showthread.php?tid=117)

Páginas: 1 2


envio y acceso escritorio remoto - calvicius - 07-01-2018

hola,

Estoy creando una aplicación para impartir docencia por internet.
La aplicación se compone de un chat de grupo (eso ya lo tengo con un servidor de sockets). La cuestión del audio no me preocupa demasiado, proque lo puedo hacer en un modulo aparte con mumble/murmur.
La cuestión es que el profesor va desarrollando su clase a los alumnos en su propio ordenador y esas sucesivas pantallas (creo que en ingles se pueden llamar frames) se deben transmitir a los alumnos conectados en ese momento. Los alumnos, en principio, solo deben ver lo que se desarrolla en su pantalla, salvor que el profesor les de autorización a los alumnos (esa instrucción se puede pasar a traves del servidor de sockets) cambiando el estatus del cliente de on a off y viceversa.

¿como puedo hacer el acceso al escritorio remoto del profesor?. Quedaría muy agradecido si alguien me puede facilitar documentación o consejos sobre los principios básicos (con la lógica y librerías de apoyo). El resto, obviamente queda a mi cargo Angel . El tema de audio/video no es mi fuerte.

La parte servidor del profesor estará siempre en windows.

He leído estas librerías:

http://timgolden.me.uk/python/wmi/tutorial.html

https://www.darknet.org.uk/2017/11/rdpy-rdp-security-tool-hacking-remote-desktop-protocol/

Y este otro articulo que me parece curioso e interesante por su concepto:

https://plus.google.com/+VooduOrg/posts/GALziDv9CXN

gracias anticipadas


RE: envio y acceso escritorio remoto - Francisco - 07-01-2018

Hola. Si bien no estoy muy versado en el tema creo que estás en lo correcto. Deberías capturar la pantalla sucesivamente y luego juntar todos los cuadros para crear un video (para esto puede usarse ffmpeg). En este enlace tienes un código que hace justamente eso. Tal vez al tratarse de una aplicación cliente/servidor solamente sea necesario tomar las capturas de pantalla e ir mostrándolas a medida que se reciben del socket.

Saludos


RE: envio y acceso escritorio remoto - calvicius - 07-01-2018

francisco, gracias por tu rápida respuesta. Creo que se me olvidó indicar que el aula virtual debe ser en vivo, y no grabada.

miraré el ffmpeg... pero no se donde leí que esto solo funcionaba bien en linux y el "maquinillo" del profesor estará en windows.

bien... le daré más vueltas esta semana. Gracias de todas formas.

si obtengo algo concreto, lo comentaré aqui.


RE: envio y acceso escritorio remoto - Francisco - 08-01-2018

Emilio, puedes chequear el artículo sobre cómo capturar la pantalla en Python. Una vez que tienes el archivo simplemente lo envías por el socket para recibirlo del otro lado (i.e. la pantalla del alumno). En ese caso, como es en vivo, no sería necesario usar ffmpeg para convertirlo a un video. Desconozco qué tan eficiente puede ser este método, especialmente por el tiempo que toma capturar la pantalla (lo que estará ocurriendo constantemente) y luego transmitirla, pero por el momento no se me ocurre una implementación alternativa.

Saludos!


RE: envio y acceso escritorio remoto - calvicius - 08-01-2018

precisamente he ojeado esta mañana la libreria PyAutoGui.
Mentalmente ya lo tengo medio hilvanado. los pasos aproximados son

1.- Capturar un frame --> img=pyautogui.screenshot(region=(x1, y1, x2, y2)) o con --> ImageGrab.grab() de Pillow (ya veré)

2.- transformar ese frame a texto y comprimirlo, por cuestion de rapidez (transmitir un jpg tal cual resulta muy caro) :
jpgtxt = base64.encodestring(img)
jpgtxt = base64.b16encode(zlib.compress(jpgtxt,9)) --> ver el grado de compresión adecuado
jpgtxt = jpgtxt.replace('AAA', 'L')
...
jpgtxt = jpgtxt.replace('25', '·')

3.- El cliente hará la conversión inversa

4.- Como el cliente no sabe donde estará el profesor se creará una base de datos del tipo cliente servidor, con una unica tabla, que almacenará el frame. Como el profesor no tendrá IP fija, habrá que trabajar con dominios del tipo no-ip.com. En esa dirección es donde grabará el profesor y leerá el alumno. El diseño de la tabla en principio sería así:

numframe integer,
imagen character varying(1000000),
posicionx integer,
posiciony integer,
widthemisor integer,
heigthemisor integer,
leftclick integer,
rightclick integer,
letra character varying(20),
puedeescribir integer

Estudiar si es conveniente grabar todos los frames consecutivamente para repasar cada lección en diferido

5.- Crear una matriz de threads (uno por cada alumno)

6.- Activar /desactivar raton y teclado a los alumnos

Y este sería un borrador de inicio


RE: envio y acceso escritorio remoto - calvicius - 10-01-2018

bueno ya está funcionando muy básicamente (transmite y recibe). corriendo postfresql como un servicio en windows.
las pruebas las he hecho en localhost (el emisor y el receptor) en windows 10. Lo relevante es que la idea funciona. Ahora a mejorarlo.

os pongo el enlace del programita junto con la descripción de la BD, por si a alguien le interesa descargarlo:

Transmision Escritorio


RE: envio y acceso escritorio remoto - Francisco - 11-01-2018

Excelente! Un saludo.


RE: envio y acceso escritorio remoto - calvicius - 17-01-2018

bueno...
ya está terminado todo lo que perseguía (permitir a los alumnos controlar el raton y el teclado del profesor).
El programa lo podeis descargar de aqui

Para permitir el control del alumno, el servidor debe pulsar mays + flecha arriba <Shift-Up> (con el raton en la ventana). Para recuperar el control, lo mismo.

En los import no aparecen unas librerias necesarias para funcionar en windows y que hay que instalar y descargar manualmente:

necesita previamente pyhook aqui:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyhook

pyhook necesita pywin32 con easy_install aqui
https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/

El sistema con base de datos es extremadamente lento, y da problemas con el firewall y antivirus en windows 10 (se desconecta cuando quiere). En Windows 7 va bien. Pero la lógica del sistema os puede servir para futuras ocasiones

Por eso lo voy a codificar todo en memoria mediante sockets. El esquema es:

Código:
from PIL import Image, ImageGrab
import io, base64

# la parte del servidor

img1 = ImageGrab.grab()
output = io.BytesIO()
img1.save(output, format="JPEG")
data = output.getvalue()
l = len(data)
pre = str(l)

while len(pre)!=20:
   pre+= ","   # añadimos las variables en esta lista entre comas

print(pre)
# añadimos el tamaño de la foto las 20 comas y su tamaño al principio de la foto
cad = base64.b64encode(data)
data = pre + cad.decode('utf-8')
# esto es para comprobar
print ("Tamaño foto =", img1.size)
print ("Longitud del paquete =", len(data))
#esto lo haremos para enviar por el socket
# enviar = data.encode('utf8')
# conexion.sendall(enviar)    # envia por el socket a todos

recibido = base64.b64decode(cad)
print("Tamaño img recibida = ", len(recibido))

# los tamaños de img1 y recibido es el mismo.


#En la parte del cliente haremos con los bytes recibidos:

data = recibido.decode('utf-8')
pre = data[:20]
imagen = data[20:]
li = pre.split(",")
target = int(li[0])
# li[1] ... li[19] serán la posicion del raton clieck etc...
while len(imagen) != target:
   newData = s.recv(1024)
   if len(newData) == 0:
       break
   data += newData
   
Ahora aqui mandamos el data a la pantalla con el sistema
de ventanas que utilicemos (tkinter, gtk, pyGame, etc)



RE: envio y acceso escritorio remoto - Francisco - 17-01-2018

Gracias por el código, es muy interesante.

Ciertamente una solución con sockets es mucho más eficiente que una base de datos en la que se esté escribiendo y leyendo constantemente. Tal vez un framework como Twisted te resulte más útil, aun para el cliente dado que se integra muy bien con librerías gráficas como Qt, GTK, etc.

Saludos!


RE: envio y acceso escritorio remoto - calvicius - 18-01-2018

francisco, gracias por la recomendación.

había leído algo sobre twisted, pero no le había prestado ninguna atención. Ahora mismo acabo de empezar a leer este libro

Por el prólogo, parece que ahorra bastante en la definición de primitivas, aunque por regla general soy esceptico a las "frameworks", ya que encorsetan un poco la libertad de acción. De todas formas le prestaré atención.

edito:

parece que hay problemas con python 3.+

De la documentación oficial Actualizacion a Python3  :


Código:
Porting to Python 3
Introduction

Twisted is currently being ported to work with Python 3.3+.
This document covers Twisted-specific issues in porting your code to Python 3.