RSS Reader / Downloader auf einem NAS

0

Erstens bin ich kein NAS-Pro und kein Unix-Pro. Zweitens lese ich die andere Frage zum RSS-Downloader , ist aber rsstaileine C-Quelle und tvrssein GUI-Programm. Ich habe auch NetVibes ausgecheckt , kann aber nicht nach Titel sortieren.

Ich habe einen Zyxel NSA310 gekauft und dachte, es wäre eine gute Idee, einen RSS-Reader / Downloader zu haben. Es gibt einen Broadcatcher, aber er speichert die RSS-Elemente nicht und ich benötige diese zusätzliche Logik nicht, bei der Downloads basierend auf den RSS-Elementen initiiert werden.

Es sollte die RSS-Feeds herunterladen und die Inhalte in lesbaren Dateien speichern. Wenn ich von einer Reise nach Hause komme, möchte ich alle RSS-Elemente dieser Feeds sehen und nicht nur die letzten 30 oder so. Da ich mit PuTTY eine Verbindung zu meinem NAS herstelle, kann ich kein GUI-Programm verwenden. Was die Ausgabe betrifft, weiß ich nicht, wonach ich suchen soll, aber einfacher Text wäre genug. Für mich ist es sinnvoll, die RSS-Einträge nach Titel und Datum zu sortieren.

Damit Sie wissen, was sich auf dem NAS befindet:

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

Ich habe kein cc/gccoder make. Ich kann auch kein Paketinstallationsprogramm finden.

Google hat Dinge gefunden, die für mich in Python codiert sind feedreader, aber die erfordern distutils, die ich nicht habe und die ich anscheinend nicht installieren kann.

Die einzige Lösung, die mir derzeit einfällt, ist die Verwendung wgetin Verbindung mit crontab. Allerdings müsste ich das ganze Parsen und alles in Shell-Skript machen (da ich Python oder Perl nicht kenne). Das scheint unpraktisch.

Was kann ich tun / versuchen? Jede Hilfe wird geschätzt.

sjngm
quelle
als update: ich schreibe einen RSS-reader mit awk ... wünsche mir
glück

Antworten:

1

Folgendes scheint für mich zu funktionieren. Ich hatte dieses Rennen crontabfür eine Weile und es funktioniert für mich. Es unterstützt RSS und Atom, denke ich. Wenn Sie es jedoch verwenden möchten, sollten Sie es als Ausgangspunkt betrachten. Wenn Sie es anpassen und die Änderung nützlich ist, können Sie jederzeit zur Community zurückkehren.

Das Ergebnis ist eine Verzeichnisstruktur, bei der der Feedname der Verzeichnisname und die verschiedenen Einträge als Dateien geschrieben sind. Diese Dateien enthalten den unveränderten Inhalt und unten einen Link zur Quelle. Die Dateinamen bestehen aus dem Elementtitel und dem Zeitstempel. Das Datum der Datei wird auf diesen Zeitstempel gesetzt. Auf diese Weise können Sie sie einfach nach Name oder Zeit sortieren.

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"
    }
}

Die Datei rss-parser.cfgbesteht aus Zeilen wie

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

Ohne Parameter wird analysiert rss-parser.cfg. Ansonsten sind Parameter

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

Ich hoffe, es ist für jeden nützlich ...

sjngm
quelle