気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM、VOCALOIDについてのんびり書きます。

【C#】HTTPWebRequest経由でクッキー認証型システムにログイン【メモ】

ニコニコ動画のクライアントみたいなものを作りたくて、色々とWebを調査していた。

結果、HttpWebRequest、WebResponse、Streamを利用して、
一連の流れを実装すればいいことがわかった。

利用するURL


ニコニコ動画ログイン画面
 https://secure.nicovideo.jp/secure/login?site=niconico

処理フロー

0.ニコ動アカウントの設定 メールアドレスとパスワードでURLのパラメータを作成 
  mail=xxxxxx@xx.xx&password=xxx パラメータは文字列からバイト配列に変換
1.HttpWebRequestクラスのオブジェクト(req)を同クラスのCreateメソッド(URL指定)から生成
2.reqにPOSTメソッドを利用することを明示(デフォルトではGETを利用する)
3.reqのContentTypeを application/x-www-form-urlencoded
4. reqのContentLengthにパラメータのバイトサイズを設定
5.reqのCookieContainerにCookieContainerオブジェクトを指定
6.reqからStreamオブジェクト(reqStream)を得る
7.reqStream経由でパラメータを書き込む
8.reqStreamのクローズ
9. WebResponseオブジェクト(res)を生成
10.resからStream(resStream)を得る
11.StreamReader(sr)を生成 コンストラクタの引数としてresStreamとEncodingクラスを指定
12.srのReadToEndメソッドで、レスポンスを読み込む

ソースコード(※例外処理、クローズ処理等々は全く考慮していない。非常に汚いソースコードとなっている。)

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Net;
using System.IO;
class NicoLib {
	public static void Main(string[] args)
      {
		if(args.Length < 2) {
			Console.WriteLine("PG名 メールアドレス パスワード");
			return;
		}
		// ログインメールアドレス
		string mail = args[0];
		
		// パスワード
		string password = args[1];
		
		// 0.パラメータの設定、バイト配列への変換
		string parameter = "mail="+mail + "&" + "password=" + password;
		byte[] parameterByte = Encoding.ASCII.GetBytes(parameter);

		// ログインページ
		string loginPage = "https://secure.nicovideo.jp/secure/login?site=niconico";
		
		// 1.ログインページのURLからリクエストオブジェクトを生成
		HttpWebRequest req  = (HttpWebRequest)HttpWebRequest.Create(loginPage);
		
		// 2.POSTメソッドを利用
		req.Method  = "POST";
		
		// 3.ContentTypeの設定
		req.ContentType = "application/x-www-form-urlencoded";
		
		// 4.ContentLengthの設定
		req.ContentLength = parameterByte.Length;
		
		// 5.CookieContainerの設定
		CookieContainer cake = new CookieContainer();
		req.CookieContainer = cake;

		// 6.パラメータを書き込むためストリームを取得
		Stream reqStream = req.GetRequestStream();
		
		// 7.Stream経由でパラメータを書き込む
		reqStream.Write(parameterByte, 0, parameterByte.Length);
		
		// 8.クローズ
		reqStream.Close();

		// 9.レスポンスをリクエストオブジェクトから取得
		WebResponse res = req.GetResponse();
		
		// 10.レスポンスのStreamを得る
		Stream resStream = res.GetResponseStream();

		// 11.StreamReaderの生成 ニコニコ動画の場合、エンコードはUTF-8で行う
		StreamReader sr = new StreamReader(resStream, Encoding.GetEncoding("UTF-8"));
		
		// 12.ReadToEndでレスポンスを読み込む
		string result = sr.ReadToEnd();

		// 簡易的なログイン可否 
		// 「入力したメールアドレスまたはパスワードが間違っています」
		// というメッセージがあればログイン失敗
		Regex r = new Regex("入力したメールアドレスまたはパスワードが間違っています");
		if(r.IsMatch(result)) {
			Console.WriteLine("入力したメールアドレスまたはパスワードが間違っています");
		} else {
			Console.WriteLine("認証成功");
		}
	}
}

今後


動画情報については、ニコニコ動画APIで取得可能。
動画ファイル自体もソースコードを工夫することで取得可能らしいため、
調査を続ける。

最終的には、ニコニコ動画のクライアントのようなものを実装したい。