だるろぐ

明日できることは、今日しない。

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 ニュースでは利用できないようだ。