This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm that you accept these cookies being set.

email with attachement gives image size 0
#1
Hello,

I have a script that sends an email with attached foscam camera snaphots when my doorbell is pushed.

That works great for months, but after some time it crashed my lm4 as following:
- when my doorbell is pushed i receive an email with size 0 images. every doorbell push i receive that mail with size 0 image
- so i try to find the problem and test my code manual with a resident script (sleepinterval 60), the same code as my event-based script

Code:
12
require('user.nit_email') mail({'test@test.nl'}, 'Test', 'Test message.', 'std_camera_2')
-I receive every 60 seconds an email, thats correct. But when i stop/deactivate this script i also receive every 60 seconds the email, why?
-So i need to restart my lm4 to solve this issue.

Nit_email

Code:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
local from_name = 'HomeLynk' local settings = {    -- "from" field, only e-mail must be specified here    from = 'test@test.nl',    -- smtp username    --user = '',    -- smtp password    --password = '',    -- smtp server    server = '1.2.3.4',    -- smtp server port    port = 25,    -- enable ssl, required for gmail smtp    --secure = 'sslv23',  } local escape = function(v)  return '<' .. tostring(v) .. '>' end -- send an e-mail, function mail(to, subject, message, att)  -- make sure these settings are correct  local smtp = require('socket.smtp')  if att then    local mime = require('mime')         local ltn12 = require('ltn12')    -- generate attachements    bodyAtt = handleAtt(att, 'start')  else    bodyAtt = {"",""}  end    if type(to) ~= 'table' then    to = { to }  end    for index, email in ipairs(to) do    to[ index ] = escape(email)  end       settings.source = smtp.message({    headers = {      from = from_name..escape(settings.from),      to = table.concat(to, ', '),      subject = subject,    },    body = {        --preamble = "Hello Recipient, \r\n" .. "This is your e-mail with a picture attached.",        {          header = {            ['Content-type'] = 'text/html; charset=utf-8',          },          body = mime.eol(0, message),        },        bodyAtt[1],bodyAtt[2], -- get attachements if exists (max 2 for now)  <---todo:make it dynamic        --epilogue = "That's it folks! :)"    }  })  bodyAtt = nil    -- fixup from field  settings.from = escape(settings.from)  settings.rcpt = to  smtp.send(settings)  if att then    handleAtt(att, 'end')  end end -- std_camera: snapshot camera voordeur -- std_camera_b: snapshot camera voordeur en achterdeur function handleAtt(att, handle)  if handle == "start" then    if att == "std_camera" then      require('user.nit_camera')      dst = '/tmp/capture.jpg'      local url = string.format(url_cmdFoscam, cam_voordeur, cam_port, 'snapPicture2', '', cam_usr2, cam_pwd2)             local cmd = string.format('wget -O %q %q', dst, url)             os.execute(cmd)      local attachment = ltn12.source.chain( ltn12.source.file(io.open(dst, 'r')), ltn12.filter.chain(mime.encode('base64'), mime.wrap()) )      return      {        {          headers = {            ['Content-type'] = 'image/jpeg; name="image.jpg"',            ['Content-disposition'] = 'attachment; filename="image.jpg"',            ['Content-transfer-encoding'] = 'BASE64',          },          body = attachment        }             }        elseif att == "std_camera_b" then      require('user.nit_camera')      dst1 = '/tmp/capture1.jpg'      dst2 = '/tmp/capture2.jpg'      local url1 = string.format(url_cmdFoscam, cam_voordeur, cam_port, 'snapPicture2', '', cam_usr2, cam_pwd2)      local url2 = string.format(url_cmdFoscam, cam_achterdeur, cam_port, 'snapPicture2', '', cam_usr2, cam_pwd2)             local cmd1 = string.format('wget -O %q %q', dst1, url1)             local cmd2 = string.format('wget -O %q %q', dst2, url2)      os.execute(cmd1)             os.execute(cmd2)      local attachment1 = ltn12.source.chain( ltn12.source.file(io.open(dst1, 'r')), ltn12.filter.chain(mime.encode('base64'), mime.wrap()) )      local attachment2 = ltn12.source.chain( ltn12.source.file(io.open(dst2, 'r')), ltn12.filter.chain(mime.encode('base64'), mime.wrap()) )      return      {        {          headers = {            ['Content-type'] = 'image/jpeg; name="image1.jpg"',            ['Content-disposition'] = 'attachment; filename="image1.jpg"',            ['Content-transfer-encoding'] = 'BASE64',          },          body = attachment1        },        {          headers = {            ['Content-type'] = 'image/jpeg; name="image2.jpg"',            ['Content-disposition'] = 'attachment; filename="image2.jpg"',            ['Content-transfer-encoding'] = 'BASE64',          },          body = attachment2        }      }        elseif att == "std_camera_2" then      require('user.nit_camera')      dst1 = '/tmp/capture1.jpg'      dst2 = '/tmp/capture2.jpg'      local url1 = string.format(url_cmdFoscam, cam_voordeur, cam_port, 'snapPicture2', '', cam_usr2, cam_pwd2)             local cmd1 = string.format('wget -O %q %q', dst1, url1)             local cmd2 = string.format('wget -O %q %q', dst2, url1)      os.execute(cmd1) -- direct snapshot      cmdFoscam(cam_voordeur, cam_port, 'ptzGotoPresetPoint', '&name=Deur') -- move to frontdoor             os.sleep(20) -- wait for 20 seconds      os.execute(cmd2) -- new snapshot      local attachment1 = ltn12.source.chain( ltn12.source.file(io.open(dst1, 'r')), ltn12.filter.chain(mime.encode('base64'), mime.wrap()) )      local attachment2 = ltn12.source.chain( ltn12.source.file(io.open(dst2, 'r')), ltn12.filter.chain(mime.encode('base64'), mime.wrap()) )      return      {        {          headers = {            ['Content-type'] = 'image/jpeg; name="image1.jpg"',            ['Content-disposition'] = 'attachment; filename="image1.jpg"',            ['Content-transfer-encoding'] = 'BASE64',          },          body = attachment1        },        {          headers = {            ['Content-type'] = 'image/jpeg; name="image2.jpg"',            ['Content-disposition'] = 'attachment; filename="image2.jpg"',            ['Content-transfer-encoding'] = 'BASE64',          },          body = attachment2        }      }    end    elseif handle == "end" then    if att == "std_camera" then      os.remove(dst)    elseif att == "std_camera_b" then      os.remove(dst1)      os.remove(dst2)    elseif att == "std_camera_2" then      os.remove(dst1)      os.remove(dst2)    end  end   end

