Ferramenta de linha de comando para verificar quando um URL foi atualizado?

1

Certamente seria possível juntar algo em Python para consultar uma URL para ver quando ela foi modificada pela última vez, usando os cabeçalhos HTTP, mas imaginei se há uma ferramenta existente que possa fazer isso para mim? Eu imagino algo como:

% checkurl http://unix.stackexchange.com/questions/247445/
Fri Dec  4 16:59:28 EST 2015

ou talvez:

% checkurl "+%Y%m%d" http://unix.stackexchange.com/questions/247445/
20151204

como um sino e / ou apito. Eu não acho que wget ou curl tem o que eu preciso, mas eu não ficaria surpreso em ser provado errado. Existe algo assim lá fora?

    
por Scott Deerwester 04.12.2015 / 23:02

3 respostas

2

Isso parece se ajustar aos seus requisitos (atualizado para usar '\ r \ n' como separador de registro para dados de resposta):

#!/bin/sh

get_url_date()
{
    curl --silent --head "${1:?URL ARG REQUIRED}" | 
    awk -v RS='\r\n' '
        /Last-Modified:/ {
            gsub("^[^ ]*: *", "")
            print
            exit
        }
    '
}

unset date_format
case $1 in
    (+*)
        date_format="$1"
        shift
        ;;
esac

url_date="$(get_url_date "${1:?URL ARG REQUIRED}")"

if [ -z "$url_date" ]
then
    exit 1
fi

if [ "$date_format" != "" ]
then
    date "$date_format" -d"$url_date"
else
    echo "$url_date"
fi
    
por 05.12.2015 / 00:26
1

Acontece que curl e wget podem fazer isso, mas provavelmente vale a pena fazer no Python, afinal. Aqui está o que acabei escrevendo:

#!/usr/bin/env python3

import sys, dateutil.parser, subprocess, requests
from getopt import getopt

errflag = 0
gTouch = None
gUsage = """Usage: lastmod [-t file] url
where:
-t file     Touches the given file to make its modification date
            the same as the URL modification date.
url         A URL to be retrieved
"""

opts, args = getopt(sys.argv[1:], "t:v?")

for k, v in opts:
    if k == "-t":           # File to touch
        gTouch = v
    elif k == "-?":         # Write out usage and exit
        errflag += 1

if len(args) != 1:
    errflag += 1

if errflag:
    sys.stderr.write(USAGE)
    sys.exit(1)

res = requests.head(args[0])

if res.status_code != 200:
    sys.stderr.write("Failed to retrieve URL\n")
    sys.exit(1)

if not 'Last-Modified' in res.headers:
    sys.stderr.write("Headers has no last-modified date\n")
    sys.exit(1)

dt = dateutil.parser.parse(res.headers['Last-Modified'])

if gTouch:
    subprocess.call(["touch", "-t", dt.strftime("%Y%m%d%H%m"), gTouch])
else:
    sys.stdout.write("%s\n" % dt.ctime())
    
por 05.12.2015 / 00:12
1

Um one-liner Perl:

% perl -MLWP::Simple -MDate::Format -e 'print time2str "%C\n", (head $ARGV[0])[2]' http://example.com
Sat Aug 10 02:54:35 EEST 2013

Em um sistema Linux ou FreeBSD moderno, os módulos necessários provavelmente já estarão instalados.

    
por 05.12.2015 / 19:23