"""企微设备管理API验证脚本 验证公司的企微是否启用了"设备管理"功能,以及IT服务台应用是否有权限调用。 """ import httpx import asyncio import json import os from dotenv import load_dotenv # 加载环境变量 load_dotenv(os.path.join(os.path.dirname(__file__), ".env")) CORP_ID = os.getenv("WECOM_CORP_ID", "") CORP_SECRET = os.getenv("WECOM_SECRET", "") async def main(): print("=" * 60) print("企微设备管理API验证") print("=" * 60) print(f"Corp ID: {CORP_ID[:10]}***") print() async with httpx.AsyncClient(timeout=15.0) as client: # === 第1步:获取 access_token === print("[1/3] 获取 access_token ...") resp = await client.get( "https://qyapi.weixin.qq.com/cgi-bin/gettoken", params={"corpid": CORP_ID, "corpsecret": CORP_SECRET}, ) result = resp.json() errcode = result.get("errcode", -1) errmsg = result.get("errmsg", "") if errcode != 0: print(f" ❌ 获取token失败: errcode={errcode}, errmsg={errmsg}") return token = result["access_token"] expires_in = result.get("expires_in", "?") print(f" ✅ 成功 (有效期 {expires_in}秒)") print() # === 第2步:试探 trustdevice/list === print("[2/3] 试探 trustdevice/list 接口 ...") resp2 = await client.post( "https://qyapi.weixin.qq.com/cgi-bin/security/trustdevice/list", params={"access_token": token}, json={"type": 1, "offset": 0, "limit": 1}, ) r2 = resp2.json() ec2 = r2.get("errcode", -1) em2 = r2.get("errmsg", "") data2 = r2.get("data", {}) if ec2 == 0: total = data2.get("total", data2.get("count", "?")) print(f" ✅ 设备管理已启用!API可正常调用") print(f" 设备总数: {total}") # 显示一条设备数据样例 devices = data2.get("devices", data2.get("data", [])) if devices: sample = json.dumps(devices[0], ensure_ascii=False, indent=2) print(f" 设备样例数据(第1条):") print(f" {sample[:400]}") elif ec2 == 600001: print(f" ❌ 设备管理未启用 或 应用无权限") print(f" errcode={ec2}, errmsg={em2}") else: print(f" ⚠️ 未知返回: errcode={ec2}, errmsg={em2}") print() # === 第3步:试探 trustdevice/get_by_user === print("[3/3] 试探 trustdevice/get_by_user 接口 ...") resp3 = await client.post( "https://qyapi.weixin.qq.com/cgi-bin/security/trustdevice/get_by_user", params={"access_token": token}, json={"userid": "test_user_not_exist_12345", "offset": 0, "limit": 1}, ) r3 = resp3.json() ec3 = r3.get("errcode", -1) em3 = r3.get("errmsg", "") if ec3 == 0: print(f" ✅ get_by_user 接口可调用") print(f" 返回数据: {json.dumps(r3.get('data', {}), ensure_ascii=False)[:200]}") elif ec3 == 600001: print(f" ❌ 应用无权限调用此接口") print(f" errcode={ec3}, errmsg={em3}") elif ec3 == 60101: # userid不存在,但接口本身可用 print(f" ✅ 接口存在且可调用 (userid不存在是预期的)") print(f" errcode=60101 表示用户不存在,接口本身可用") else: print(f" ⚠️ 返回: errcode={ec3}, errmsg={em3}") print() # === 结论 === print("=" * 60) print("验证结论") print("=" * 60) if ec2 == 0: print("🎉 企微设备管理已启用,可直接集成!") print(" 下一步: 用真实userid调用get_by_user验证映射数据") elif ec2 == 600001: print("📋 设备管理功能未启用或应用未授权") print(" 需要企微管理员操作:") print(" 1. 登录管理后台 → 安全与管理 → 设备管理 → 开启功能") print(" 2. 在设备管理设置中,将IT服务台应用添加到「可调用接口的应用」") else: print(f"🔍 结果不确定 (errcode={ec2}),需进一步排查") if __name__ == "__main__": asyncio.run(main())