仕事で、RubyのREXMLというXMLを扱うライブラリを使ってみたので、
RSSで広告をカットするCGIを作ってみました。
RSSのタイトルで”AD:”や”PR:”となっているRSSのアイテムを消します。
ただうまく動かないことがあるので、、、なんでだろう。
数時間で作ってみましたので、うまくうごかない場合はすみません。
使用方法は、RubyとCGIを使ってことのある方前提です。
習作なのでうまく動かなかったらすみません。
サンプルプログラムは、
rss/?uri=(RSSのURI) で動きます。
例:
rss/?uri=http://slashdot.jp/slashdotjp.rss
(本当はGoogle Reader上のGrease Monkeyで作りたかった)
———————————————————
#!/usr/local/bin/ruby
require ‘cgi’
require ‘open-uri’
require ‘rexml/document’
# これはXMLで脆弱性が見つかったためのパッチです。
require ‘rubygems’
require “rexml-expansion-fix”
cgi = CGI.new
uri = cgi.params[‘uri’][0]
rss = open(uri).read
doc = REXML::Document.new(rss)
# 広告のItemをリストとして取り出します
adxpath_list = []
doc.elements.each(“/channel/item/title”) do |element|
if element.text[‘AD:’] or element.text[‘PR:’]
adxpath_list < < element.xpath.gsub(//title$/, “") end end # 広告のItemを上から何番目というのを指定するのですが、前の方から消すと順位が変わってしまいます。そのため後ろから消すことにしました。 adxpath_list.reverse.each do |xpath| REXML::XPath.first(doc, xpath).remove end # スタイルシートがローカルで指定してある場合があるとエラーになる場合があります output = doc.to_s.sub(/<?xml-stylesheet[^>]>/, ”)
cgi.out( {‘type’ => ‘application/xml’} ) { output }
———————————————————