Python 3.x 如何通过SOAP API锁定virtualbox以获取屏幕截图

Python 3.x 如何通过SOAP API锁定virtualbox以获取屏幕截图,python-3.x,soap,virtualbox,Python 3.x,Soap,Virtualbox,我正试图使用Python中Virtualbox 6.1的SOAP接口来获取一台机器的屏幕截图。我可以启动机器,但每次尝试检索屏幕布局时都会出现锁定错误 代码如下: 导入zeep #帮助器以显示会话锁定状态 def显示锁定状态(会话id): session\u state=service.ISession\u getState(session\u id) 打印(“当前会话状态:”,会话状态) #连接 client=zeep.client('http://127.0.0.1:18083?wsdl')

我正试图使用Python中Virtualbox 6.1的SOAP接口来获取一台机器的屏幕截图。我可以启动机器,但每次尝试检索屏幕布局时都会出现锁定错误

代码如下:

导入zeep
#帮助器以显示会话锁定状态
def显示锁定状态(会话id):
session\u state=service.ISession\u getState(session\u id)
打印(“当前会话状态:”,会话状态)
#连接
client=zeep.client('http://127.0.0.1:18083?wsdl')
服务=客户端。创建服务(“{http://www.virtualbox.org/}vboxBinding“,”http://127.0.0.1:18083?wsdl')
manager\u id=service.IWebsessionManager\u登录('fakeuser','fakepassword')
session\u id=service.IWebsessionManager\u getSessionObject(manager\u id)
#获取机器id并启动它
machine\u id=service.IVirtualBox\u findMachine(manager\u id,'Debian')
progress\u id=service.IMachine\u launchVMProcess(机器id,会话id,'gui')
服务。I进度\等待完成(进度\ id,-1)
打印('机器已启动!')
显示锁定状态(会话id)
#解锁,然后锁定以确保,没有任何明显的效果
服务.ISession\u解锁机器(会话\u id)
service.IMachine\u lockMachine(机器id、会话id、“共享”)
显示锁定状态(会话id)
console\u id=service.ISession\u getConsole(会话\u id)
display\u id=service.IConsole\u getDisplay(控制台\u id)
打印(service.IDisplay_getGuestScreenLayout(display_id))
机器已正确启动,但最后一行显示错误
VirtualBox error:rc=0x80004001
,根据我的阅读,这意味着会话已锁定


我试图再次释放并获取锁,但即使成功,错误仍然存在。我浏览了文档,但找不到我应该使用的其他类型的锁,除了写锁,它在这里不可用,因为机器正在运行。我找不到任何语言的示例。

我找到了一个名为Android的应用程序,它具有此SOAP屏幕截图功能。 通过一个MITM代理运行它,我重新构造了它执行的调用,并将它们编写为Zeep等价物。如果有人对未来感兴趣,以上脚本的最后几行现在是:

console_id = service.ISession_getConsole(session_id)
display_id = service.IConsole_getDisplay(console_id)
resolution = service.IDisplay_getScreenResolution(display_id, 0)
print(f'display data: {resolution}')

image_data = service.IDisplay_takeScreenShotToArray(
    display_id,
    0,
    resolution['width'],
    resolution['height'],
    'PNG')

with open('screenshot.png', 'wb') as f:
    f.write(base64.b64decode(image_data))