如何通过 SOAP 锁定 virtualbox 获取屏幕截图 API
How to lock virtualbox to get a screenshot through SOAP API
我正在尝试使用来自 Python 的 Virtualbox 6.1 的 SOAP 接口来获取机器的屏幕截图。我可以启动机器,但每当我尝试检索屏幕布局时都会出现锁定错误。
这是代码:
import zeep
# helper to show the session lock status
def show_lock_state(session_id):
session_state = service.ISession_getState(session_id)
print('current session state:', session_state)
# connect
client = zeep.Client('http://127.0.0.1:18083?wsdl')
service = client.create_service("{http://www.virtualbox.org/}vboxBinding", 'http://127.0.0.1:18083?wsdl')
manager_id = service.IWebsessionManager_logon('fakeuser', 'fakepassword')
session_id = service.IWebsessionManager_getSessionObject(manager_id)
# get the machine id and start it
machine_id = service.IVirtualBox_findMachine(manager_id, 'Debian')
progress_id = service.IMachine_launchVMProcess(machine_id, session_id, 'gui')
service.IProgress_waitForCompletion(progress_id, -1)
print('Machine has been started!')
show_lock_state(session_id)
# unlock and then lock to be sure, doesn't have any effect apparently
service.ISession_unlockMachine(session_id)
service.IMachine_lockMachine(machine_id, session_id, 'Shared')
show_lock_state(session_id)
console_id = service.ISession_getConsole(session_id)
display_id = service.IConsole_getDisplay(console_id)
print(service.IDisplay_getGuestScreenLayout(display_id))
机器正常启动,但最后一行给出错误 VirtualBox error: rc=0x80004001
,根据我的阅读,这意味着会话锁定。
我尝试再次释放并获取锁,但即使它成功了,错误仍然存在。我浏览了文档,但找不到我应该使用的其他类型的锁,除了写锁,它在这里不可用,因为机器是 运行。我找不到任何语言的例子。
我发现一个名为 VBoxManager 的 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))
我正在尝试使用来自 Python 的 Virtualbox 6.1 的 SOAP 接口来获取机器的屏幕截图。我可以启动机器,但每当我尝试检索屏幕布局时都会出现锁定错误。
这是代码:
import zeep
# helper to show the session lock status
def show_lock_state(session_id):
session_state = service.ISession_getState(session_id)
print('current session state:', session_state)
# connect
client = zeep.Client('http://127.0.0.1:18083?wsdl')
service = client.create_service("{http://www.virtualbox.org/}vboxBinding", 'http://127.0.0.1:18083?wsdl')
manager_id = service.IWebsessionManager_logon('fakeuser', 'fakepassword')
session_id = service.IWebsessionManager_getSessionObject(manager_id)
# get the machine id and start it
machine_id = service.IVirtualBox_findMachine(manager_id, 'Debian')
progress_id = service.IMachine_launchVMProcess(machine_id, session_id, 'gui')
service.IProgress_waitForCompletion(progress_id, -1)
print('Machine has been started!')
show_lock_state(session_id)
# unlock and then lock to be sure, doesn't have any effect apparently
service.ISession_unlockMachine(session_id)
service.IMachine_lockMachine(machine_id, session_id, 'Shared')
show_lock_state(session_id)
console_id = service.ISession_getConsole(session_id)
display_id = service.IConsole_getDisplay(console_id)
print(service.IDisplay_getGuestScreenLayout(display_id))
机器正常启动,但最后一行给出错误 VirtualBox error: rc=0x80004001
,根据我的阅读,这意味着会话锁定。
我尝试再次释放并获取锁,但即使它成功了,错误仍然存在。我浏览了文档,但找不到我应该使用的其他类型的锁,除了写锁,它在这里不可用,因为机器是 运行。我找不到任何语言的例子。
我发现一个名为 VBoxManager 的 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))