forgot.uh-oh.jp !

FeedSnake Come On!

§ FeedSnake とは

Python で作られた、RSS/Atom のフィードを読み込んで、 加工して、出力する簡単なアプリケーションです。

  • CGI あるいは daemon として動作
  • 出力は「RSS」を http 出力のみ
  • 入力は以下のいずれか
    • Universal Feed Parser がサポートする RSS/ATOM FEED
    • 正規表現でエントリを拾い上げることができる HTML ページ ※1
  • クッキー認証対応

使用には Python 2.5 + Universal Feed Parserが必要です。 ただし:

  • CGI動作の場合:2.5 ではなく、Python 2.4 + pysqlite2 でも動作します。
  • HTML から RSS を生成する(※1)だけの場合: Universal Feed Parser は不要です。

§ ダウンロード

  • feedsnake-20081007_01.tar.bz2(要sqlite)
    • feedsnake.py
      • 本体です。バージョンアップの時は、これのみを差し替えれば ok です。
    • feedsnake_sample.cgi
      • 起動CGIのサンプルです。初期導入時、環境に合わせて修正し、 任意の名前(feedsnake.cgi でも index.cgi でもよい)で保存します。 他人に利用されたくない時は予想不能な名前にしておくとよいでしょう。 (ただし、ウェブサーバがサポートする拡張子で)
    • feedsnake_sample.ini
      • 設定ファイルのサンプルです。こちらは、変更後、 feedsnake.py と同じディレクトリに「feedsnake.ini」 という名前で配置してください。
    • feedsnake_skip.py
      • SKIP用プラグインです。解説はこちら

§ インストール

1. ライブラリ導入

Universal Feed Parser

[memo] Universal Feed Parser のインストール?を参考に導入してください。

SQLite3

Python 2.5 の場合は特に必要ありません。

Python 2.4 や Cygwin の場合は、pysqlite2 を導入します。 [memo] PySqlite2 のインストール? を参考に導入してください。

2. ワークディレクトリとファイル設置

ウェブから見えない位置に mkdir してください。

$ mkdir $HOME/snake

ここに以下のファイルを配置します。

feedsnake.py
FeedSnake 本体です。特にいじる必要はありません。
feedsnake.ini
設定ファイルです。Feed の読み込み先などをここに記述します。
(注意)
このディレクトリには、この他、キャッシュファイルや、 プラグインファイルも多数置かれることになります。

3. daemon 起動の場合

コマンドラインから以下のように入力すると、daemon モードで起動します。

$ python feedsnake.py ポート番号

4. CGI 動作の場合

CGI の実行可能なディレクトリに「feedsnake.cgi」を設置します。 feedsnake.cgi は、ユーザ環境に合わせて修正が必要です。

#!/usr/local/bin/python … (1)

import sys

sys.path.insert(0, "(2)WORK_DIRECTORY")
sys.path.insert(0, "(3)FEEDPARSER_INSTALL_DIRECTORY")

import feedsnake
feedsnake.main()
  • (1) をPython の実行パスに書換えてください。 たいていは /usr/bin/python/usr/local/bin/python です。
  • (2) を FeedSnake を設置したディレクトリに書換えてください。
  • (3) を Universal Feed Parser のインストールディレクトリに書換えてください。
    • Universal Feed Parserを root でインストールした 場合などは OS の標準ライブラリディレクトリにインストールされますので、 (3) の書き換えは不要です(行ごと消してください)

feedsnake.cgi には実行属性をつけてください。 また、feedsnake.cgi 自体は任意の名前にリネームして使うことができます。

5. テスト

ブラウザで feedsnake.cgi を開いてください。

feedsnake03.PNG

エラーもなく、上のような画面が表示されたら、とりあえず、 インストール自体は成功です。

Firefox であれば、リンク先をそのままクリックすれば 内蔵の RSS リーダーでそのまま読むことができるはずです。

この画面は、FeedSnake が現在出力可能な RSS のリンクをリストしています。 これに任意の RSS を加えるには、feedsnake.ini に項目を追加する必要があります。

なお、リンクの横の [x] をクリックすると、キャッシュを削除します。 ini ファイルの調整中で過去の読み取り結果を破棄したい場合に利用してください。

§ feedsnake.ini の書き方

最も単純な feedsnake.ini (RSS のリダイレクト)

[python-jp]
feed=http://www.python.jp/Zope/rss

文法は Python の ConfigParser クラスで読み込むことができる ini ファイル形式となっています。

  • [セクション名]
    • 1セクションが一つの出力フィードを表します。 出力フィードは「http://〜/feedsnake.cgi?セクション名」 といった URL となります。 また、セクション名は、そのまま、キャッシュファイル名のベースになります。
  • feed=(入力フィードURL)
    • RSS を読み込む入力フィードの URL を書きます。 これを利用するためには、Universal Feed Parser が必要になります。

ただし、この例の場合、単に RSS を右から左へリダイレクトしているだけで、 何らおもしろくありません。

全文を出してない RSS に、全文を組み込む

[python-jp]
feed=http://www.python.jp/Zope/rss
import=<img src="http://www.python.jp/Zope/PyLog/CategoryIcons/[^>]*></a>.*?(<p>.*?)<p align="center">
  • import=(正規表現)
    • 入力フィードのエントリにある URL の HTML を読み込んで、 出力フィードのコンテンツに組み込むことができます。 import の右辺は正規表現で、本文として組み込まれるのは、 丸括弧で囲まれた範囲です(Perl で言うところの $1 に相当する部分)

mixi などのログイン認証を通して、本文をとってくる

mixi などの SNS は RSS を出力しているものの、 認証をクリアしないと、それを読み取ることができないため、 ウェブ型の RSS Reader では、そのままでは利用できません。

[mixi]
loginpost=http://mixi.jp/login.pl?next_url=/home.pl&email=(Eメールアドレス)&password=(パスワード)
feed=http://mixi.jp/atom/updates/r=1/member_id=(メンバーID)
import=<div id="diary_body">(.*?)</div>
(注意)
password=… は前の行からの継続です。直前に改行はありません。
  • login=(URL)
  • loginpost=(URL)
    • RSS を読み取る前に、ログイン処理を行う URL を指定します。 パラメータを POST で送る場合は loginpost= を、 そうでない場合は login= 使ってください。
    • POST の場合でもパラメータは ? と & で URL に連結してください。

フィルタリング

author=著者1 著者2…
リストにある著者の記事のみを出力します。
xauthor=著者1 著者2…
リストにある著者以外の記事を出力します。
title=キーワード1 キーワード2 …
リストにあるキーワードをタイトルに含む記事のみを出力します。
xtitle=キーワード1 キーワード2 …
リストにあるキーワードをタイトルに含まない記事のみを出力します。
link=部分URL1 部分URL2 …
リストにある部分URLをURLに含む記事のみを出力します。
xlink=部分URL1 部分URL2 …
リストにある部分URLをURLに含まない記事のみ出力します。

トップに最新記事を並べたサイトから Feed を生成する。

トップページに最新の数記事を並べたサイトから、FEED を生成することもできます。

  • index=(URL)
    • 読み込むべきトップページの URL を与えます。
  • inline=正規表現
    • 正規表現には、以下の項目を含める必要があります。
      • (?P<title>…)
        • …の部分を記事のタイトルとみなします。省略できません。
      • (?P<content>…)
        • …の部分を本文とみなします。省略すると、本文のないフィードになります。
      • (?P<url>…)
        • …の部分をパームリンクとみなします。 省略すると、リンクの URL はトップページそのままに。 ID は本文の md5sum で生成します。

(?P<xxxx>…) は Python の正規表現の文法の一つです。 Python の正規表現ライブラリは「…」の部分の文字列を MatchObject.group("xxx") といった方法で取得することができるのです。

inline= 自体を省略することもできますが、そうすると勝手に 「<a[^>]+?href="(?P<url>[^"]*)"[^>]*>(?P<title>.*?)</a>」 という正規表現ということになります。

§ 変更履歴

  • 2008.08.22
    • (x)author,(x)title= を追加
    • 自動でキャッシュするようにした(ファイル名は、セクション名+「.cache」)
    • キャッシュの削除をウェブからできるようにした。
  • 2008.08.29
    • トップページにインラインで記事を並べたサイトから RSS を出力できるようにした。
    • {要ログイン有/無}×{索引ページ/FEEDあり} など、自由に組み合わせられるようにした。
  • 2008.10.09
    • daemon モード