/*
* 从Web 端 HIKVISION 获取下载图片xml信息脚本
* 下载后可以根据xml里面的信息去下载图片
* 最好使用“国产浏览器”可以实现自动下载,如果使用新版本谷歌浏览器的话,每一次的下载请求都需要手动确认才能完成下载
*
* 另外此段代码里的xml正确性验证结果不可靠,
* 需要靠其它方法进行辅助验证
* */
var trackID = '';
var nowCamera = 1;
var allCamera = 48;
var searchID = `C92FD0F0-4200-0001-D8B6-8FA61C171A56`;
// 起始day
var st_int_b = 11;
// 终止day
var et_int = 20;
var st_int = st_int_b;
// 当前month
var month = 11;
// 当前year
var year = 2021;
var maxResults = 50
var searchResultPostion = 0
var resultXML = null;
// 每次请求的间隔
var delay = 0.06;
var nextDelay = 0.2;
// 由于服务器限制单次连续请求最高可获取4000条数据,所以需要根据实际情况调整获取数据的时间尺度来防止数据获取不完整
var sTimeRear = ['00:00:00Z', '03:00:00Z', '06:00:00Z', '09:00:00Z', '12:00:00Z', '15:00:00Z', '18:00:00Z', '21:00:00Z']
var eTimeRear = ['02:59:59Z', '05:59:59Z', '08:59:59Z', '11:59:59Z', '14:59:59Z', '17:59:59Z', '20:59:59Z', '23:59:59Z']
var timePoint = 0;
var Num_Times_Segments = sTimeRear.length; // 分段长度
// var sTimeRear = '00:00:00Z';
// var mTimeRear = '12:59:59Z';
// var msTimeRear = '13:00:00Z';
// var eTimeRear = '23:59:59Z';
var aTimeRear = sTimeRear[timePoint];
var bTimeRear = eTimeRear[timePoint];
function startRequest(){
aTimeRear = sTimeRear[timePoint];
bTimeRear = eTimeRear[timePoint];
trackID = nowCamera + '03';
console.log('执行请求:' + searchResultPostion);
var startTime = `${year}-${PrefixInteger(month, 2)}-${PrefixInteger(st_int, 2)}T${aTimeRear}`
var endTime = `${year}-${PrefixInteger(month, 2)}-${PrefixInteger(st_int, 2)}T${bTimeRear}`
let queryXML = `<?xml version: "1.0" encoding="utf-8"?><CMSearchDescription><searchID>${searchID}</searchID><trackList><trackID>${trackID}</trackID></trackList><timeSpanList><timeSpan><startTime>${startTime}</startTime><endTime>${endTime}</endTime></timeSpan></timeSpanList><contentTypeList><contentType>metadata</contentType></contentTypeList><maxResults>${maxResults}</maxResults><searchResultPostion>${searchResultPostion}</searchResultPostion><metadataList><metadataDescriptor>//recordType.meta.std-cgi.com/allPic</metadataDescriptor></metadataList></CMSearchDescription>`
$.ajax({
type:'post',
url:'http://170.2.229.50/ISAPI/ContentMgmt/search',
data: queryXML,
success: processXML,
})
}
function processXML(xml){
let resStatus = xml.getElementsByTagName('responseStatus');
let isContinue = xml.getElementsByTagName('responseStatusStrg')[0].innerHTML;
if (resStatus[0].innerHTML === 'true')
{
switch (isContinue){
// 还要继续请求
case 'MORE':
// 合法性判断
// 如果不合法将会重复此次请求
if (judgeStringXMLISRight(XMLToString(xml)) === 0) {
delXML(xml);
searchResultPostion += maxResults;
}
setTimeout(startRequest, 1000 * delay);
break;
// 请求完毕
case 'OK':
// 合法性判断
if (judgeStringXMLISRight(XMLToString(xml)) === 0) {
delXML(xml);
if (timePoint < Num_Times_Segments - 1)
{
++timePoint;
searchResultPostion = 0;
setTimeout(startRequest, 1000 * delay);
}
else
{
nextDay();
}
} else {
setTimeout(startRequest, 1000 * delay);
}
break;
// 无结果
case "NO MATCHES":
console.log('no matches')
if (timePoint < Num_Times_Segments - 1)
{
++timePoint;
searchResultPostion = 0;
setTimeout(startRequest, 1000 * delay);
}
else
{
nextDay();
}
// nextDay();
break ;
}
}
else
{
console.log('*************出错***************')
}
console.log(resultXML !== null ? resultXML.getElementsByTagName('searchMatchItem').length : 0);
function delXML(xml){
if (!resultXML)
resultXML = xml;
else
{
let items = resultXML.getElementsByTagName('matchList')[0];
// let length = parseInt(xml.getElementsByTagName('numOfMatches')[0]);
let newNode = xml.getElementsByTagName('searchMatchItem');
for (let i = 0; i < newNode.length; ++i)
{
items.appendChild((newNode[i]).cloneNode(true));
}
}
}
}
function nextDay(){
timePoint = 0;
++st_int;
if (st_int <= et_int)
{
searchResultPostion = 0;
setTimeout(startRequest, 1000 * nextDelay);
}
else{
console.log('将保存数据:' + (resultXML !== null ? resultXML.getElementsByTagName('searchMatchItem').length : 0) + '条');
let fileName = 'D' + nowCamera + '03__' + PrefixInteger(month, 2) + PrefixInteger(st_int_b, 2) + '_' + PrefixInteger(month, 2) + PrefixInteger(et_int, 2) + '__' + getLocalTime() + '__' + (resultXML !== null ? resultXML.getElementsByTagName('searchMatchItem').length : 0) + '.xml.txt';
if (resultXML === null)
{
console.log('无数据. . .');
// exportRaw(fileName, '');
}
else
{
let serializer = new XMLSerializer();
let str = serializer.serializeToString(resultXML);
exportRaw(fileName, str);
}
console.log('export:' + fileName);
nextCamera();
}
}
function nextCamera(){
++nowCamera;
if (nowCamera <= allCamera)
{
searchResultPostion = 0;
st_int = st_int_b;
resultXML = null;
setTimeout(startRequest, 1000 * nextDelay);
}
else
{
console.log('任务结束');
}
}
function formatURI(xml){
let urls = xml.getElementsByTagName('playbackURI');
for (let i = 0; i < urls.length; ++i)
{
let t = urls[i].innerHTML.toString();
let tn = document.createTextNode(t.replaceAll('amp;', ''))
urls[i].removeChild(urls[i].firstChild);
urls[i].appendChild(tn)
// console.log(urls[i].innerHTML)
}
console.log(urls)
return xml;
}
function PrefixInteger(num, length) {
return (Array(length).join('0') + num).slice(-length);
}
function fakeClick(obj) {
var ev = document.createEvent("MouseEvents");
ev.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
obj.dispatchEvent(ev);
}
function exportRaw(name, data) {
var urlObject = window.URL || window.webkitURL || window;
var export_blob = new Blob([data]);
var save_link = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
save_link.href = urlObject.createObjectURL(export_blob);
save_link.download = name;
fakeClick(save_link);
}
String.prototype.replaceAll = function(s1, s2) {
return this.replace(new RegExp(s1, "gm"), s2);
}
//获取一个类似“2018-11-02_19-52”格式的时间字符串,时间信息为调用时间
function getLocalTime ()
{
let currentTime = new Date();
let currentTimeStr = '';
currentTimeStr += currentTime.getFullYear() + "-";
currentTimeStr += PrefixInteger(currentTime.getMonth() + 1, 2);
currentTimeStr += "-";
currentTimeStr += PrefixInteger(currentTime.getDate(), 2);
currentTimeStr += '_' + PrefixInteger(currentTime.getHours(), 2) + "-" + PrefixInteger(currentTime.getMinutes(), 2)
return currentTimeStr;
}
// 将xml document 转为string
function XMLToString(xmlDocument) {
let serializer = new XMLSerializer();
return serializer.serializeToString(xmlDocument);
}
// 判断字符型的xml文件是否合规
function judgeStringXMLISRight(xmlString) {
let parser = new DOMParser();
let xmlDoc = parser.parseFromString(xmlString, 'text/xml')
let error = xmlDoc.getElementsByTagName("parsererror");
if (error.length > 0)
{
console.log("格式错误");
return -1;
// if(xmlDoc.documentElement.nodeName === "parsererror"){
// errorCode = 1;
// errorMessage = xmlDoc.documentElement.childNodes[0].nodeValue;
// } else {
// errorCode = 1;
// errorMessage = xmlDoc.getElementsByTagName("parsererror")[0].innerHTML;
// }
}
else
{
console.log("格式正确");
return 0;
}
}
// 3264
/*
1072
240
1018
998
1072 + 240 + 1018 + 998
*/
Comments | NOTHING