Scripts en Lua con luacurl para descarga de archivos

Programar en Lua es sencillo. El problema es cuando precisas tirar de alguna librería como libcurl (luacurl) y resulta que existen varias y cada una desperdigada en repositorios desactualizados.
Al final tras un rato probando diferentes versiones de luacurl he dado con la que me va guay y he pensado que es bueno dejar esto documentado por si alguien quiere hacerse un programa que use luacurl.
 
Instalar dependencias:
 

# apt-get install lua5.1
# apt-get install luarocks
# apt-get install curl libcurl4-openssl-dev

 
Miramos la ruta en la que estará curl.h así:
 

# dpkg -L libcurl4-openssl-dev  | grep curl\\.h$

 
Luego procedemos a crear unos directorios y mover unos archivos para que luarocks pille bien lo necesario:
 

# mkdir /usr/include/x86_64-linux-gnu/curl/include/
# mkdir /usr/include/x86_64-linux-gnu/curl/include/curl
# cp -pRv /usr/include/x86_64-linux-gnu/curl/* /usr/include/x86_64-linux-gnu/curl/include/curl/

 
E instalamos luacurl mediante luarocks:
 

# luarocks install luacurl CURL_DIR=/usr/include/x86_64-linux-gnu/curl/

 
Aquí la url de luacurl: https://luarocks.org/modules/luarocks/luacurl
 
Creamos un archivo llamado por ejemplo main.lua con este contenido:
 

require("luacurl")

 
Lo guardamos y ejecutamos con lua así:
 

lua main.lua

 
No tendría que escupir nada. Eso es que todo va bien.
 
Un ejemplo de obtener una página web en la consola:
 

require("luacurl")
c = curl.new()
c:setopt(curl.OPT_URL, "https://mierda.tv/readme.html")
c:perform()
c:close()

 
Eso escupirá por pantalla el contenido de readme.html.
 
Si deseamos guardarlo en un archivo:
 

require("luacurl")

archivo = "readme.html"
f = assert(io.open(archivo, "w"))

c = curl.new()
c:setopt(curl.OPT_URL, "https://mierda.tv/readme.html")
c:setopt(curl.OPT_HTTPGET, true)
c:setopt(curl.OPT_ENCODING, "utf8")
c:setopt(curl.OPT_WRITEFUNCTION, function(userparam, buffer) f:write(buffer) end)
c:perform()
c:close()

io.close(f)

 
Más añadidos como por ejemplo el user-agent:
 

require("luacurl")

headers = {
        "Accept: text/*",
        "Accept-Language: en",
        "Accept-Charset: iso-8859-1,*,utf-8",
        "Cache-Control: no-cache"
}

archivo = "Kung_fury-2015-Spanish-Fanta.mkv"
f = assert(io.open(archivo, "w"))

c = curl.new()
c:setopt(curl.OPT_URL, "http://lavapies.linuxinthenight.com/peliculas/Kung_fury-2015-Spanish-Fanta.mkv")
c:setopt(curl.OPT_HTTPGET, true)
c:setopt(curl.OPT_ENCODING, "utf8")
c:setopt(curl.OPT_BUFFERSIZE, 16000)-- 16K
c:setopt(curl.OPT_WRITEFUNCTION, function(userparam, buffer) f:write(buffer) end)
c:setopt(curl.OPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0")
c:setopt(curl.OPT_HTTPHEADER, 'headers')
c:setopt(curl.OPT_SSL_VERIFYHOST, 0)
c:perform()
c:close()

io.close(f)

 
Finalmente si realmente queremos bajar un archivo grande. Este código:
 

require("luacurl")

headers = {
	"Accept: text/*",
	"Accept-Language: en",
	"Accept-Charset: iso-8859-1,*,utf-8",
	"Cache-Control: no-cache"
}

archivo = "Kung_fury-2015-Spanish-Fanta.mkv"
f = assert(io.open(archivo, "w"))

c = curl.new()
c:setopt(curl.OPT_URL, "http://lavapies.linuxinthenight.com/peliculas/Kung_fury-2015-Spanish-Fanta.mkv")
c:setopt(curl.OPT_HTTPGET, true)
c:setopt(curl.OPT_ENCODING, "utf8")
c:setopt(curl.OPT_BUFFERSIZE, 16000)-- 16K
local t = {}
c:setopt(curl.OPT_WRITEFUNCTION, function (param, buf)
	table.insert(t, buf)
	return #buf
end)

c:setopt(curl.OPT_PROGRESSFUNCTION, function(param, dltotal, dlnow)
	print(dltotal, dlnow)
end)

c:setopt(curl.OPT_NOPROGRESS, false)
c:setopt(curl.OPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0")
c:setopt(curl.OPT_HTTPHEADER, 'headers')
c:setopt(curl.OPT_SSL_VERIFYHOST, 0)

assert(c:perform())
f:write(table.concat(t))
c:close()
io.close(f)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *