Hatena::ブログ(Diary)

halxxxxの日記 このページをアンテナに追加 RSSフィード

2010-04-01

ダウンロードサイト移転のお知らせ


4月より利用していたレンタルサーバーがサービス終了となり、それに伴い

マニュアルページ、RSS更新情報、ダウンロード管理ページなどが閉鎖となりました。


今後はGoogleのグループの方で配布をしていくので下記URLからご確認ください。

グループメンバーも随時募集中です。



最新版 ver1.5.0.1

http://groups.google.co.jp/group/nwhois/web/nwhois


プラグイン・その他のツール

http://groups.google.co.jp/group/nwhois/web



また更新情報については下記コミュニティでも告知していますので、

不具合が発生した際はまずはじめにチェックしてみてください。

http://com.nicovideo.jp/community/co23186

2009-12-12

クッキー取得ライブラリ公開

nwhoisのクッキー取得部分は炬燵犬さんのクッキー取得クラスCookieGetterを使っていたんですが、

諸事情によりこれを大幅に改造しました。

で、作者さんのページに

ただし、C#の更なる発展のため、改造したソースは公開してください。

とありましたので、改造後のソースコードを公開させていただきます。



改良点
  • DomainではなくURLからクッキーを取得できるようにした
  • Firefox3.5に対応
  • GoogleChrome3に対応
  • 取得する値をStringからSystem.Net名前空間Cookie,CookieCollection,CookieContainerクラスに変更
  • IEの保護モードと非保護モードを分けて扱えるようにした
  • 利用可能なブラウザ一覧を取得できるようにした
  • Lunascape5/6のGeckoエンジンに対応
  • クッキーが格納されているファイルの検索部分(IBrowserManager)とファイルからのクッキー取得部分(ICookieGetter)を分離した


改悪点
  • なんかやたら複雑になった気がする

対応ブラウザ


最大の変更点はクッキーをURLから取得できるようにしたことです。

例えばニコニコ生放送で利用されているクッキーを取得したい場合は


ICookieGetter cookieGetter = CookieGetter.CreateInstance(BrowserType.Firefox3);
System.Net.CookieCollection collection = cookieGetter.GetCookieCollection(new Uri("http://live.nicovideo.jp/"));
System.Net.Cookie userSession = collection["user_session"];

こんな感じで使えます。

URLhttp://live.nicovideo.jp/watch/lv7677172などでも問題なく動作します。




ダウンロード

CookieGetterSharp.dll + SourceCode + SampleCode

http://code.google.com/p/niconama-ocv/downloads/list (クッキー取得ライブラリというコメントがついているもの)

上記のものは今後更新が反映されない可能性があります。

SVNで最新のソースコードを公開しているのでSVN持ってる人はこっちでお願いします。

SVNのコメントがめちゃくちゃなのは許してください)

http://code.google.com/p/niconama-ocv/source/browse/#svn/trunk/Niconama-OCV/CookieGetterSharp



コードについて

f:id:halxxxx:20091213044511j:image:right

パッと見たくさんクラスがありますが、基本的には

  • ICookieGetter
  • ICookieStatus
  • IBrowserManager

の3つさえ把握していれば問題ないです。

ICookieGetterが実際にファイルからクッキーを抽出する部分を担当します。

ICookieStatusはICookieGetterの設定変更や状況取得などのために使います。

IBrowserManagerはICookieGetterのファクトリー的な何かです。どこにクッキーを取得しに行けばいいかなどをGetterに指示します。

ライブラリを使うだけならIBrowserManagerを意識する必要はありません。

CookieGetterクラスの静的メソッドを通してICookieGetterのインスタンスを生成し、GetCookieなどを呼び出しクッキーを取得してください。



利用方法

このライブラリビルドするにはSqliteライブラリが別途必要になります。

下記URLからSystem.Data.SQLite.DLL 最新版をダウンロードしてください。

http://sqlite.phxsoftware.com/

CookieGetterSharp.dllと同じディレクトリに置いておけば多分動くと思います。ダメだったら参照を設定してください。

ダウンロードできない人は同梱されているものを使いましょう)

ライブラリを使用するにはプロジェクトの参照設定で

ダウンロードしたCookieGetterSharp.dllへの参照を追加してください。

f:id:halxxxx:20091213050954j:image:w400

このときCookieGetterSharp.xmlも同じディレクトリにおいておくと少しだけ幸せになれます。

(インテリセンスにコメントが付きます。)


サンプルプログラム

ブラウザURL、名前を指定してクッキーを取得する

f:id:halxxxx:20091212223931j:image

いろいろと直接指定して取得します。


