Pythonを使用したプロキシRSSフィード

ニュース、記事などを入手する最も便利な方法の1つ さまざまなサイトから-RSSです。 しかし、テープの数は毎年着実に増加し、フィードの数は増加しており、この経済全体を集める時間はますます少なくなっています。 明らかに-何らかの形で記事をフィルタリングする必要があります。 これが今日の予定です。





既存のソリューション



彼はたくさんのサービスとオフラインの読者を試しましたが、理想を見つけることができませんでした。 すべてのデスクトップアプリケーションには、フィルタリングに関して驚くほど乏しい機能がありました。 ダース以上の異なるプログラムを次々とインストールしましたが、簡単なタスクのインターフェイスを提供できるものは見つかりませんでした-記事全体へのリンクを使用してフィードをフィルタリングします。 正規表現を使用してこれを行いたいという事実は言うまでもありません。 そして、ニュースを編集できるという事実について-そして質問はありません。 私はオペラに組み込まれたリーダーに立ち寄った。 そこで、受信フィードをフィルタリングするための特定のルールを指定できます。 すべてがうまく機能しませんでしたが、いくつかのビルドでは、オペラは不要な記事を読んだものとしてマークし始めました。 私は喜んですべてがそこに昔修復されたと信じていますが、信頼は損なわれました。



そして、私はオンラインサービスに助けを求めました。 feedrinse.comのようなかなり平凡なタイプがいくつかありますが、実際には何もできず、さらに悪いことに、1〜2か月後には突然存在しなくなる可能性が非常に高くなります。 しかし、サービスの1つは一般的なシリーズから非常に際立っていました-ヤフーパイプ。 必要なのはそれだけで、フィードの柔軟なフィルタリング、テープのマージなどを可能にしましたが、定期的なグリッチとブレーキはサービスのすべての喜びを無効にします。 はい、ビジュアルプログラミングは、私が理解しているとおり、パイプを使って操作するのは私には向いていません。



アイデア



あなた自身の自転車の執筆に座っている以外に何もすることはありませんでした。



最初は、便利で広範に広がるフィルタリングやその他の機能を備えた独自のオフラインRSSリーダーを作成することを考えました。 プログラムの要件のリスト、ある種のTKおよびアプリケーションフレームワークも作成しました...しかし、夜にせいぜい数か月の作業が必要であり、その結果、既存のアナログよりも大幅に柔軟で便利なものになることはほとんどないことにすぐに気付きました。 そして、そのアイデアは不適切であるとして破棄されました。



次に、要件を確認し、主な要件を強調することにしました。



その結果、受信RSSフィードを解析し、すべてのフィード属性を保存するオブジェクトとして各要素を表す一種のプロキシを記述することが決定され、このオブジェクトはスクリプト言語で記述されたユーザー定義関数に転送されます。 また、この関数では、エンドユーザーは受信したオブジェクトに対して既に何でもできます。フィードプロパティでフィルタリングし、内部コンテンツを変更し、独自の何かを追加します。 つまり 制限のあるビジュアルインターフェイスはなく、純粋なプログラミングのみで、潜在的に無限の可能性があります。 プロキシの結果は、rssテープ、つまり 実際には、読者を対象とするxmlドキュメント。 いくつかの熟考の後、シンプルで表現力豊かなPythonが言語として選ばれました。



実装



まず、RSSフィードへのすべてのサブスクリプションをGoogleリーダーに転送することで、無限の履歴、メッセージやフィードにタグを付ける機能など、いくつかの統一されたインターフェイスといくつかの利点を取得することになりました。



次に-Pythonでスクリプトを実行する機能を備えたWebサーバーが必要でした。 最小の抵抗の道を歩みました-私は自分のマシンでIIS7を上げて、その上でpythonを構成しました(構成は、たとえばここに描かれています )。 もちろん、イデオロギー的にIISを受け入れない人は、Apacheなどを使用できます。



次に、フィードをフィルタリングするためのスクリプトを作成するフィードごとに、ハブの例を使用してすべてを表示するため、ファイルhabrahabr.pyを呼び出してWebサーバーのディレクトリに配置します。そこで、Googleリーダーapiのラッパーである小さなライブラリを配置する必要があります。 必要なものはすべて、例とともに、ここからダウンロードできます



そのため、habrahabr.pyスクリプトに戻ると、次のようになっているはずです。

import re import lib import const import functools def hook_channel(channel): pass def hook_entry(reg_exclude, entry): result = reg_exclude.match(entry._link) if result == None: return entry else: return None def run(): gr = lib.GReader() if not gr.login(const.EMAIL, const.PASSWORD): print "login failed" return pattern = 'http://habrahabr.ru/blogs/(%s)/.*' w = 'javascript|php|Flash_Platform' reg_exclude = re.compile(pattern % w, re.IGNORECASE) fhook_entry = functools.partial(hook_entry, reg_exclude) xml = gr.read_tag("habrahabr.ru", 300, hook_channel, fhook_entry) print "Content-Type: text/xml" print print xml if __name__=='__main__' : run()
      
      







ここではすべてが非常に簡単です。



まず、ゴーグルリーダーに接続しましょう(アプリケーションのgoogleサービスでの認証の詳細については、 こちらをご覧ください )。便宜上、承認リクエストは1つの関数にラップされ、次のように呼び出されます: gr.login(const.EMAIL、const.PASSWORD)



次に、正規表現をコンパイルします。正規表現を使用して、記事の完全版へのリンクを介して、興味のないフィードを除外します。



次に、関数gr.read_tag(「habrahabr.ru」、300、hook_channel、fhook_entry)

「habrahabr.ru」フォルダーにあるgReaderから最新の300件の記事を取得します(フォルダー名を使用する必要はありません。任意のタグを使用できます)。次に、2つのフックを渡します。



hook_channel-特に興味深いわけではありません。チャンネルのパラメーターを変更することしかできません(これまではそのタイトルのみ)



fhook_entry-フィードをフィルタリングおよび変更できます。 入力パラメーターとして、Entryクラスのインスタンス(lib.pyファイルから)が渡されます。これは実際には解析されたフィードであり、その属性はフィードの属性に対応します。 これらの属性は任意に変更でき、既に変更された値はテープに収まることに注意してください。 フックは、エントリクラスの変更されたオブジェクトを返すか、このレコードをテープから「カット」する場合はNoneを返す必要があります。



Read_tag関数-rss v 2.0形式のxml文字列を返します。 この方法で結果の文字列を印刷し、Webサーバーのメタ情報を追加します。



さて、それですべてです。新しいアドレスを購読するのはRSSリーダーのみです。127.0.0.1:8080 / python / habrahabr.pyのようになりました。



gReader APIの詳細については、 こちらをご覧ください 。 そして、 ここで RSS仕様を見つけることができます。



まとめると



このスクリプトは、Googleアカウントのログイン名とパスワードを明示的に保存するようになりました。これは一般的には重要ではありません。 コンピューターに物理的にアクセスできるすべての人を信頼していますが、一部のウイルスがこのスクリプトにアクセスしてパスワードを取得できるとは考えていません。 しかし、いずれにしても、gReader用に別のアカウントを作成することはおそらく価値があり、すべての問題は解決されます。

一般に、スクリプトはこれまでのところ湿っていてあまり機能的ではありませんでしたが、私が作成した要件を完全に満たしています。

計画には、自動生成ボタンを追加して、readitlaterまたはevernoteに記事を追加し、ポッドキャストを含むフィードを追加して、ポッドキャストを特定のフォルダーに自動的にダウンロードします。

また、スクリプトの改善に役立つhabrasocietyからのフィードバックを期待しています。



All Articles