サーバ

フィードの URL を変えずに RSS/RDF/ATOMフィードに広告を挿入

Trend Match for feedsというサービスを使ってフィードに広告を入れてみました。
Trend Match は Google の AdSense と同じくコンテンツの内容を見て適切な広告を埋め込んでくれることになっています。
それなりに読者が興味をもつ広告が表示されればうるさくは感じないと思うんですが・・・どうでしょう。
日本語の処理は強み!と謳っています。
・CNET – コンテンツ連動型RSS広告でブロガーが稼げる–RSS広告社が個人向けで初

自分のサイトで用意しているフィードのURLを登録すると、先方で広告入りのフィードを生成してくれるという仕組みになっています。
提供されるフィードのURLをサイトに埋め込めばいいのですが、既存のフィードのURLをサブスクライブしている人には広告が表示されないのが悩ましいです。

既存のフィード購読のイメージ

なので、blogではいつもと違うURLにRSSを生成し、Trend Match にはそちらを読み込ませるようにしました。
で、いつものフィードからはTrend Match より提供される広告入りのフィードをリバースプロキシして配信する作戦。
今回は以下の様な簡単なJSPを作って実現しています。
・rss-proxy.jsp

<%@ page language=”java” contentType=”text/xml; charset=UTF-8″
import=”java.net.URL,java.net.HttpURLConnection
,java.net.URLEncoder
,java.io.BufferedReader
,java.io.InputStreamReader”
session=”false”%><%request.setCharacterEncoding(“UTF-8”);
%><%
URL url = new URL(“広告入りフィードのURL”);
HttpURLConnection con =(HttpURLConnection)url.openConnection();
con.setRequestMethod(“GET”);
con.connect();
BufferedReader bw = new BufferedReader(new InputStreamReader(con.getInputStream(),”UTF-8″));
String line;
StringBuffer buf = new StringBuffer(128);
while(null != (line = bw.readLine())){
buf.append(line).append(“\n”);
}
bw.close();
byte[] buf2 = buf.toString().getBytes(“UTF-8”);
response.setContentLength(buf2.length);
response.getOutputStream().write(buf2);
%>

つまり[オリジナルフィード(RSS) > Trend Match で広告挿入(RSS) > JSP でリバースプロキシ]という構成になります。

オリジナルのURLで広告入りのフィードを配信

JSP ではなく、Apache の mod_rewrite を使う場合はこんな設定になるでしょうか(検証してません)。

RewriteEngine On
RewriteRule ^/blog/rss.xml$ http://rss.rssad.jp/rss/****************

こういう柔軟なことができるのは自宅サーバで運用しているblogの強みですね。
最初から Trend Match に対応した blog サービスもあるみたいなので、それらではもっと簡単に実現できるのかもしれません。

もうひとつ問題になったのはフィードのフォーマットです。
Trend Match では RSS 形式のフィードしか作ってくれません。
ATOM 形式として購読しているリーダに RSS 形式が配信されると混乱してしまうのか、各エントリが2つずつ表示される現象がありました。
自分で Trend Match のフィードを ATOM 形式に変換するのは面倒なので、FeedBurnerというサービスを利用しました。ここでは無償でフィードを各種フォーマットに変換するサービスがあります。
つまり[オリジナルフィード(RSS) > Trend Match で広告挿入(RSS) > FeedBurner で変換(ATOM)> JSP でリバースプロキシ]という多段プロキシになります。

オリジナルのフィードURLで広告入りATOMフィードを配信