Nit_camera
Code:
123456789101112131415161718192021222324
-- snapshot urls cam_voordeur = '2.2.2.2' cam_achterdeur = '2.2.2.3' cam_port = 80 cam_usr = 'user' cam_pwd = 'password' cam_usr2 = 'user2' cam_pwd2 = 'password2' -- start command urls url_cmdFoscam = 'http://%s:%s/cgi-bin/CGIProxy.fcgi?cmd=%s%s&usr=%s&pwd=%s' -- Foscam camera command function cmdFoscam(iCamera, iPort, iCmd, iParam)  local url, response  url = string.format(url_cmdFoscam, iCamera, iPort, iCmd, iParam, cam_usr, cam_pwd)         if (url) then      require('socket.http')    socket.http.TIMEOUT = 5    response = socket.http.request( url_encode(url) )  end  return response end
Reply
#2
You should use LuaSocket to get a snapshot instead of wget. wget will fail if output file already exist so this might cause a problem with 0 sized attachments. There's no need to save snapshot to /tmp, you can use ltn12.source.string.
Reply
#3
(26.10.2017, 09:06)admin Wrote: You should use LuaSocket to get a snapshot instead of wget. wget will fail if output file already exist so this might cause a problem with 0 sized attachments. There's no need to save snapshot to /tmp, you can use ltn12.source.string.

can you please give a little example?
Reply
#4
You already have a function for HTTP requests, just get your snapshot by calling cmdFoscam and then pass the result like this:
Code:
12
local snapshot = cmdFoscam(...) local attachment = ltn12.source.chain( ltn12.source.string(snapshot), ltn12.filter.chain(mime.encode('base64'), mime.wrap()) )
Reply
#5
Hello,

I've tried to use this script but I can´t get it to work.

