.NET CoreでサイトのRSSフィードを検索してコンソールに出力する


前の記事では、CodeHollow.FeedReader というライブラリを使用して RSS フィードの内容をコンソールに出力しましたが、今度はサイトの中にある RSS フィードを同じライブラリを使用して検索しアドレスをコンソールに出力してみます。

なお、環境は Mac (macOS High Sierra 10.13.3) 、 .NET Core SDK 2.1.4、Visual Studio Codeで、CodeHollow.FeedReader のインストール方法は前の記事を参照してください。

相変わらずコンソールアプリケーションでは、非同期処理が分かりにくいですがそこを除けばまずます分かりやすい内容ではないでしょうか。なお、検索対象とするサイトは当ブログになっています。

using CodeHollow.FeedReader;
using System.Threading.Tasks;
using System.Xml;

//(中略)

    static void Main(string[] args)
    {
        //この Task#Wait() の記法はコンソールアプリだけ。GUIではデッドロックになる。
        Task task =  SearchFeedsAsync();
        task.Wait();
    }

    static async Task SearchFeedsAsync(){
        //URLを設定
        string url = "http://fnya.cocolog-nifty.com/blog/";
        string feedUrl = string.Empty;

        try {
            //RSSフィード検索
            var urls = await FeedReader.GetFeedUrlsFromUrlAsync(url);

            if (urls.Count() < 1) {
                //URLがRSSフィードの場合はURLをセット
                if (await IsValidRss(url)){
                    feedUrl = url;
                } else {
                    Console.WriteLine("RSSフィードが存在しません。");
                }
                
            } else if (urls.Count() >= 1) {
                feedUrl = urls.First().Url;
            }
        } catch {
            Console.WriteLine("RSSフィードが存在しません。");
        }

        //RSSフィードが見つかったらURLを出力
        if (feedUrl != string.Empty) {
            Console.WriteLine("Feed Url:{0}", feedUrl);
        }
    }

    static async Task IsValidRss(string url) {
        try {
            //RSSフィードが読めるかチェック
            var reader = await FeedReader.ReadAsync(url);

            if (reader.Items.Count >= 1) {
                return true;
            } else {
                return false;
            }
        } catch {
            return false;
        }
    }

これを実行すると、以下のように RSS フィードのアドレスが正しく出力されました。

$ dotnet run
Feed Url:http://fnya.cocolog-nifty.com/blog/atom.xml