kpcyrd/deviantart
function grab_post(url)
debug('fetching ' .. url)
local post_date = nil
local req = http_request(session, 'GET', url, {})
local r = http_fetch(req)
if last_err() then return end
local spans = html_select_list(r['text'], '[data-hook="deviation_meta"] span')
for i=1, #spans do
local m = regex_find('Published: (.+)', spans[i]['text'])
if m then
post_date = strptime('%B %d, %Y %H:%M:%S', m[2] .. ' 00:00:00')
if last_err() then return end
end
end
local download = html_select(r['text'], 'a[aria-label="Download"]')
if last_err() then return end
download = download['attrs']['href']
req = http_request(session, 'GET', download, {})
r = http_send(req)
if last_err() then return end
if r['status'] ~= 302 then
return
end
download = r['headers']['location']
req = http_request(session, 'GET', download, {
into_blob=true,
})
r = http_fetch(req)
if last_err() then return end
db_add('image', {
value=r['blob'],
})
return post_date
end
function cmp_last_seen(a, b)
if a == nil and b == nil then
return nil
end
if a ~= nil and b == nil then
return a
end
if a == nil and b ~= nil then
return b
end
if a > b then
return a
else
return b
end
end
function run(arg)
local update = {}
local url = 'https://www.deviantart.com/' .. arg['username']
update['url'] = url
session = http_mksession()
local req = http_request(session, 'GET', url .. '/about', {})
local r = http_fetch(req)
if last_err() then return end
local comments = html_select_list(r['text'], '#my_comments time')
if #comments > 1 then
local last_activity = comments[1]['attrs']['datetime']
update['last_seen'] = strptime('%Y-%m-%dT%H:%M:%S.000Z', last_activity)
if last_err() then return end
end
req = http_request(session, 'GET', url .. '/gallery/all', {})
r = http_fetch(req)
if last_err() then return end
local posts = html_select_list(r['text'], '[id="-1"] a[data-hook="deviation_link"]')
for i=1, #posts do
local post_date = grab_post(posts[i]['attrs']['href'])
local err = last_err()
if err then
warn(err)
clear_err()
else
update['last_seen'] = cmp_last_seen(update['last_seen'], post_date)
end
end
if update['last_seen'] ~= nil then
update['last_seen'] = strftime('%Y-%m-%dT%H:%M:%S', update['last_seen'])
end
info(update)
end