******************************************************************************
function handleAtt(att)
if att == "snapshoot" then
local snapshoot = 'http://IPCAMERA/cgi-bin/snapshot.cgi?'
local attachment = ltn12.source.chain( ltn12.source.string(snapshot), ltn12.filter.chain(mime.encode('base64'), mime.wrap()) )
return
{
{
headers = {
['Content-type'] = 'image/jpeg; name="image.jpg"',
['Content-disposition'] = 'attachment; filename="image.jpg"',
['Content-transfer-encoding'] = 'BASE64',
},
body = attachment
}
}
end
end

The mail function send me a emai with jpg attachment but i can´t see anything.
When I use the link 'http://IPCAMERA/cgi-bin/snapshot.cgi?' i have to log in. How can I automatize with code?

Thanks
Reply
#6
Try like that

'http://user:password@IPCAMERA/cgi-bin/snapshot.cgi?'
------------------------------
Ctrl+F5
Reply
#7
(11.07.2018, 11:02)Daniel. Wrote: Try like that

'http://user:password@IPCAMERA/cgi-bin/snapshot.cgi?'

It doesn´t work.
I´ve tried diferent options and every time ask me user and pass.

https://www.ispyconnect.com/man.aspx?n=Dahua
Reply
#8
(11.07.2018, 14:12)DGrandes Wrote:
(11.07.2018, 11:02)Daniel. Wrote: Try like that

'http://user:password@IPCAMERA/cgi-bin/snapshot.cgi?'

It doesn´t work.
I´ve tried diferent options and every time ask me user and pass.

https://www.ispyconnect.com/man.aspx?n=Dahua

You can try like here:
https://forum.logicmachine.net/showthrea...38#pid6338

Maybe your camera support such params:
http://IP_address/cgi-bin/snapshot.cgi?c...p=password
Done is better than perfect
Reply
#9
(11.07.2018, 14:20)buuuudzik Wrote:
(11.07.2018, 14:12)DGrandes Wrote:
(11.07.2018, 11:02)Daniel. Wrote: Try like that

'http://user:password@IPCAMERA/cgi-bin/snapshot.cgi?'

It doesn´t work.
I´ve tried diferent options and every time ask me user and pass.

https://www.ispyconnect.com/man.aspx?n=Dahua

You can try like here:
https://forum.logicmachine.net/showthrea...38#pid6338

Maybe your camera support such params:
http://IP_address/cgi-bin/snapshot.cgi?c...p=password

Don´t work..

My camera is IPC-HDBW1320E of Dahua and I try with both url of 'https://www.ispyconnect.com/man.aspx?n=Dahua':

It do something strange.. the first time I´ve tried the url it work and don´t ask me the user and pass, but once i use this url it doesn´t work..

I´ve tried with:

http://user:pass@CAMERAIP/cgi-bin/snapshot.cgi?1

http://admin:user@CAMERAIP/cgi-bin/snapshot.cgi?loginuse=user&loginpas=pass
http://admin:user@CAMERAIP/cgi-bin/snapshot.cgi?user=user&pass=pass
http://admin:user@CAMERAIP/cgi-bin/snapshot.cgi?user=user&pwd=pass
http://admin:user@CAMERAIP/cgi-bin/snapshot.cgi?u=user&p=pass
Reply
#10
Can you try to add a fake parameter in the url like timestamp.
http://user:pass@CAMERAIP/cgi-bin/snapshot.cgi?1&ts=randomnumber

If it worked 1 time, and then fail, maybe there is a caching issue. By adding a parameter that change in the url, it is consider as a new request and will not look in the cache if any.
Reply
#11
(11.07.2018, 18:21)mlaudren Wrote: Can you try to add a fake parameter in the url like timestamp.
http://user:pass@CAMERAIP/cgi-bin/snapshot.cgi?1&ts=randomnumber

If it worked 1 time, and then fail, maybe there is a caching issue. By adding a parameter that change in the url, it is consider as a new request and will not look in the cache if any.

Thanks!! this random number works perfectly. But with the script don´t attach the image correctly.. can you help me with the script?

Event-Based Script:

mail('MyEmail', 'ALERTA', '¡¡¡Alguien en casa!!!', 'captura') 


Comon Functions:

function mail (to, subject, message, att)
  -- make sure these settings are correct
  local settings = {
    -- "from" field, only e-mail must be specified here
    from = '......',
    -- smtp username
    user = '.....',
    -- smtp password
    password = '......',
    -- smtp server
    server = 'smtp.gmail.com',
    -- smtp server port
    port = 465,
    -- enable tls, required for gmail smtp
    secure = 'tlsv1_2',
  }
  -- make sure these settings are correct
  local smtp = require('socket.smtp')
  
  local escape = function(v)
  return '<' .. tostring(v) .. '>'
end

  local from_name = '.......'
  if att then
    local mime = require('mime')
        local ltn12 = require('ltn12')
    -- generate attachements
    bodyAtt = handleAtt(att) --bodyAtt = handleAtt(att, 'start')
  else
    bodyAtt = {"",""}
  end
  
  if type(to) ~= 'table' then
    to = { to }
  end
  
  for index, email in ipairs(to) do
    to[ index ] = escape(email)
  end
    
  settings.source = smtp.message({
    headers = {
      from = from_name..escape(settings.from),
      to = table.concat(to, ', '),
      subject = subject,
    },
    body = {
        --preamble = "Hello Recipient, \r\n" .. "This is your e-mail with a picture attached.",
        {
          header = {
            ['Content-type'] = 'text/html; charset=utf-8',
          },
          body = mime.eol(0, message),
        },
        bodyAtt[1],bodyAtt[2], -- get attachements if exists (max 2 for now)  <---todo:make it dynamic
        --epilogue = "That's it folks! Smile"
    }
  })
  bodyAtt = nil
   
  -- fixup from field
  settings.from = escape(settings.from)
  settings.rcpt = to

  smtp.send(settings)
end


function handleAtt(att)
    if att == "captura" then
    local snapshot = 'CAMERAIP'--..math.random(0, 1000000000000)
    
    log (snapshot)
    
    local attachment = ltn12.source.chain( ltn12.source.string(snapshot), ltn12.filter.chain(mime.encode('base64'), mime.wrap()) )
    return 
      {
        {
          headers = {
            ['Content-type'] = 'image/jpeg; name="Captura.jpg"',
            ['Content-disposition'] = 'attachment; filename="Captura.jpg"',
            ['Content-transfer-encoding'] = 'BASE64',
          },
          body = attachment
        }
            }
  
end
end
  

Thanks!!!
Reply
#12
Hi,

I still don't know how to make a snapshoot from my ip camera and save or send it.

I have created a DNS to share the url in case you want to test it and help me. The camera is covered by privacy reasons...

IP : http://dnspruebacamara.myqnapcloud.com:5858/
user: admin
pass: 123456789

I have test it from web explorers (chrome or firefox) and it works perfectly from Them:

http://admin:123456789@dnspruebacamara.m...pshot.jpeg

where ts=... is a random number that i must change by code, for the navigator not to ask me again the security credencials

.... But I can not get it work from the following code:

image_type = 'jpeg'
image_name_attachment = 'snapshot'
source_image_url = 'http://admin:123456789@dnspruebacamara.myqnapcloud.com:5858/cgi-bin/snapshot.cgi?1&ts=4561248/snapshot.jpeg'

where ts=... is a random number that i must change by code, for the navigator not to ask me again the security credencials

--Get remote (from HTTP) image and put image file to HL (will be deleted when end of script)
os.execute('wget -O /www/scada/vis/' .. image_name_attachment .. '.' .. image_type .. ' ' .. source_image_url .. '')

or I have also tried this other code, and it did not work either:

image = socket.http.request(source_image_url)

I know that I am doing something wrong, but I dont know what I am missing.

Can anyone help me please???

Best regards
Reply
#13
Your camera uses digest auth mechanism which is not supported by socket.http library.
Use this code to get your snapshot:

