import requests
from requests.auth import HTTPDigestAuth
import xml.etree.ElementTree as ET
def control_hikvision_door(device_ip, user_name, password, command="open"):
"""
通过 ISAPI 协议控制海康门禁设备的开关状态。
Args:
device_ip (str): 设备的 IP 地址 (例如 "192.168.1.69")。
user_name (str): 登录用户名。
password (str): 登录密码。
command (str): 控制指令,默认为 "open" (常开/开门)。
部分设备支持 "close" (关门), "alwaysOpen" (常开), "alwaysClose" (常闭)。
Returns:
bool: 命令执行成功返回 True,失败返回 False。
"""
# 构建 API URL
# 对于 DS-K1T673 系列,门编号通常为 1
api_url = f"http://{device_ip}/ISAPI/AccessControl/RemoteControl/door/1"
# 构建 XML 请求体
# xmlns 命名空间通常是必须的,version 可选
xml_body = f"""
{command}
"""
headers = {
"Content-Type": "application/xml"
}
try:
# 发送 PUT 请求,必须使用 Digest 认证
response = requests.put(
api_url,
auth=HTTPDigestAuth(user_name, password),
data=xml_body,
headers=headers,
timeout=5
)
# 检查 HTTP 状态码
if response.status_code == 200:
# 解析返回的 XML 确认执行结果
# 成功通常返回 1 和 OK
print(f"[成功] 门禁响应: {response.text}")
return True
else:
print(f"[失败] HTTP 错误码: {response.status_code}")
print(f"[失败] 错误信息: {response.text}")
return False
except requests.exceptions.RequestException as e:
print(f"[错误] 连接异常: {e}")
return False
# --- 主程序执行 ---
if __name__ == "__main__":
# 配置参数
target_ip = "192.168.1.69"
admin_user = "admin"
admin_pass = "hzx12345"
print(f"正在尝试连接门禁 {target_ip} ...")
# 执行开门操作
is_success = control_hikvision_door(target_ip, admin_user, admin_pass, "open")
if is_success:
print("开门指令发送完毕。")
else:
print("开门指令发送失败,请检查网络或密码。")