脚本自动化全攻略(附代码与问答)
📖 目录导读
- 设备识别码的核心价值与常见类型
- 为什么用脚本获取?手动操作的3大痛点
- 五种主流脚本方案详解(Python/Shell/PowerShell/ADB/BAT)
- 实战案例:批量采集100台安卓设备的IMEI与序列号
- 常见问题与避坑指南
- 关键问答:你关心的脚本获取细节
设备识别码的核心价值与常见类型
设备识别码是数字世界里的“身份证”,用于唯一标识一台硬件设备,在资产管理、用户行为分析、设备绑定策略、反欺诈系统等场景中,精准、高效地获取这些编码是基础。

常见识别码包括:
- IMEI(国际移动设备识别码):全球唯一,通常15位,用于GSM/WCDMA/LTE设备。
- MEID(移动设备识别码):CDMA设备的等效编码,通常14位。
- 序列号(SN):厂商赋予的机内唯一编码,格式因品牌而异。
- MAC地址:网络接口层标识,分WLAN MAC、蓝牙MAC。
- Android ID / IDFA:系统层设备标识,可重置。
- UUID:应用生成的唯一标识符,依赖算法。
了解类型才能选对脚本获取路径,例如IMEI需要IMEI权限或特定API,而序列号可通过系统命令直接读取。
为什么用脚本获取?手动操作的3大痛点
- 效率低下:一台台翻看系统设置、用USB 逐个读取,100台设备可能耗时整天。
- 易出错:人工手抄容易漏位、误读,特别在IMEI的15位数字中。
- 难以统一格式:不同品牌、系统的识别码存储位置不同,手动记录无法标准化。
而脚本可实现 批量执行、精确抓取、自动格式化,将数小时工作缩短至几分钟。
五种主流脚本方案详解
🐍 Python:跨平台利器(推荐)
import subprocess
import re
# 获取Windows下无线网卡MAC
result = subprocess.run(['getmac'], capture_output=True, text=True)
mac = re.search(r'([0-9A-F]{2}[-]){5}[0-9A-F]{2}', result.stdout)
print(mac.group() if mac else "Not Found")
# 获取Android设备IMEI(需adb)
import os
imei = os.popen('adb shell dumpsys iphonesubinfo').read()
# 解析IMEI字段
⚙️ Shell脚本(Linux/Mac)
# 获取MAC地址
MAC=$(ifconfig en0 | awk '/ether/{print $2}')
echo "MAC: $MAC"
# 获取Linux序列号
SN=$(sudo dmidecode -s system-serial-number)
echo "Serial: $SN"
🖥️ PowerShell(Windows原生)
# 获取Windows设备硬件ID gwmi Win32_ComputerSystemProduct | Select-Object Name, IdentifyingNumber # 获取网卡MAC Get-NetAdapter | Select-Object Name, MacAddress
📱 ADB(Android批量采集)
for device in $(adb devices | grep -w device | cut -f1); do
imei=$(adb -s $device shell service call iphonesubinfo 1 | grep -o '[0-9]\{15\}')
echo "$device -> IMEI: $imei"
done
🪟 BAT批处理(简易Windows)
@echo off wmic csproduct get identifyingnumber > serial.txt wmic path win32_networkadapter where "NetEnabled=true" get macaddress >> mac.txt
实战案例:批量采集100台安卓设备的IMEI与序列号
工具前提:已安装ADB,所有设备通过USB/网络连接到同一主机,且开启USB调试。
脚本核心逻辑:
- 获取设备列表(
adb devices) - 对每台设备执行两次命令:
adb -s {serial} shell getprop ro.serialnoadb -s {serial} shell dumpsys iphonesubinfo | grep "Device ID" | sed 's/[^0-9]//g'
- 将结果写入CSV文件。
完整Python脚本片段:
import subprocess, csv
result = subprocess.run(['adb', 'devices'], capture_output=True, text=True)
devices = [line.split('\t')[0] for line in result.stdout.splitlines() if '\tdevice' in line]
with open('device_ids.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Serial', 'IMEI'])
for dev in devices:
sn = subprocess.run(['adb', '-s', dev, 'shell', 'getprop', 'ro.serialno'],
capture_output=True, text=True).stdout.strip()
imei_out = subprocess.run(['adb','-s',dev,'shell','dumpsys','iphonesubinfo'],
capture_output=True, text=True).stdout
imei = ''.join(filter(str.isdigit, imei_out.split('Device ID:')[-1].split('\n')[0]))
writer.writerow([sn, imei])
输出文件可直接导入Excel或数据库。
常见问题与避坑指南
- 权限问题:获取IMEI在Android 10+需要
READ_PHONE_STATE权限,部分设备禁止应用读取,建议用AIDL或系统级ADB命令替代。 - 序列号唯一性:某些厂商(如小米)在刷机后可能重置序列号,建议同时采集IMEI + 序列号作为复合键。
- 多网卡误区:Windows下getmac可能返回多个MAC,务必筛选“本地连接/以太网”对应的条目。
- 脚本跨平台:路径符号、命令差异大,推荐Python + platform库做后端适配。
- 数据合规:收集设备识别码涉及隐私,请按当地法规(如GDPR、个人信息保护法)明确告知用户并获取授权。
关键问答:你关心的脚本获取细节
Q1:脚本获取的设备识别码与系统设置显示的完全一致吗?
A:通常一致,但某些场景下,如路由器克隆MAC,底层MAC可能已被替换,建议在多个API(如system_property、dumpsys、WMI)交叉验证。
Q2:能否获取iOS设备的IMEI?
A:iOS对隐私限制极严,普通App无法获取IMEI,MDM方案需企业级证书与App配置,常用替代是获取IDFV + IDFA(可重置)。
Q3:脚本速度太慢,如何批量优化?
A:使用并行执行(Python的concurrent.futures)或adb -x多线程模式,对数十台设备,异步加速可提升3~5倍。
Q4:有没有不需要安装ADB的方法?
A:有,基于网页的WebUSB(Chrome专用)可临时连接,但兼容性有限,企业环境建议用ADB over TCP/IP Wi-Fi连接。
Q5:识别码被程序篡改了吗?如何校验?
A:如果使用系统底层命令(如dumpsys、system_property)而非应用层API,被篡改风险低,但高级root环境可能修改序列号,可通过比对两个独立来源(如IMEI + 基带版本)做奇偶校验。
通过脚本自动化获取设备识别码,是提升运营效率、数据准确性的关键技能,根据你的平台(Windows/Linux/Mac)和设备类型(PC/安卓/iOS),选择上述方案中最适合的一类,再结合代码示例进行调整,即可快速落地,如果在实战中遇到报错,可以针对具体的命令返回或权限等级进行调试,大部分情况都有成熟解决方案。