private void button1_Click(object sender, EventArgs e)
{
	BrowserType type;

	if (radioButton1.Checked) {
		type = BrowserType.IE;
	} else if (radioButton2.Checked) {
		type = BrowserType.Firefox3;
	} else if (radioButton3.Checked) {
		type = BrowserType.Opera10;
	} else if (radioButton4.Checked) {
		type = BrowserType.Safari4;
	} else {
		type = BrowserType.GoogleChrome3;
	}

	ICookieGetter cookieGetter = CookieGetter.CreateInstance(type);
	
	if (checkBox1.Checked) {
		cookieGetter.Status.CookiePath = textBox1.Text;
	}

	Uri uri;
	if(cookieGetter.Status.IsAvailable && Uri.TryCreate(textBox2.Text, UriKind.Absolute, out uri)){
		System.Net.Cookie cookie;
		try {
			cookie = cookieGetter.GetCookie(uri, textBox3.Text);
		} catch (Hal.CookieGetterSharp.CookieGetterException ex) {
			MessageBox.Show(ex.Message);
			label7.Text = "取得失敗!エラーが発生しました。";
			return;
		}

		if (cookie != null) {
			textBox4.Text = cookie.Name;
			textBox5.Text = cookie.Value;
			textBox6.Text = cookie.Domain;
			textBox7.Text = cookie.Path;
			label7.Text = "取得成功";
		} else {
			label7.Text = "取得失敗";
		}
	}
}

ソースコード一部抜粋)

ICookieGetter cookieGetter = CookieGetter.GetInstance(type);で対象となるブラウザを指定。

必要があればcookieGetter.CookieStatus.CookiePath = textBox1.Text;でクッキーの読み込み先を変更。

System.Net.Cookie cookie = cookieGetter.GetCookie(uri, textBox3.Text);でクッキーを取得します。

クッキーが見つからず取得に失敗した場合はnullを返しますが、重大なエラーが発生した場合はCookieGetterExceptionをthrowします。

(CookiePathで指定したファイルが存在しない場合や、フォーマットが正しくない場合など)



ブラウザ一覧を取得→指定されたURLに関連するクッキーを表示

f:id:halxxxx:20091212215810j:image

実際に利用可能なブラウザの一覧を表示します。

IEComponentとIESafemodeはVista以降の保護モードと非保護モードを表します。

LunascapeのようにTridentエンジンを利用するものはIEComponentで、IE8はIESafemodeで取得できます。

Firefoxのように複数のプロファイルを作成できるものはブラウザ名のあとにプロファイル名がついた形で表示されます。

(今のところFirefoxだけ)


private void Form1_Load(object sender, EventArgs e)
{

	ICookieGetter[] cookieGetters = CookieGetter.CreateInstances(true);
	comboBox1.Items.Clear();
	comboBox1.Items.AddRange(cookieGetters);

	if (comboBox1.Items.Count != 0) {
		comboBox1.SelectedIndex = 0;
	}
}

private void button1_Click(object sender, EventArgs e)
{
	if (comboBox1.SelectedItem != null) {
		ICookieGetter s = comboBox1.SelectedItem as ICookieGetter;
		Uri uri;

		if (s != null && Uri.TryCreate(textBox1.Text, UriKind.Absolute, out uri)) {
			try {
				cookieBindingSource.DataSource = s.GetCookieCollection(uri);
			} catch (CookieGetterException ex) {
				MessageBox.Show(ex.Message);
			}
		}
	}

}

ソースコード一部抜粋)

ICookieGetter[] cookieGetters = CookieGetter.CreateInstances(true)で現在の環境で利用可能なCookieGetter一覧を取得します。

CookieGetterはToStringをオーバーライドしているのでコンボボックスに直接突っ込んで使うことができます。

(ToStringでCookieGetter.CookieStatus.Nameが出力されます)


注意事項

コードは自由にご利用ください。ですが悪用は厳禁です。

またこのライブラリを使用したことによっていかなる損害が発生しても責任は一切持ちません。

あと、C#の更なる発展のため、改造したソースは公開してください。





バグ報告とか改善策とかコメントしていただけると嬉しいです。


更新内容

09/12/14 12:09 Lunascape6がインストールされていない環境だと例外が発生する問題を修正しました。

09/12/16 07:22 Lunascape6 Webkitに対応しました。

2009-11-19

nwhois ver1.2.4


昨日から一部のNGの登録日が消失したようです。その影響でエラーでてました。

修正版あげておきます。



通常版Nwhois ver1.2.4.2

http://hal.fscs.jp/nwhois/download?ver=rel1242b

軽量版Nwhois ver1.2.4.2 lite

http://hal.fscs.jp/nwhois/download?ver=lite1242b


ご意見ご要望はニコニココミュニティまでお願いします。

こちらに書いても反映されません。

http://ch.nicovideo.jp/community/co23186

2009-10-29

ニコニコ動画(9)に対応しました

暫定版 ver 1.2.3.1

http://hal.fscs.jp/nwhois/download?ver=beta


現在の作業予定

  • コメント検索機能の追加
  • プラグイン仕様の拡張
  • APIライブラリの変更
  • 1000コメント以上前にさかのぼってのコメント取得

そのうち正式版を出します。