You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python通过HTTP URL下载大华NVR摄像头快照遇401授权问题

解决大华NVR快照请求401未授权问题

核心原因

大华NVR的认证机制并非完全遵循标准HTTP Basic Auth,可能需要模拟浏览器请求特征、先建立会话Cookie,或使用Digest认证方式,这是导致requests直接请求失败但浏览器正常的关键。

可行解决方案

1. 模拟浏览器请求头+Digest认证

大华设备普遍支持Digest认证,同时会校验User-Agent字段,拒绝非浏览器请求。直接用requests的Digest认证并添加浏览器请求头:

import requests
from PIL import Image
import io
import numpy as np

# 替换为你的设备信息
USERNAME = "admin"
PASSWORD = "your_password"
IP_ADDRESS = "192.168.1.100"
CHANNEL = 1

url = f"http://{IP_ADDRESS}/cgi-bin/snapshot.cgi?channel={CHANNEL}"

# 模拟Chrome浏览器请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

# 使用Digest认证请求快照
response = requests.get(url, auth=requests.auth.HTTPDigestAuth(USERNAME, PASSWORD), headers=headers)

if response.status_code == 200:
    # 将快照转为神经网络可用的numpy数组
    image = Image.open(io.BytesIO(response.content))
    image_array = np.array(image)
    print("快照获取成功,已转为numpy数组")
else:
    print(f"请求失败,状态码:{response.status_code}")

2. 先登录获取会话Cookie再请求

部分型号需要先通过登录接口建立会话,获取Cookie后再请求快照:

import requests
from PIL import Image
import io
import numpy as np

USERNAME = "admin"
PASSWORD = "your_password"
IP_ADDRESS = "192.168.1.100"
CHANNEL = 1

# 初始化会话
session = requests.Session()
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

# 发送登录请求(大华通用登录接口,部分型号可能需调整参数)
login_url = f"http://{IP_ADDRESS}/cgi-bin/userLogin.cgi"
login_data = {
    "username": USERNAME,
    "password": PASSWORD,
    "remember": "1"
}

login_response = session.post(login_url, data=login_data, headers=headers)
if login_response.status_code == 200:
    # 登录成功后请求快照
    snapshot_url = f"http://{IP_ADDRESS}/cgi-bin/snapshot.cgi?channel={CHANNEL}"
    snapshot_response = session.get(snapshot_url, headers=headers)
    
    if snapshot_response.status_code == 200:
        image = Image.open(io.BytesIO(snapshot_response.content))
        image_array = np.array(image)
        print("快照获取成功")
    else:
        print(f"快照请求失败,状态码:{snapshot_response.status_code}")
else:
    print(f"登录失败,状态码:{login_response.status_code}")

3. 处理含特殊字符的账号密码

如果账号或密码包含@、#等特殊字符,需先URL编码再嵌入URL:

import urllib.parse
import requests

encoded_username = urllib.parse.quote(USERNAME)
encoded_password = urllib.parse.quote(PASSWORD)
url = f"http://{encoded_username}:{encoded_password}@{IP_ADDRESS}/cgi-bin/snapshot.cgi?channel={CHANNEL}"

response = requests.get(url, headers=headers)

额外提示

  • 若以上方法无效,可查看设备Web管理界面的「API文档」或「帮助中心」,确认型号对应的认证规则
  • 可通过print(response.headers)查看返回头,若包含WWW-Authenticate: Digest ...,则说明必须用Digest认证

内容的提问来源于stack exchange,提问作者Mateusz Boruch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:42:43