python中使用pymobiledevice3与手机交互(一)获取udid

【获取手机的udid】

首先使用python中的模块pymobiledevice3,

import pymobiledevice3

在该模块中可以继续引用,例如,usbmux,

import pymobiledevice3.usbmux

使用pymobiledevice3.usbmux.list_devices()方法可以获取数据:

[MuxDevice(devid=66, serial='00008020-001828440A69002E', connection_type='USB'), MuxDevice(devid=65, serial='00008020-001828440A69002E', connection_type='Network'), MuxDevice(devid=57, serial='f89d929e8c45a81c0fe2d22f80c1a36e227e90ef', connection_type='Network'), MuxDevice(devid=49, serial='f89d929e8c45a81c0fe2d22f80c1a36e227e90ef', connection_type='USB')]

手机多的话不知道哪个对应哪个手机对应哪个udid,因为返回的数据里面没有手机名字字段,不太方便。

然后使用libimobiledevice,libimobiledevice 是一个 C 库,通常需要通过绑定库来与 Python 进行交互。由于目前并没有官方的 Python 绑定库,所以使用 subprocess 来调用 libimobiledevice:

def get_device_udid_through_libimobiledevice():
    try:
        result = subprocess.run('ideviceinfo -k DeviceName && ideviceinfo -k UniqueDeviceID', shell=True, stdout=subprocess.PIPE, text=True)
        if result.returncode == 0:
            return result.stdout
    except Exception as e:
        print(f"出错了{e}")
    return None

得到的结果是:

iPhone123
f89d12348c45a8156782d22f80c1a36e12349012

目前看满足需求,但当我连接两个手机时,问题来了,只显示或者说只获得了最后连接到电脑的手机的信息,尝试多次都是这样。

之后尝试使用subprocess调用pymobiledevice3:

def get_device_udid_through_pymobiledevice3(device_name, connect_type):
    """
    :param device_name: 设备名称,例如,iPhonexxx
    :param connect_type:连接类型,例如,USB
    :return:获取对应设备的udid
    """
    try:
        result = subprocess.run(['pymobiledevice3', 'usbmux', 'list'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        if result.returncode == 0:
            devices = json.loads(result.stdout)
            device_udid = None
            for device in devices:
                if device['DeviceName'] == device_name and device['ConnectionType'] == connect_type:
                    device_udid = device['UniqueDeviceID']
                    break
            return device_udid
    except Exception as e:
        print(f"出错了:{e}")
    return None

分别指定不同设备的名字都可以返回对应设备的udid,符合要求。

【总结】

如果只跑一个手机的自动化,需要获取udid,可以使用libimobiledevice,执行速度快,可以很快返回结果;如果跑多个手机的自动化,需要获取udid,建议使用pymobiledevice3,可以满足需求,缺点是速度较慢,返回结果需要几秒钟。

上一篇:WebSocket—双向实时通信


下一篇:内核上项目【让ntoskrnl.exe保护程序】-代码