Lecteur / téléchargeur RSS sur un NAS

0

Premièrement, je ne suis ni NAS-pro ni Unix-pro. Deuxièmement, j'ai lu l'autre question sur le téléchargeur RSS , mais rsstail est une source C et tvrss est un programme graphique. J'ai aussi vérifié NetVibes , mais je ne peux pas trier par titre.

J'ai acheté un Zyxel NSA310 et j'ai pensé que ce serait une bonne idée d'avoir un lecteur / téléchargeur RSS dessus. Il y a un broadcatcher dessus, mais il ne stocke pas les éléments RSS et je n'ai pas besoin de cette logique supplémentaire où les téléchargements sont lancés en fonction des éléments RSS.

Il convient de télécharger les flux RSS et de stocker le contenu dans des fichiers lisibles. Quand je rentre chez moi après un voyage, je veux voir tous les articles RSS de ces flux et pas seulement les 30 derniers. Comme j'utilise PuTTY pour me connecter à mon NAS, je ne peux utiliser aucun programme graphique. En ce qui concerne la sortie, je ne sais pas quoi chercher, un texte simple suffirait cependant. Pour moi, il est judicieux de trier les éléments RSS par titre et par date.

Pour vous faire savoir ce qu'il y a sur le NAS:

root@NAS:~# uname -a
Linux NAS 2.6.31.8 #4 Fri Jul 20 18:10:42 CST 2012 armv5tel GNU/Linux
root@NAS:~# busybox
BusyBox v1.17.2 (2012-07-20 17:55:00 CST) multi-call binary.
Copyright (C) 1998-2009 Erik Andersen, Rob Landley, Denys Vlasenko
and others. Licensed under GPLv2.
See source distribution for full notice.

Usage: busybox [function] [arguments]...
   or: function [arguments]...

        BusyBox is a multi-call binary that combines many common Unix
        utilities into a single executable.  Most people will create a
        link to busybox for each function they wish to use and BusyBox
        will act like whatever it was invoked as.

