Linuxまたは日曜大工のRSSフィードアグリゲーターの下で小さな自転車を構築する

「GoogleはRSSを破壊し続けていますという記事に触発されました



しばらく前、私はいくつかのRSSフィードを読む必要がありました。 私にとっての質問は比較的新しく、たまにrssに対処しなければならなかったので、このトピックを勉強し、最初から読者を選ぶようになりました。



結果は...言わせてください-励ましません。



Webインターフェースを備えたクラウドサービスの場合、私は偏執病で半分の慢性アレルギーを患っており、その後のGoogle読者の葬儀では、偏執症が悪いことを助言しないことを再び確認しました。 また、Webサービスの使い慣れたインターフェイスを定期的に変更することも推奨されません。



ローカルに置かれた読者の中には、私が使用しようとしたいくつかの作品がありましたが、そのうちのどれも労働者として選ばれませんでした。 カスタマイズしにくいインターフェイス、フィルタリングツールの質の低さ、奇妙な保存ロジックなど、面倒なことはほとんどありません。 さらにグローバルな問題は、見たいフィードの1つが本のフィリバスタンのレビューでした。フィード全体を1日で簡単に更新でき、結果として一部の投稿がスキップされます。 常にリーダーを実行し続けることは、まったく刺激的ではありません。 また、車内の異なる読者からの動物園は、まったく飼育されたくありませんでした。



そして、しばらくの間、この世界の不完全さについて考え、ウィッシュリストを作成した後、ファイルを習慣的に手に入れ、自転車の構築に数日間を費やしました。







結果は、1年以上にわたって正常に機能しています。 おそらく、既製のレシピは誰かの時間と労力を節約しますが、もちろん、このレシピはすべての人に適しているわけではないかもしれません。



したがって、サーバー自体に加えて、マッチとドングリの独自のアグリゲーターを構築するには、追加のパッケージが必要でした:

rsstool

ssmtp

fdupes

...また、perlをいじくり回すための時間と意欲もあります。



その結果、かなり原始的なスクリプトが作成されましたが、これはあまり意味をなさないため、作業の一般的なロジックで十分です。



開始後、スクリプトは次の形式のテキスト構成からテープのリストを読み取ります。

habrahabr#http://habrahabr.ru/rss-つまり、後でテープを操作するために使用されるヘッダー、セパレーター「#」、およびテープ自体のアドレス。 このすべてに加えて、中間データを保存するためのヘッダー生成ファイル名は、いくつかの配列に保存されます。 次に、これらの配列foreach()を実行し、次のアクションが実行されます。



1. rsstoolを介して、スクリプトはテープ自体を区切り文字@を含むcsvの形式でダウンロードし、iconvはダウンロードしたファイルをkoi-8エンコードに変換し、grepはヘッダーを切り取ります。



rsstool --wget --csv=@ @url[$i](  http://habrahabr.ru/rss) | iconv -c -f UTF-8 -t KOI8-R| grep SITE\@DATE\@URL\@TITLE\@DESC -v >/path_to_rss2email/feed_new_@rssname[$i].rss (  /path_to_rss2email/feed_new_habrahabr.rss)
      
      







2テープアーカイブのファイルと、新しくダウンロードしたファイルの差分を設定します。 「>」でマークされたそれらの違いは、最後のダウンロード以降に表示される必要なニュースです。 この違いは別のファイルとテープアーカイブに記録されるため、次回のダウンロード時にこれらのメッセージは既に受信済みとしてマークされます。



 diff -iaEbwB --strip-trailing-cr $path_temp/@rssarcfile[$i] (.. /path_to_rss2email/habrahabr.rss) $path_temp/feed_new_@rssname[$i].rss (.. /path_to_rss2email/feed_new_habrahabr.rss) | grep ^\\>\\ >$path_temp/@rssdiffer[$i] (.. /path_to_rss2email/habrahabr.diff)
      
      







3.これで喜ぶことができます-テープから最新のメッセージを含むhabrahabr.diffファイルを取得しました。このファイルを使用して、すべてを実行できます。 ファイルを1行ずつ読み取り、フォームの行を解析します。



"Habrahabr / Hooked / Thematic / Posts" @ "1399799340" @ " habrahabr.ru/post/222391 " @ "GoogleはRSSを破壊し続けています" @ "今週、5月8日、GoogleはRSSフィードを無効にしました<...カット...>。 続きを読む→ "



... RFC2822形式に従って、別のディレクトリにファイルを作成します。 その後、スクリプトは作業を続行し、リスト内の次のテープを処理するか、約10分間スリープ状態になります。 一方、生成された文字は、cronによって起動される2番目のスクリプトによって処理されます。 彼はfdupesを使用して、RFC2822ファイルが含まれるディレクトリ内の同じファイルを1つを除いて削除します...(はい、私は知っています。これは松葉杖です。はい、それは残念です。しかし問題は、すべてにもかかわらず、ああ、それはスクリプトを書くより少し遅れて現れましたが、それを理解する時間はありませんでした。)...そして、ssmtpを使用して、特別に配線されたメールボックスに送信します。



そして今、メールでテープを受け取ったので、デザイナーの次の発作やマネージャーの運命的な決定に悩まされることなく、同じ使い慣れた愛用のメールクライアント(たとえば同じTheBat!)でどこでもそれを読むことができます。フィルターの読み取り、並べ替え、検索、およびテープの読み取りをより便利で効率的にするその他のユーティリティの形式のこのすべての豊富なツール。



UPD:少し調べてコメントした後、スクリプト自体を広めました。 最初のものはフィードの実際のダウンロードを行い、メールに送信するための投稿を含むファイルを作成し、2番目のものはそれらを送信します。 両方ともcronで実行されます。 さて、例のための設定の一部。



rsstoemail.pl
 #! /usr/bin/perl use MIME::Base64; $path_temp="/home/media/rsstool"; #    / #          -  , url ,     open(config,"</etc/rss/rsstoemail.conf"); $numb=0; while (!eof(config)) { $strcnf=<config>; $strcnf=~tr/\n//d; (@rss[$numb],@rssname[$numb],@rssfeeds[$numb])=split "#", $strcnf; @rssarcfile[$numb]="@rssname[$numb].rss"; @rssdiffer[$numb]="@rssname[$numb].diff"; $numb=$numb+1; } close config; #          -  , url ,     #       -   foreach $srtname1(@rssarcfile) { if (! -e "$path_temp/$srtname1") { `echo >$path_temp/$srtname1`; } } #       -   #         -  $run=`ps -AH|grep -c rsstoemail.pl`; $run=~tr/\n//d; if ($run ne "1") { exit; } #         -  #    foreach $i(@rss) { #      -  if (@rss[$i] ne "") { $chkdiff=""; #  -    `echo >$path_temp/@rssdiffer[$i]`; printf "run rsstool\n"; #  ,    koi-8,        `/sbin/myscript/rsstool --wget --csv=@ @rssfeeds[$i] | iconv -c -f UTF-8 -t KOI8-R| grep SITE\@DATE\@URL\@TITLE\@DESC -v >$path_temp/feed_new_@rssname[$i].rss`; #      ,     `diff -iaEbwB --strip-trailing-cr $path_temp/@rssarcfile[$i] $path_temp/feed_new_@rssname[$i].rss | grep ^\\>\\ >$path_temp/@rssdiffer[$i]`; #       $chkdiff=`grep \@ $path_temp/@rssdiffer[$i] -c`; $chkdiff=~tr/\n//d; #    -  if ($chkdiff ne "0") { my @toemail = (); my @original = (); #  ,  ,    >   diff #           open(diffopen,"<$path_temp/@rssdiffer[$i]"); while (!eof(diffopen)) { $string = <diffopen>; $string=~s/^(\>\ )//; $string=~tr/\n//d; push (@toemail, $string); push (@original, $string); } close diffopen; #  ,  ,    >   diff #           #    #                 -   $dirr=`date '+%Y-%m-%d-%H_%M_%S'`; $newm=$#toemail+1; printf "$dirr new messages $newm\n"; #                 -   #       foreach $difs(@toemail) { #      #   " $difs=~tr/\"//d; #    $difs=~s/\ $//; $nmf=""; $date=""; $url=""; $bookname=""; $body=""; $resser=""; $ssurl=""; $sndusr=""; #     ($nmf,$date,$url,$bookname,$body)=split '@', $difs; #   ,    #                 if (@rssname[$i] eq "flibusta" or @rssname[$i] eq "librusec") { $body=~m/(.+?)(\ \ )/; $sndusr=$1; $sndusr=~tr/\n//d; } #                 #        url    (    #   proxy.flibusta.net, flibusta.net, www.flibusta.net )    url   if (@rssname[$i] eq "flibusta" or @rssname[$i] eq "flibustanewbooks") { ($resser,$ssurl)=split "\/b\/",$url; $resser=~m/(flibusta.net)/; if ($1 eq "flibusta.net") { $surl="http://flibusta.net/b/$ssurl/download\n"; } else { $surl=$url; } } else { $surl=$url; } #        url    (    #   proxy.flibusta.net, flibusta.net, www.flibusta.net )    url   #            -  -  if (@rssname[$i] eq "flibustanewbooks") { ($book_auth,$book_name,$book_genre)=split "- ",$bookname; $bookname="$book_name - $book_auth - $book_genre"; } #            -  -  #   ,    #     base64        SUBJ: $booknameenc=encode_base64("$bookname my_@rssname[$i]_rss"); $booknameenc=~tr/\n//d; $booknameenc="\=\?KOI8\-R\?B\?$booknameenc\?\="; #     base64        SUBJ: #          sleep 1; $dirr=`date '+%Y-%m-%d-%H_%M_%S'`; #          #             msgrss_2014-05-20-19_26_09       open(fopen,">>$path_temp/mail/msgrss_$dirr"); print fopen "From\:\ fromemail\@domen\.ru\n"; print fopen "To\:\ toemail\@gmail\.com\n"; print fopen "Subject\: $booknameenc\n"; print fopen "MIME-Version: 1.0\n"; print fopen "Content-Type: multipart/mixed;\n"; print fopen " boundary=\"----------12012917B16D15D68\"\n"; print fopen "------------12012917B16D15D68\n"; print fopen "Content-Type: text/plain; charset=koi8-r\n"; print fopen "Content-Transfer-Encoding: 8bit\n"; print fopen "\n"; print fopen "$nmf\n"; print fopen "$surl\n"; print fopen "$bookname\n"; print fopen "\n"; if ($sndusr ne "") { print fopen "sendbyuser:$sndusr\n"; } print fopen "\n"; print fopen "$body\n"; print fopen "\n"; close fopen; #             msgrss_2014-05-20-09_26_09       } #        #            -    `cp $path_temp/@rssdiffer[$i] $path_temp/arhiv/diffnew\_$dirr`; #         -    `echo >>$path_temp/@rssarcfile[$i]`; #         open(arcrss,">>$path_temp/@rssarcfile[$i]"); foreach $difffs(@original) { $difffs=~s/^(\>\ )//; $difffs=~tr/\n//d; print arcrss "$difffs\n"; } close(arcrss); #         } } } printf "start send messages\n"; #         if ($hour eq "04" and $min<"30") { foreach $srtname(@rssarcfile) { `uniq -u $path_temp/$srtname >$path_temp/$srtname.tmp`; `mv -f $path_temp/$srtname.tmp $path_temp/$srtname`; } sleep 1000; } #        
      
      









rsssendemail.pl
 #! /usr/bin/perl #     $path_all="/home/media/rsstool"; #  $path_mail="$path_all/mail"; $path_mail_arhiv="$path_all/mail_arhiv"; $path_arhiv="$path_all/arhiv"; #      _send   @list_dupes=`/sbin/myscript/fdupes -f $path_mail|grep -v send|grep -v \^\$`; #       foreach $fl(@list_dupes) { $fl=~tr/\n//d; `rm -f $fl`; printf "rm dupe $fl\n"; } #       #      _send   @list_files=`ls $path_mail/ |grep -v send`; sleep 5; #       ssmtp      *_send foreach $i(@list_files) { $i=~tr/\n//d; printf "sended $path_mail/$i\n"; `/sbin/myscript/ssmtp toemail\@gmail.com \<$path_mail/$i`; `mv $path_mail/$i $path_mail/$i\_send`; sleep 1; } #       ssmtp      *_send #         @all_files=`ls $path_mail/`; $cont=$#all_files-1000; if ($cont > 0) { printf "bigger 1000 to $cont\n"; for ($y=0; $y<$cont;$y++) { @all_files[$y]=~tr/\n//d; `mv $path_mail/@all_files[$y] $path_mail_arhiv`; printf "@all_files[$y]\n"; } } #        
      
      









rsstoemail.conf
 1#librusec#http://lib.rus.ec/polka/show/all/rss 2#flibusta#http://flibusta.net/polka/show/all/rss 3#nnm#http://nnm.me/rss/ 4#habrahabr#http://habrahabr.ru/rss 5#3dnewssoft#http://www.3dnews.ru/software-news/rss/ 6#3dnewshard#http://www.3dnews.ru/news/rss/ 7#flibustanewbooks#http://flibusta.net/new/rss
      
      












All Articles