Code:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
local skthttp = require('socket.http') local skturl = require('socket.url') local ltn12 = require('ltn12') local md5sum = require('encdec').md5 local hash = function(...)   return md5sum(table.concat({...}, ':')) end local parse_header = function(header)   local result = {}   for key, value in (header .. ','):gmatch('(%w+)=(.-),') do     if value:sub(1, 1) == '"' then -- strip quotes       result[ key:lower() ] = value:sub(2, -2)     else       result[ key:lower() ] = value     end   end   return result end local make_digest_header = function(headers)   local digest = {}   for _, header in ipairs(headers) do     if not header.unquote then       header[ 2 ] = '"' .. header[ 2 ] .. '"'     end     digest[ #digest + 1 ] = header[ 1 ] .. '=' .. header[ 2 ]   end   return 'Digest ' .. table.concat(digest, ', ') end local _request = function(req)   if not req.url then     return nil, 'missing url'   end   local url = skturl.parse(req.url)   local user, password = url.user, url.password   local sink = req.sink   if not user or not password then     return nil, 'missing credentials in url'   end   url.user, url.password, url.authority, url.userinfo = nil, nil, nil, nil   req.url = skturl.build(url)   local source   if req.source then     local chunks = {}     local capture = function(chunk)       if chunk then         chunks[ #chunks + 1 ] = chunk       end       return chunk     end     local chunk_id = 0     source = function()       chunk_id = chunk_id + 1       return chunks[ chunk_id ]     end     req.source = ltn12.source.chain(req.source, capture)   end   req.sink = nil   local body, code, hdrs = skthttp.request(req)   if code == 401 and hdrs['www-authenticate'] then     local ht = parse_header(hdrs['www-authenticate'])     if not ht.realm or not ht.nonce then       return nil, 'missing realm/nonce from response'     end     local qop = ht.qop     if qop and qop ~= 'auth' then       return nil, 'unsupported qop ' .. tostring(qop)     end     if ht.algorithm and ht.algorithm:lower() ~= 'md5' then       return nil, 'unsupported algo ' .. tostring(ht.algorithm)     end     local nc = '00000001'     local cnonce = string.format('%08x', os.time())     local uri = skturl.build({ path = url.path, query = url.query })     local method = req.method or 'GET'     local response = hash(       hash(user, ht.realm, password),       ht.nonce,       nc,       cnonce,       'auth',       hash(method, uri)     )     req.headers = req.headers or {}     local auth = {       { 'username', user },       { 'realm', ht.realm },       { 'nonce', ht.nonce },       { 'uri', uri },       { 'cnonce', cnonce },       { 'nc', nc, unquote = true },       { 'qop', 'auth' },       { 'algorithm', 'MD5' },       { 'response', response },     }     if ht.opaque then       table.insert(auth, { 'opaque', ht.opaque })     end     req.headers.authorization = make_digest_header(auth)     if not req.headers.cookie and hdrs['set-cookie'] then       -- not really correct but enough for httpbin       local cookie = (hdrs['set-cookie'] .. ';'):match('(.-=.-)[;,]')       if cookie then         req.headers.cookie = '$Version: 0; ' .. cookie .. ';'       end     end     if req.source then       req.source = source     end     req.sink = sink     body, code, hdrs = skthttp.request(req)   end   return body, code, hdrs end local request = function(url)   local t = type(url)   if t == 'table' then     return _request(table.clone(url))   elseif t == 'string' then     local req = {}     local _, code, headers = _request({ url = url, sink = ltn12.sink.table(req) })     return table.concat(req), code, headers   end end url = 'http://admin:123456789@dnspruebacamara.myqnapcloud.com:5858/cgi-bin/snapshot.cgi?1&ts=123/snapshot.jpeg' image, err, hdrs = request(url)
Reply
#14
Thanks you!

It works perfectly

Best Regards
Reply
#15
Hello!
I tried to adapt the script from post 13 to my task. But as a result, I get a file with an image, before which there is a piece of HTML code. In the logs we can see:
Code:
12345678
stest 25.02.2019 13:44:51 * string: <!DOCTYPE html> <html><head><title>Document Error: Unauthorized</title></head> <body><h2>Access Error: 401 -- Unauthorized</h2> <p>Authentication Error</p> </body> </html> ����

As we can see, the authorization on the camera does not pass, but I still get the image. In order to view it, I only need to remove the html header.
So, I have to edit the image before sending it by mail. The solution is simple, but I think it is not quite right Wink

Code:
12
a1, a2 = string.find(image,"</html>\r\n") image = string.sub(image, a2+1)

How to solve the problem correctly?
Thanks!
Reply
#16
Your solution is correct, there's nothing else that can be done since the camera response is clearly wrong Smile
Reply
#17
OK. Thank you!
Reply
#18
(16.08.2018, 12:50)I tried to use this code, hopefully I put it in right. Didn\t flag any errors in the log, so that's hopeful.I can't find the url of where the snapshot is sent to... any help??admin Wrote: Your camera uses digest auth mechanism which is not supported by socket.http library.
Use this code to get your snapshot:

Code:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
local skthttp = require('socket.http') local skturl = require('socket.url') local ltn12 = require('ltn12') local md5sum = require('encdec').md5 local hash = function(...)   return md5sum(table.concat({...}, ':')) end local parse_header = function(header)   local result = {}   for key, value in (header .. ','):gmatch('(%w+)=(.-),') do     if value:sub(1, 1) == '"' then -- strip quotes       result[ key:lower() ] = value:sub(2, -2)     else       result[ key:lower() ] = value     end   end   return result end local make_digest_header = function(headers)   local digest = {}   for _, header in ipairs(headers) do     if not header.unquote then       header[ 2 ] = '"' .. header[ 2 ] .. '"'     end     digest[ #digest + 1 ] = header[ 1 ] .. '=' .. header[ 2 ]   end   return 'Digest ' .. table.concat(digest, ', ') end local _request = function(req)   if not req.url then     return nil, 'missing url'   end   local url = skturl.parse(req.url)   local user, password = url.user, url.password   if not user or not password then     return nil, 'missing credentials in url'   end   url.user, url.password, url.authority, url.userinfo = nil, nil, nil, nil   req.url = skturl.build(url)   local source   if req.source then     local chunks = {}     local capture = function(chunk)       if chunk then         chunks[ #chunks + 1 ] = chunk       end       return chunk     end     local chunk_id = 0     source = function()       chunk_id = chunk_id + 1       return chunks[ chunk_id ]     end     req.source = ltn12.source.chain(req.source, capture)   end   local body, code, hdrs = skthttp.request(req)   if code == 401 and hdrs['www-authenticate'] then     local ht = parse_header(hdrs['www-authenticate'])     if not ht.realm or not ht.nonce then       return nil, 'missing realm/nonce from response'     end     if ht.qop ~= 'auth' then       return nil, 'unsupported qop ' .. tostring(ht.qop)     end     if ht.algorithm and ht.algorithm:lower() ~= 'md5' then       return nil, 'unsupported algo ' .. tostring(ht.algorithm)     end     local nc = '00000001'     local cnonce = string.format('%08x', os.time())     local uri = skturl.build({ path = url.path, query = url.query })     local method = req.method or 'GET'     local response = hash(       hash(user, ht.realm, password),       ht.nonce,       nc,       cnonce,       'auth',       hash(method, uri)     )     req.headers = req.headers or {}     local auth = {       { 'username', user },       { 'realm', ht.realm },       { 'nonce', ht.nonce },       { 'uri', uri },       { 'cnonce', cnonce },       { 'nc', nc, unquote = true },       { 'qop', 'auth' },       { 'algorithm', 'MD5' },       { 'response', response },     }     if ht.opaque then       table.insert(auth, { 'opaque', ht.opaque })     end     req.headers.authorization = make_digest_header(auth)     if not req.headers.cookie and hdrs['set-cookie'] then       -- not really correct but enough for httpbin       local cookie = (hdrs['set-cookie'] .. ';'):match('(.-=.-)[;,]')       if cookie then         req.headers.cookie = '$Version: 0; ' .. cookie .. ';'       end     end     if req.source then       req.source = source     end     body, code, hdrs = skthttp.request(req)   end   return body, code, hdrs end local request = function(url)   local t = type(url)   if t == 'table' then     return _request(table.clone(url))   elseif t == 'string' then     local req = {}     local _, code, headers = _request({ url = url, sink = ltn12.sink.table(req) })     return table.concat(req), code, headers   end end url = 'http://admin:123456789@dnspruebacamara.myqnapcloud.com:5858/cgi-bin/snapshot.cgi?1&ts=123/snapshot.jpeg' image, err, hdrs = request(url)
Reply
#19
Log what output the server produces. Add this to the end of the script:
Code:
1
log(image, err, hdrs)
Reply
#20
In my case I have a file with a silly header:

<?xml version="1.0" encoding="UTF-8" ?>
<userCheck>
<statusValue>401</statusValue>
<statusString>Unauthorized</statusString>
</userCheck>

so I need to add:
a1, a2 = string.find(image,"</userCheck>\n")
image = string.sub(image, a2+1)

to remove them.

Thanks.
Reply


Forum Jump: