職場の回覧で回ってきた「情報管理」という雑誌がおもしろそうだったので、購読することにした。幸いJ-STAGEで本文を公開しているので、自宅からでも最新号が閲覧できる。
ただ、J-STAGEでは新着記事の情報をRSSでは配信していないらしく(メール配信はしている)、Googleリーダー等でチェックすることができない。もう、フィードリーディングに慣れた身だとRSSないとめんどくさくてめんどくさくて・・・。
そこで、いろいろ調べてたら、米Yahoo!の提供しているPipesというサービスを見つけた。
Webのリソースを、メールアラートやRSS、Badgeなどに整形して出力できるサービスなのだが、UNIX使いにはおなじみのパイプよろしく、モジュールをつないでいくだけで処理ができる。しかもGUIで!
このへんを見ると感じがつかめるかも。
プログラマ諸氏なら触ってるだけでほぼ理解できるだろうし、プログラムやったことない人でもとっつきやすいんじゃなかろうか。デバッグ環境もよくできていて、触ってるだけでも楽しい。
しかも、公開されてるpipeはみんなソースも見れるし、複製もでき、別のpipeをモジュールとして使うこともできる。まさにWeb 2.0!
で。当初の目的だったJ-STAGEの特定の雑誌の新着記事情報を出力するpipeを作ってみた。
J-STAGEの雑誌のトップページのURLを入力し「Run Pipe」をクリックすると、その雑誌の最新号の記事一覧が出力される。
RSSで出力したい場合は、More options - Get as RSSをクリックする。
作成中気づいたことメモ
- 型が割と厳格で、型が違うとモジュールを接続できないので注意。
- Fetch pageなどでデータを得るとデータ型がitemsで出力される。これを(たとえばitem.contentを)text型などのデータとして利用したい場合は、Loopモジュールを使う。
- 型の変換は、上記のLoopモジュールやURL Builderなどを駆使する。
以下、逐次解説。
上記pipeのソースを見ながら(Edit Sourceで見られる)どうぞ。
処理の流れ
J-STAGEの雑誌のトップページには最新号の記事一覧へのリンクがある(が、そのアドレスは最新号が出るたびに変わるっぽい)。
このリンクから最新号の記事一覧を取得して、個々の記事に分けて出力する。
1.URL Input
ユーザに雑誌のURLを入力させる部分。
Promptは入力フィールドの前に表示される文字列。
Defaultはデフォルトで表示される文字列。
Debugはデバッグ時に使用される文字列。
positionはたぶん複数置くときの順番。
Nameはどこで使うのかよくわからん。
出力はURL型。
2.Fetch page
Webページのソースを取得する。
URLは取得するページのURL。1を接続する。
Cut content from/toはページ全体から切り取る開始文字列と終了文字列。ここでは、最新記事のページのURLを取り出したいので、その前後の文字列を指定した。
Split using delimiterは区切り文字列。ここでは、指定しない。
出力はitem型の配列であるitems型。Split using delimiterを指定していると、それで区切って配列にするわけだが、ここでは指定してないので要素1つの配列になる。
3.Regex
正規表現でitemの子要素を置換する。
2で得た部分にはゴミがついてるのでURLの部分だけを取り出す。
出力はさっきと同じくitem型の配列であるitems型。
以下、すべてitem型の配列であるitems型で出力される。
4.Loop
itemsの各要素に対して処理を行う。
ここではitemsの要素数は1つだけなのだが、その場合でもこれを使う。
ここにFetch pageを入れ、item.contentに入っているURLをもとに最新号のページを取得する(ここでURL型への型変換は勝手にやってくれるみたい)。記事一覧の部分だけ取り出し、各記事の区切りをSplit using delimiterに指定した。
5.Rename
この時点ではitem.contentのなかに一記事分のHTMLがまるまる入っているわけだが、最終的には、item.title、item.link、item.descriptionにそれぞれ、タイトル、記事の(抄録の)URL、著者名を格納したい。そのため、item.contentを2つコピーし、それぞれをtitle、link、descriptionと名前をつける。
6.Regex
正規表現による置換で、それぞれの要素から不要な部分を削除する。
7.Pipe Output
最後にここに出力する。
あとはSaveして、Run Pipeでテスト。
問題なければPublishで公開して完了。