0

我正在编写一个 Python3 脚本来通过他们的 HTTP API 触发 Axis 相机。他们需要在 url 中触发数字输入(通过授权)的字符串是:

"http://{ip}/axis-cgi/param.cgi?action=update&IOPort.I0.Input.Trig={open/closed}"

如果我把它放在浏览器中,它会工作 AKA 响应 200 - OK。当我使用 urllib 请求在我的 Linux 机器上运行它时。

#encode user,pass
values = { 'username': username,'password': password }
data = urllib.urlencode(values)

#Axis param.cgi action
action = "update"
trig = "closed"

cgi_args = {"action": action, "IOPort.I0.Input.Trig": trig}
cgi_data = urllib.urlencode(cgi_args)
url = "http://{ip}/axis-cgi/param.cgi?{data}".format(ip=ip, data=cgi_data)

req = urllib2.Request(url, data, headers={'Content-type': 'text/html'})
print(req.get_full_url())

response = urllib2.urlopen(req)
result = response.read()
print (result)

输出是:

http://192.168.50.191/axis-cgi/param.cgi?action=update&IOPort.I0.Input.Trig=closed
action must be specified

我知道我已通过身份验证,否则我会Unauthorized从服务器获得响应。

正如您在调试时看到的那样,我打印了req.get_full_url()以确保我已经正确构建了 url 字符串,但是当我在地址栏中看到时,服务器会响应action must be specified我在浏览器中得到的内容。http://192.168.50.191/axis-cgi/param.cgi?所以 URL 的操作部分似乎没有进入服务器。

我试过了:

  1. 用作%3F? 字符,但我收到 404 错误
  2. 将数据嵌入数据参数中也不起作用

我在这里缺少什么吗?

4

1 回答 1

0

将 pycurl 与摘要授权一起用于具有身份验证的 GET 请求:

def configCurl():
username = "user"
password = "pass"
auth_mode = pycurl.HTTPAUTH_DIGEST
curl = pycurl.Curl()
curl.setopt(pycurl.HTTPAUTH, auth_mode)
curl.setopt(pycurl.USERPWD, "{}:{}".format(username, password))
curl.setopt(pycurl.WRITEFUNCTION, lambda x: None)
return curl

curl = configCurl()
curl.setopt(curl.URL, url)
curl.perform()
curl.close()
于 2020-05-22T01:49:42.093 回答