LogicMachine Forum
Hikvision API - Printable Version

+- LogicMachine Forum (https://forum.logicmachine.net)
+-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1)
+--- Forum: Scripting (https://forum.logicmachine.net/forumdisplay.php?fid=8)
+--- Thread: Hikvision API (/showthread.php?tid=6294)



Hikvision API - gdimaria - 04.02.2026

Hi, 

I need to communicate with Hikvision devices via API.
The devices, however, use "digest" authentication, not basic

I tried this code,but  I got 401....


Code:
local http = require('socket.http') local ltn12 = require('ltn12') -- CONFIGURAZIONE local ip = "192.168.0.245" local user = "admin" local pass = "TuaPassword" -- <--- Inserisci la tua password local url = "/ISAPI/System/deviceInfo" -- FUNZIONE MD5 PURE LUA (Nessuna libreria richiesta) local function md5_calc(message)     local function str2hex(s) return (s:gsub('.', function(c) return string.format('%02x', string.byte(c)) end)) end     local function word2str(w)         local s = ""         for i = 1, 4 do s = s .. string.char(bit.band(bit.rshift(w, (i - 1) * 8), 0xff)) end         return s     end     -- Logic Machine ha la libreria bit integrata, usiamo quella     return string.md5(message) end -- Se string.md5 fallisce di nuovo, usiamo questa scorciatoia che LM usa internamente function calculate_md5(str)     -- Proviamo il metodo più diretto possibile per LM 2025     local ok, res = pcall(function() return crypto.hash(str, 'md5') end)     if ok then return res end         ok, res = pcall(function() return string.md5(str) end)     if ok then return res end     ok, res = pcall(function() return encodetools.md5(str) end)     if ok then return res end         error("Impossibile trovare una funzione MD5 valida") end function get_hikvision_info_digest()     local response_body = {}         -- 1. Prima chiamata per ottenere la sfida     local res, code, headers = http.request("http://" .. ip .. url)         if code == 401 and headers['www-authenticate'] then         local auth_header = headers['www-authenticate']         local realm = auth_header:match('realm="([^"]+)"')         local nonce = auth_header:match('nonce="([^"]+)"')         local qop = auth_header:match('qop="([^"]+)"')                 local method = "GET"         local uri = url         local nc = "00000001"         local cnonce = string.format("%08x", os.time())                 -- Calcolo Digest         local HA1 = calculate_md5(user .. ":" .. realm .. ":" .. pass)         local HA2 = calculate_md5(method .. ":" .. uri)         local response = calculate_md5(HA1 .. ":" .. nonce .. ":" .. nc .. ":" .. cnonce .. ":" .. qop .. ":" .. HA2)                 local digest_header = string.format(             'Digest username="%s", realm="%s", nonce="%s", uri="%s", response="%s", qop=%s, nc=%s, cnonce="%s"',             user, realm, nonce, uri, response, qop, nc, cnonce         )                 -- 2. Seconda chiamata         res, code, headers = http.request({             url = "http://" .. ip .. url,             method = "GET",             headers = { ["Authorization"] = digest_header },             sink = ltn12.sink.table(response_body)         })                 local response_str = table.concat(response_body)         log("Codice: " .. tostring(code))         if code == 200 then             log("SUCCESSO! Dati dispositivo:")             log(response_str)         else             log("Errore: " .. response_str)         end     else         log("Dispositivo non risponde o non richiede Auth. Codice: " .. tostring(code))     end end get_hikvision_info_digest()
.
Is it possible to implement this feature in LM?


RE: Hikvision API - admin - 04.02.2026

Try code from this post: https://forum.logicmachine.net/showthread.php?tid=6208&pid=40628#pid40628

Your code won't even work on LM because there are no such libraries that calculate_md5() tries to use.