Currently defined functions:
        [, [[, acpid, addgroup, adduser, adjtimex, arp, ash, awk, basename,
        beep, bzip2, cat, catv, chat, chgrp, chmod, chown, chroot, chrt, chvt,
        cksum, clear, cmp, cp, crond, crontab, cryptpw, cttyhack, cut, date,
        dd, deallocvt, delgroup, deluser, depmod, devmem, df, diff, dirname,
        dmesg, dnsdomainname, du, echo, ed, egrep, eject, env, expand, expr,
        false, fgrep, flock, free, freeramdisk, fsck, fsync, getopt, getty,
        grep, gunzip, gzip, halt, head, hexdump, hostname, hwclock, id,
        ifconfig, init, insmod, install, ionice, ip, ipaddr, ipcrm, ipcs,
        iplink, iproute, iprule, kill, killall, less, linuxrc, ln, logger,
        login, losetup, ls, lsmod, lspci, lsusb, lzop, lzopcat, man, microcom,
        mkdir, mke2fs, mkfs.ext2, mknod, mkpasswd, mkswap, mktemp, modinfo,
        modprobe, more, mountpoint, mv, netstat, nslookup, openvt, passwd,
        pidof, ping, ping6, pivot_root, poweroff, printenv, printf, ps, pwd,
        raidautorun, rdev, readahead, readlink, reboot, reset, resize, rev, rm,
        rmdir, rmmod, route, rtcwake, script, scriptreplay, sed, seq, setfont,
        setlogcons, setsid, sh, sha256sum, sha512sum, showkey, sleep, sort,
        split, start-stop-daemon, strings, su, swapoff, swapon, sync, tac,
        tail, tar, tee, telnet, telnetd, test, time, timeout, top, touch, tr,
        traceroute, traceroute6, true, tty, ttysize, ubiattach, ubidetach,
        udhcpc, udpsvd, uname, unexpand, uniq, unlzop, unxz, unzip, uptime,
        usleep, vi, volname, wall, wc, which, who, whoami, xargs, xz, xzcat,
        yes, zcat, zcip

je n'ai pas cc/gcc ou make. Je ne trouve pas non plus d'installation de paquet.

Google a trouvé des trucs pour moi codés en Python avec feedreader, mais ceux qui exigent distutils, que je n'ai pas et que je ne semble pas être capable de l'installer.

La seule solution à laquelle je puisse penser maintenant consiste à utiliser wget en connexion avec crontab. Cependant, je devrais faire toute l'analyse et tout en shell-script (puisque je ne connais pas Python ou Perl). Cela semble gênant.

Que puis-je faire / essayer? Toute aide est appréciée.

sjngm
la source
comme une mise à jour: j'écris un lecteur RSS avec awk ... Souhaitez-moi bonne chance;)
sjngm

Réponses:

1

Voici ce qui semble fonctionner pour moi. Je courais avec crontab pendant un moment et cela fonctionne pour moi. Il supporte RSS et Atom je pense. Toutefois, si vous avez l’intention de l’utiliser, considérez-le comme un point de départ. Si vous l'adaptez et que le changement est utile, n'hésitez pas à revenir et à le dire à la communauté.

Le résultat est une structure de répertoires dont le nom de fil est le nom du répertoire et les différentes entrées écrites sous forme de fichiers. Ces fichiers contiennent le contenu inchangé et au bas un lien vers la source. Les noms de fichiers se composent du titre de l'élément et de son horodatage, la date du fichier est définie sur cet horodatage. De cette façon, vous pouvez facilement les trier par nom ou par heure.

rss-parser.awk:

function removeFirstTag(str) {
    sub("[^>]*>", "", str)
    return str
}
function extractCdata(str) {
    gsub(".*<!\\[CDATA\\[|]]>.*", "", str)
    return str
}
function cleanup(str) {
    return extractCdata(removeFirstTag(str))
}

BEGIN {
    written = 0
    existed = 0
    if (feedTitle) {
        system("mkdir -p '" outDir "/" feedTitle "'")
    }
}

/<\/description>|<\/content>/ {
    indescr = 0
}
/<\/summary>/ {
    insummary = 0
}
/<\/item>|<\/entry>/ {
    gsub(/\//, "-", title)
    fname = outDir "/" feedTitle "/" title " - " dateSec
    fnameEnc = fname
    gsub(/\$/, "\\$", fnameEnc)
    gsub(/"/, "\\\"", fnameEnc)
    if (!description) {
        description = summary
    }
    if (link != "") {
        description = description "\nLink: " link
    } else if (guid != "") {
        description = description "\nLink: " guid
    }

    write = system(binPath "/stat \"" fnameEnc "\" -c \"%u\" 1> /dev/null 2>&1")
    if (write == 1) {
        print description > fname
        system(binPath "/touch \"" fnameEnc "\" -d \"" date "\"")
        written = written + 1
    } else {
        existed = existed + 1
    }
}

{
    if (indescr == 1) {
        description = description "\n" $0
    }
}

/<title[ >]/ {
    if (!feedTitle) {
        feedTitle = cleanup($0)
        system("mkdir -p '" outDir "/" feedTitle "'")
    } else {
        title = cleanup($0)
    }
}
/<item[ >]|<entry[ >]/ {
    title = ""
    description = ""
    summary = ""
    date = ""
    link = ""
    guid = ""
}
/<description[ >]|<content[ >]/ {
    indescr = 1
    description = cleanup($0)
}
/<summary[ >]/ {
    insummary = 1
    summary = cleanup($0)
}
/<link[ >]/ {
    link = cleanup($0)
    if (index(link, "magnet") == 1) {
        link = ""
    }
}
/<guid[ >]|<id[ >]/ {
    guid = cleanup($0)
}
/<pubDate[ >]|<published[ >]|<dc:date[ >]/ {
    date = cleanup($0)
    binPath "/date -d '" date "' +'%s'" | getline dateSec
}

END {
    print "Done : " feedTitle " (new: " written "/old: " existed ")"
    if (existed == 0 && written != 0) {
        print "=== NOTE === : All entries are new. You may want to check this feed more often"
    }
}

Le fichier rss-parser.cfg se compose de lignes telles que

http://thatonesite.com/feed-with-nice-title
http://thatothersite.com/feed=Specific feed title is better

rss-parser.sh:

#!/bin/sh

parse() {
    url="$1"
    name="$2"
    echo "Start: $name ($url)"
    wget -q -U "$userAgent" -O rss-news.xml $url
    sed -e 's/
//g' -e 's/<\([a-z/]\)/\n<\1/g' rss-news.xml | \
        $binPath/awk \
            -v "feedTitle=$name" \
            -v "binPath=$binPath" \
            -v "outDir=./data" \
            -f rss-parser.awk | \
        more
}

userAgent="Opera/9.80 (Windows NT 6.1; Win64; x64; U; de) Presto/2.10.289 Version/12.01"
binPath=/bin
cd `dirname $0`
if [ -z "$1" ]; then
    echo "================= `$binPath/date +"%d.%m.%Y %H:%M"`"
    start=`$binPath/date +%s`
    while read line
    do
        if [ ! -z "$line" -a "${line:0:1}" != "#" ]; then
            url=${line%%=*}
            name=${line#*=}
            if [ "$name" == "$url" ]; then
                name=""
            fi
            parse "$url" "$name"
        fi
    done < "rss-parser.cfg"
    echo "================= Took `$binPath/date -d "$start seconds ago" +%s` seconds"
else
    parse "$1" "$2"
fi

Sans paramètres, il analyse rss-parser.cfg. Sinon, les paramètres sont

./rss-parser.sh [<URL> [<feed name>]]

J'espère que c'est utile à n'importe qui ...

sjngm
la source