Google NewsのATOMを取得する

現在、ポータルをGoogle Sitesでコツコツ作成していますが、そうなると毎回出てくるのが、ニュースを受信できないか?といった要望。早い話が、RSSを受信して、自分たちに関連しそうなニュースを表示してみようという事です。ただ、この手のものは既にGoogleガジェットで結構出回っているので、手っ取り早くRSSを取得して表示したいのであれば、わざわざコードを書かずに、ガジェットにURL渡して貼り付けるほうが早いです。自分自身もそのやり方を採用しています。とはいえ、細かいカスタマイズが必要だとか、こだわりがあるだとか、そういった場合、どうしてもこれら出来合いのガジェットでは対応が難しい場合があります。

そんな時に、自分でガジェットを作ることが一番オススメなのですが、今回はあえてそこをGoogle Apps Scriptで取得して整形してみたいと思います。RSSと銘打ちましたが、今回はATOM形式で取得します。

Google Newsのフィード

Google Newsは実は日本のサイトでは公式にRSS出力出来ますといったことは表示されていません。代わりに全く利用価値の無いAlertというものを未だにやってたりします。しかし、実はRSSでもATOMでも取得出来るようになっています。そこで、今回は「仮想化」というキーワードを元に以下のURLでATOM形式で取得してみました。URL中のatomの文字列をrssにするとRSS形式での取得が可能になります。

http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=atom&q=%E4%BB%AE%E6%83%B3%E5%8C%96

ソースコード

ただ受信しても、表示する手段がないので、今回もHTML Servicesで整形して表示してみようと思います。非常に単純にリストにして表示しますが、ATOMの中で使用する項目はIDとTITLEのみです。

また、CSSを利用していますが、今回はその部分はコードから省略します。

GAS側コード

function doGet(){
  var output = HtmlService.createTemplateFromFile('atomman');
  var html = output.evaluate();
  return html;
}
// データ取得とパース
function parseXml() {
  var url = 'http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=atom&q=%E4%BB%AE%E6%83%B3%E5%8C%96';
  var myXm = UrlFetchApp.fetch(url).getContentText();
  var myDoc = XmlService.parse(myXml);
  var root = myDoc.getRootElement();
  var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');
  
  // エントリーのタイトルとURLの塊を取得
  var entries = root.getChildren('entry', atom);
  
  return entries;
}

HTML側コード(atomman.html)

<style type="text/css">

・・・・・省略・・・・・

</style>
<div class="kousin">
<?
    //parseしたデータを準備
    var atomdata = parseXml();
    var dataLength = atomdata.length;
    var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');
    
    output.append("<div class=imglist><ul>");
    
    //activeユーザと承認者が同一で未承認のものをリストアップして出力する
    for(var i = 0;i<dataLength;i++){
      //必要な情報を取得して、HTMLを組み立てて出力する
       var title = atomdata[i].getChild('title', atom).getText();
       var id = atomdata[i].getChild('id', atom).getText();
       
       var tempid = id.split("=");
       var url = tempid[1];
       
       var contents = atomdata[i].getChild('content', atom).getText();
       output.append("<div class='myClassName'>");
       output.append("<li><a href='" + url + "' target='_blank'>" + title + "</a></li></div>");
    }
    
    output.append("<div></ul></div>");
    
?>
</div>

実行結果

ヒント

  • 他にも、StackOverFlowや、Question2AnswerなどのQA系オープンソースツールなどから出力させたRSSを受信してみたり、他の部署が投稿している内容を横から拾って表示させたり、イントラで使う上ではまだまだRSSに関しては、便利なツールだと思います。
  • 今回は、Google NewsのATOMでしたので、その中にあるIDエントリ(からURLだけ抜きました)、TITLEのエレメントを、entriesエレメントの中から取り出しています。他のRSSの場合にはこの辺りが変わりますので、よーく構成を読み取って取得したいエレメントを見つけて設定しましょう。

参考リンク