python - 没有名为“websockets.legacy”的模块
问题描述
我正在尝试使用 auto-py-to-exe 构建一个 exe。Exe 构建成功,但现在我的 websocket 服务器程序无法正常工作。如果有人知道此问题的解决方案,请告诉我。
代码:
import asyncio
import websockets
import win32gui
import win32ui
import win32con
import win32com.client
import win32api
import json
from PIL import Image, ImageFile
import io
import time
shell = win32com.client.Dispatch('WScript.Shell')
ImageFile.MAXBLOCK = 2**20
def left_click(pos_x, pos_y):
win32api.SetCursorPos((pos_x, pos_y))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, pos_x, pos_y, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, pos_x, pos_y, 0, 0)
def right_click(pos_x, pos_y):
win32api.SetCursorPos((pos_x, pos_y))
win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTDOWN, pos_x, pos_y, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP, pos_x, pos_y, 0, 0)
async def echo(websocket, path):
while True:
try:
raw_data = await websocket.recv()
data = json.loads(raw_data)
if data['type'] == 'click':
pos_x = data['x']
pos_y = data['y']
if data['click_type'] == 1:
left_click(pos_x, pos_y)
elif data['click_type'] == 2:
left_click(pos_x, pos_y)
left_click(pos_x, pos_y)
elif data['click_type'] == 3:
right_click(pos_x, pos_y)
else:
pass
if data['type'] == 'keydown':
cmd = ''
if data['shiftKey']:
cmd += '+'
if data['ctrlKey']:
cmd += '^'
if data['altKey']:
cmd += '%'
if len(data['key']) == 1:
cmd += data['key'].lower()
else:
cmd += '{'+data['key'].upper()+'}'
shell.SendKeys(cmd)
except websockets.ConnectionClosed as exc:
pass
except Exception as ex:
pass
try:
PREV_IMG = None
hdesktop = win32gui.GetDesktopWindow()
width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
# device context
desktop_dc = win32gui.GetWindowDC(hdesktop)
img_dc = win32ui.CreateDCFromHandle(desktop_dc)
# memory context
mem_dc = img_dc.CreateCompatibleDC()
screenshot = win32ui.CreateBitmap()
screenshot.CreateCompatibleBitmap(img_dc, width, height)
mem_dc.SelectObject(screenshot)
bmpinfo = screenshot.GetInfo()
# copy into memory
mem_dc.BitBlt((0, 0), (width, height), img_dc, (left, top),win32con.SRCCOPY)
bmpstr = screenshot.GetBitmapBits(True)
pillow_img = Image.frombytes('RGB',
(bmpinfo['bmWidth'], bmpinfo['bmHeight']),
bmpstr, 'raw', 'BGRX')
with io.BytesIO()as image_data:
pillow_img.save(image_data, "JPEG", quality=80, optimize=True, progressive=True)
image_data_content = image_data.getvalue()
if image_data_content!= PREV_IMG:
await websocket.send(image_data_content)
PREV_IMG = image_data_content
mem_dc.DeleteDC()
win32gui.DeleteObject(screenshot.GetHandle())
except websockets.ConnectionClosed as exc:
pass
except Exception as ex:
pass
async def main():
async with websockets.serve(echo, "", 9999):
await asyncio.Future() # run forever
asyncio.run(main())
该程序是为 rdp 和 vnc 制作的,它使用 websockets 成为服务器,然后客户端可以通过连接到计算机来访问计算机。
解决方案
推荐阅读
- javascript - 错误 TS7053:元素隐式具有“任何”类型,因为“数据”类型的表达式不能用于索引类型“{}”
- coldfusion - 如果令牌过期,则自动刷新令牌
- snowflake-cloud-data-platform - LOAD_HISTORY 视图始终为空
- javascript - JavaScript 中的解构和初始化
- c# - 如何避免在“Plugin.Media”nuget 中调整图像大小?
- javascript - 我的网站轮播/React.js 有问题
- python - Discord bot 不会将我的消息发送到服务器,而是在终端中打印
- python - 如何让我的正则表达式匹配在前瞻后停止?
- c++ - 似乎找不到链接器我在 python.h 下寻找链接对象
- java - 代号一IOS签名