Во-первых, я не NAS-профессионал и не Unix-профессионал. Во-вторых, я прочитал другой вопрос о загрузчике RSS, но rsstail - это C-источник, а tvrss - это GUI-программа. Я также проверил NetVibes, но я не могу отсортировать по названию.

Я купил Zyxel NSA310 и подумал, что было бы неплохо иметь на нем программу чтения / загрузки RSS. На нем есть транслятор, но он не хранит RSS-элементы, и мне не нужна эта дополнительная логика, когда загрузка инициируется на основе RSS-элементов.

Следует загружать RSS-каналы и хранить содержимое в читаемых файлах. Когда я возвращаюсь домой из поездки, я хочу видеть все RSS-элементы этих каналов, а не только последние 30 или что-то в этом роде. Поскольку я использую PuTTY для подключения к своему NAS, я не могу использовать какую-либо GUI-программу. Что касается вывода, я не знаю, что искать, хотя простого текста было бы достаточно. Для меня имеет смысл отсортировать RSS-элементы по названию и дате.

Чтобы вы знали, что находится на 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

У меня нет cc/gcc или make . Я не могу найти установщик пакета ни.

Google нашел что-то для меня, написанное на Python с использованием feedreader , но для этого требуется distutils , которого у меня нет, и, похоже, я не могу его установить.

Единственное решение, о котором я могу подумать сейчас, - это использовать wget в связи с crontab . Тем не менее, я должен был бы сделать весь анализ и все в shell-скрипте (так как я не знаю Python или Perl). Это кажется неудобным.

Что я могу сделать / попробовать? Любая помощь приветствуется.

1 ответ1

1

Вот что, кажется, работает для меня. Я какое-то время работал с crontab , и он работает для меня. Он поддерживает RSS и Atom, я думаю. Однако, если вы намереваетесь использовать его, считайте его отправной точкой. Если вы адаптируете его и изменения полезны, не стесняйтесь возвращаться и рассказывать сообществу.

В результате получается структура каталогов с именем канала, являющимся именем каталога и различными записями, записанными в виде файлов. Эти файлы содержат неизмененное содержимое и внизу ссылку на источник. Имена файлов состоят из названия элемента и его метки времени, дата файла устанавливается на эту метку времени. Таким образом, вы можете легко отсортировать их по имени или времени.

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

Файл rss-parser.cfg состоит из таких строк, как

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

Без параметров он анализирует rss-parser.cfg . В противном случае параметры

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

Надеюсь это кому-нибудь пригодится ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .