The Grimoire of Nonsense

個人的なメモを残すブログ

簡易ニコ生アラートっぽいものを

作ろうとしてる。なお完成するかどうかは不明の模様。
XMLSocketが何かとか受信方法、WPFの勉強のために……。
更新がてらにコミュIDからコミュ名とオーナーを取得するやつを書いてみましたです……。
HtmlAgilityPackに依存してます。もっといい書き方があるかもと思いつつここに残す。

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using HtmlAgilityPack;

class NicoCommunity
{
	private string communityId;
	private string communityName;
	private string owner;

	/// <summary>コミュニティIDの取得、設定を行います</summary>
	public string CommunityId
	{
		get { return communityId; }
		set
		{
			if ( !IsValidCommunityId( value ) )
				throw new Exception( "コミュニティIDが正しくありません" );

			communityId = value;
		}
	}

	/// <summary>コミュニティ名の取得を行います </summary>
	public string CommunityName
	{
		get { return communityName; }
	}

	/// <summary>コミュニティのオーナーの取得を行います</summary>
	public string Owner
	{
		get { return owner; }
	}

	/// <summary>超デフォルトコンストラクタ</summary>
	public NicoCommunity() { }

	/// <summary>コミュIDを指定したコンストラクタ</summary>
	/// <param name="communityId"></param>
	public NicoCommunity( string communityId ) : this()
	{
		CommunityId = communityId;
	}

	/// <summary>コミュニティの情報を取得します</summary>
	public void GetCommunityInfo()
	{
		string html = null;

		using ( WebClient client = new WebClient() ) {
			using ( Stream stream = client.OpenRead( @"http://com.nicovideo.jp/community/" + communityId ) ) {
				using ( StreamReader reader = new StreamReader( stream, Encoding.UTF8 ) ) {
					html = reader.ReadToEnd();
				}
			}
		}

		GetCommunityName( html );
		GetCommunityOwner( html );
	}

	/// <summary>コミュニティの名前を取得します</summary>
	/// <param name="html">コミュニティページのHTML</param>
	private void GetCommunityName( string html )
	{
		HtmlDocument doc = new HtmlDocument();
		doc.LoadHtml( html );

		HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes( "//h1[@id='community_name']" );
		if ( nodes.Count > 0 ) communityName = nodes[ 0 ].InnerText;
	}

	/// <summary>コミュニティのオーナーを取得します </summary>
	/// <param name="html">コミュニティページのHTML</param>
	private void GetCommunityOwner( string html )
	{
		HtmlDocument doc = new HtmlDocument();
		doc.LoadHtml( html );

		HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes( "//div[@class='r']//a//strong" );
		if ( nodes.Count > 0 ) owner = nodes[ 0 ].InnerHtml;
	}

	/// <summary>コミュIDが正しいかどうか調べます</summary>
	/// <returns>判定結果</returns>
	private static bool IsValidCommunityId( string communityId )
	{
		return Regex.IsMatch( communityId, @"^co\d+$" );
	}
}