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:
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:
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:
-- 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:
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:
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:
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:
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:
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:
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: