WebMatrix:愛媛のニュースだけ読みたいので、Google ニュースから引っ張ってくる

執筆日時:

f:id:daruyanagi:20150118081201p:plain

地元のニュースだけ読みたいので、それを Google ニュース引っ張ってくる BOT でも作ろうかと思って少し調べてみた。

# ~/App_Code/GoogleNews.cshtml

@using System.ServiceModel.Syndication @using System.Xml

@helper Get(string query) { var url = string.Format( "http://news.google.com/news?q={0}&output=rss", query );

using (var reader = XmlReader.Create(url)) { var feed = SyndicationFeed.Load(reader);

// @ObjectInfo.Print(feed);

var data = feed.Items.Select(_ => new { Title = _.Title.Text, Summary = _.Summary.Text, PublishDate = _.PublishDate, Url = _.Links.First().Uri.ToString().Split('=').Last(), });

// @ObjectInfo.Print(data);

foreach (var d in data) { // <h2><a href="@d.Url">@d.Title</a></h2> <p>@Html.Raw(d.Summary)</p> // <p>@d.PublishDate</p> } } }

パラメーターに output=rss をくっつけると RSS 形式でデータを取得できるので XmlReader と SyndicationFeed で読み込み・整形してやるとよさげ。

残念なのでは地域ごとに絞れないこと*1。そのため「松山」で検索すると台湾の松山のニュースも引っかかるが……まぁ、これは仕方ないかな。JavaScript の API を利用すれば、ちゃんと制御できるようなので、JavaScript ができる人はそちらで書けばいいと思う。

結果

f:id:daruyanagi:20150118080353p:plain

# ~/Default.cshtml

<!DOCTYPE html>

<html lang="en"> <head> <meta charset="utf-8" /> <title></title> <style>

  • { font-family: Meiryo, sans-serif; } </style> </head> <body> @GoogleNews.Get("愛媛 OR 松山 -秀樹 -ゴルフ") </body> </html>

天気予報機能も付けて(「☀時々☁、最高10度最低0度、西風後南西風海上後南西風稍強、波0.5米後1米」)、Twitter BOT にでもしようかな。

*1:本当はパラメーターに ned=jp を付けるとその国のニュースのみにデータを絞れるはずなのだけど、日本語版の Google ニュースでは利用できないようだ。