我正在编写Python3脚本,以通过其HTTP API触发Axis相机。他们在URL中触发数字输入(需要授权)所需的字符串是:
"http://{ip}/axis-cgi/param.cgi?action=update&IOPort.I0.Input.Trig={open/closed}"
[如果我将其放在浏览器中,则它也可以正常工作200-确定。当我使用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的操作部分似乎没有到达服务器。
我尝试过:
%3F
作为?字符,但出现404错误我在这里想念的东西吗?
带有摘要授权的二手pycurl或带有auth的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()