-----------
: ニコニコ解析メモ
-----------

・概要ツリー

	*  ? = 未解析である。
	
	基本
		共通点
		ログイン
		セッション
		
	ニコニコ動画
		動画情報
		マイリスト
			マイリストを取得
			とりあえずマイリスト
			マイリストに動画を追加
			マイリストグループ
		ランキング
		新着動画
		オススメ動画(関連動画)
		ニコニコ動画検索
		ダウンロード
	
	ニコニコ静画
		静画情報
		画像リスト
		画像のダウンロード
		
		関連静画?
		
	コミュニティ
		コミュニティ名
	
	ニコニコ生放送
		番組情報
		NGリストの取得
		NGの追加・削除
		
		アラート
			番組情報
			放送中番組一覧(RSS)
			
		枠取り
			順番待ち情報
			
		延長
			ポイント表の取得
			延長
			
		コメントサーバー
			接続
			受信
			送信(荒らし行為を防ぐため仕様非公開)
			過去ログ

・基本

	* 下記の情報は、間違っている可能性や情報が古い可能性もある。
	* XMLにおいて特に不要と思われる項目を省略していることがある。
	* XMLにおいては、実際にブラウザ等で確認してから使用すること。
	
	・共通点
		
		文字コード = UTF8
	
		XML
		
		~XMLの例~
		<getplayerstatus status="ok" time="1262713590">
			<stream>
			
			</stream>
		</getplayerstatus>
		
			ルート要素の属性値 statusは、ほぼ全てのAPIに存在する。
			
				ok   = 正常に取得
				fail = 取得失敗
	・ログイン

		POSTパラメータ
		
			mail     = メールアドレス
			password = パスワード

		POST先URL
			https://secure.nicovideo.jp/secure/login
			
		Cookie
			user_session = セッション
			
	・セッション
		Cookie
			user_session = セッション
			
		* ブラウザから共有するか、事前にログインして取得する。
		  共有は、厄介である。

・ニコニコ動画

	・動画情報を取得[XML]
		http://ext.nicovideo.jp/api/getthumbinfo/[動画番号]
		
		thumb
			video_id       = 動画番号
			title          = タイトル
			description    = 紹介文
			thumbnail_url  = サムネイルのURL
			first_retrieve = 投稿日時
			length         = 長さ ( 4:07 のような形式 )
			movie_type     = 動画の種類 ( flv or mp4 )
			size_high      = 動画のファイルサイズ(byte)
			size_low       = 〃 (エコノミー、0ならsize_highと共有)
			view_counter   = 再生数
			comment_num    = コメント数
			mylist_counter = マイリスト数
			last_res_body  = 最後のコメント
			watch_url      = 動画のURL
			thumb_type     = 不明。
			embeddable     = 外部再生の可否。
						1 = 可
						0 = 否
			tags
				* 10件まで
				* domain="jp" のようにdomainで複数にグループ分けされていることがある。
				tag		= タグ
				
			user_id        = 投稿した人のユーザーID
				
		平均ビットレート
				
			平均ビットレート = size_high ÷ length(秒) × 8
			
		削除されているかどうか
		
			status属性 = fail
				error/code
					NOT_FOUND	= 存在しない。
					DELETED     = 削除されている。
					
			* 但し実際には、確定がもてない。
	
	・マイリスト
		・マイリストを取得[XML-RSS]
			http://www.nicovideo.jp/mylist/[マイリスト番号]?rss=2.0
			
			* 非公開マイリストでもセッションが有効なら取得できる。
			* タイトルは、前に「マイリスト 」後に「‐ニコニコ動画(9)」が付加されている。
			
		・とりあえずマイリスト[JSON]
			http://www.nicovideo.jp/api/deflist/list
		
		・マイリストに動画を追加

			1, 下記URLにアクセスしてNicoAPI.tokenを取得する。
				マイリスト登録ページ[HTML]
				http://www.nicovideo.jp/mylist_add/video/[動画番号]
			
			2, 下記のパラメータを生成してPOSTする。
			
				group_id    = マイリスト番号 ( default or NULL = とりあえずマイリスト )
				description = マイリストコメント
				token       = トークン( NicoAPI.token )
			
				POST先
					http://www.nicovideo.jp/api/mylist/add	: マイリスト番号を指定しているとき
					http://www.nicovideo.jp/api/deflist/add	: マイリスト番号を指定しない(とりあえずマイリスト)
					
		・マイリストグループ[JSON]
			http://www.nicovideo.jp/api/mylistgroup/list
			
	-------------------------------------------------------------------------------------
	
	参考URL 
		RSS一覧 http://www.nicovideo.jp/static/base/rss.html
	
	・ランキング[XML-RSS]
		
		http://www.nicovideo.jp/ranking/[ターゲット]/[期間]/[カテゴリー]?rss=2.0
		
		ターゲット
			comment    = コメント
			view       = 再生数
			fav        = 総合
			mylist     = マイリスト
		期間
			hourly     = 毎時
			daily      = デイリー
			weekly     = 週間
			monthly    = 月刊
			total      = 合計
		カテゴリー
			g_rss      = 公開RSS
			g_all      = カテゴリー総合
			g_ent      = エンタ・音楽・スポ
			g_life     = 教養・生活
			g_politics = 政治
			g_try      = やってみた
			g_culture  = アニメ・ゲーム
			g_popular  = アイマス・東方・ボカロ
	
	・新着動画
	
		・新着動画[XML-RSS]
			
			投稿		http://www.nicovideo.jp/newarrival?rss=2.0
			コメント	http://www.nicovideo.jp/recent?rss=2.0
			公式		http://www.nicovideo.jp/tag/%E5%85%AC%E5%BC%8F?sort=f
					
					%E5%85%AC%E5%BC%8F = 公式
			
		・カテゴリー別[XML-RSS]
		
			http://www.nicovideo.jp/tag/[カテゴリー]?rss=2.0
			
			カテゴリー
				ent      = エンターテイメント
				music    = 音楽
				sport    = スポーツ
				
				animal   = 動物
				fashion  = ファッション 
				cooking  = 料理
				diary    = 日記
				nature   = 自然
				science  = 科学
				history  = 歴史
				lecture  = ニコニコ動画講座
				
				sing     = 歌ってみた
				play     = 演奏してみた
				dance    = 踊ってみた
				draw     = 描いてみた
				tech     = ニコニコ技術部
				
				anime    = アニメ
				game     = ゲーム
				
				imas     = アイドルマスター
				toho     = 東方
				VOCALOID = VOCALOID
				
				other    = その他
				
		・任意タグ[XML-RSS]
			
			http://www.nicovideo.jp/tag/[任意タグ]?rss=2.0
			
			例 : http://www.nicovideo.jp/tag/MikuMikuDance?rss=2.0
	
	・オススメ動画[XML-RSS]
	
		http://www.nicovideo.jp/api/getrelation?page=[ページ番号]&video=[動画番号]
	
	・ニコニコ動画検索
	
		* 3~5秒以内に連続して検索すると規制される。
		* ページ番号は、1から始まる。
		
		[HTML]
		http://www.nicovideo.jp/[検索方法]/[キーワード]?page=[ページ番号]&[並び替えフラグ]
		
			検索方法
				search       = キーワード
				tag          = タグ
				related_tag  = キーワードを含むタグ
				
			キーワード
				
				+ で連結する。
				
				例 「abc+def」
				
			並び替えフラグ
				sort=f		 = 投稿が新しい順
				sort=f&order=a	 = 投稿が古い順
				sort=v		 = 再生が多い順
				sort=v&order=a     = 再生が少ない順
				order=a            = コメントが新しい順
				sort=r             = コメントが古い順
				sort=r&order=a     = コメントが多い順
				sort=m             = マイリストが多い順
				sort=m&order=a     = マイリストが少ない順
				sort=l             = 時間が長い順
				sort=l&order=a     = 時間が短い順
			
		応答
			
			検索できなかったとき
				「短時間での連続アクセスはご遠慮ください」
			
			検索できたとき(キーワード or タグ)
				class = search_total	→ ヒット件数
				
				動画番号の列挙
					1, aタグを抽出する。
					2, class = watch であり、href属性を含むタグに絞り込む。
					3, hrefに動画番号が含まれているので正規表現で抜き出す。
					
			検索できたとき(キーワードを含むタグ)
				class = result_total	→ ヒット件数
				
				タグの列挙
					1, aタグを抽出する。
					2, href属性があり、その値が「tag/」から始まるものに絞り込む
					
	・ダウンロード
	
		1, 動画ページを開く
			http://www.nicovideo.jp/watch/[動画番号]
			
			* Cookie、リファラーの取得等
			
		2, getflvの取得[CGIパラメータ形式]
			
			http://www.nicovideo.jp/api/getflv/[動画番号]?as3=1
			
			* as3=1を付けないと nm 動画がダウンロードできない。
			
		3, ファイルの種類
		
			動画ファイルのURLに (url)「smile?v」があれば、「flv」
			そうでないなら「mp4」
			
			* getthumbinfo(API)でファイルの種類を判定することもできる。
			
		4, ダウンロード
		
			Refererに動画のページのURLを指定
			
				例 「http://www.nicovideo.jp/watch/[動画番号]」
				
			getflvのurlパラメータをダウンロードする。
		
		* その他
		
			nm動画は、FLV(CWS)形式。
			「Flash decompressor」を使うことで  FLV(CWS) → FWS に変換できる。
			
			cws2fws.exe "入力ファイル名" "出力ファイル名"
			
			* これをやらないとffmpegで変換できない。
		
・ニコニコ静画
	
	・静画情報[XML]
	
		http://seiga.nicovideo.jp/api/theme/info?id=[静画番号]
		
		response/theme/id            = 静画番号( sg を除く )
		response/theme/res_count     = 画像枚数
		response/theme/title         = スレッドのタイトル
		response/theme/view_count    = 再生数
		response/theme/comment_count = コメント数
		response/theme/created       = スレッド作成日時 ( yyyy-MM-dd HH:mm:ss )
		response/theme/updated       = スレッド更新日時 ( yyyy-MM-dd HH:mm:ss )
		response/theme/delete_flag   = 削除の有無 ( 1=削除 )
		tag_list                     = タグリスト ( 10件まで )
			tag
				id               = id
				name             = タグ名
				lock_status      = ロック状態 ( 1=ロック 0=編集可能 )
		
		thumbnail_url                = サムネイルのURL
		
	・画像リスト[XML]
	
		http://seiga.nicovideo.jp/api/theme/res/list?theme_id=[静画番号]
		
		* ここでの静止番号は、sgを除いたものである。
		* コメントも全て取得してしまうため、糞重い^ ^
		
		res_list
			res
				id         = 識別ID
				image_id   = 画像番号
				number     = 投稿番号
				created    = 投稿日時( yyyy-MM-dd HH:mm:ss )
				comment_id = コメントID?
				type       = 不明
				status     = ステータス(不明)
				frame      = 不明
				source_url = 画像の元URL
						 * ニコニコ静画内に画像が投稿されている場合は、存在しない
				
			comment_list     = その画像に対するコメント
		
	・画像のダウンロード
		
		* ニコニコ静画内に投稿されている画像の場合
		
			http://seiga.nicovideo.jp/image/source?id=[画像番号]
				オリジナルサイズ
				要cookie、フォーマットはjpeg,gif,pngのいずれか
		
			http://lohas.nicoseiga.jp/img/[静画番号]l	= 大サイズ(800*600以下)
			http://lohas.nicoseiga.jp/img/[静画番号]m	= 中サイズ(320*240以下)
			http://lohas.nicoseiga.jp/img/[静画番号]s	=  小サイズ(96*72以下)
				cookie不要、フォーマットはjpgのみ。
				サイズが以下と表記されているのは、元画像のサイズがそのサイズ以下だった場合は元画像のサイズのままであるため。
				又、その場合でもフォーマットはjpgに変換される。

	
・コミュニティ
	
	・コミュニティ名[HTML]
	
		http://com.nicovideo.jp/community/[コミュニティ番号]
		
		h1タグから取得
		
	・サムネイル
	
		大きいサイズ
			http://icon.nimg.jp/community/[コミュニティ番号].jpg

		小さいサイズ
			http://icon.nimg.jp/community/s/[コミュニティ番号].jpg

・ニコニコ生放送

	・番組情報
		http://live.nicovideo.jp/api/getplayerstatus?v=[生放送番号]
		
		getplayerstatus
			
			属性
				time          = サーバー日時(Unxi)
			
			stream
				id		      = 生放送番号
				default_community = コミュニティ番号
				base_time	      = 放送開始時間(Unxi)
				open_time         = 〃
				
				watch_count	      = 累計来場者数
				comment_count     = コメント数
				
			ms
				addr		= コメントサーバーのアドレス
				port		= コメントサーバーのポート番号
				thread	= コメントサーバーに接続するためのスレッド番号
				
			user  ※  ※放送主ではなく、アクセスした人の情報なので注意
				room_label     = 部屋名(コミュニティ番号)
				room_seetno    = シート番号(プレーヤーの右下に出る座席番号)
				userAge        = 年齢
				userSex        = 性別 1=男 0=女
				userPrefecture = 不明
				nickname       = ユーザー名
				user_id	   = 自分のユーザーID
				is_premium     = 1 ならプレミアム会員
				is_join        = 不明
				
			contents_list
				contents			= コマンド(例 : smile:sm6258578)
					属性
						id         = 画面
							main	= メイン画面
							sub   = サブ画面
						
						start_time = 再生開始時間(Unxi)
						duration   = 動画の秒数(動画再生時のみ)
						title      = 動画のタイトル
			
		
	・NGリストを取得[XML] (放送主のみ)
	
		http://live.nicovideo.jp/api/configurengword?mode=get&video=[生放送ID]
			
		* NGワード、NGユーザー両方をまとめて取得する。
		
		type  
			id   = ユーザーID
			word = NGワード
			
		is_regex
			
			trueなら正規表現である
			
		use_case_unify
		
			trueなら半角・全角・小文字・大文字の違いを無視する
			
	・NG追加と削除 (放送主のみ)
		
		http://watch.live.nicovideo.jp/api/configurengword?video=[生放送番号]&mode=[モード]&source=[キーワード]&type=[タイプ]&use_case_unify=false
		
		モード
			add    = 追加
			delete = 削除
			
		キーワード
			ユーザーIDまたは、NGワード
			
		タイプ
			WORD    = キーワード
			ID      = ユーザーID
			COMMAND = コマンド
			
		その他
			&use_case_unify=false
			
			* use_case_unify=true にすれば、大文字、小文字、半角、全角の違いを無視する。
			
	・運営コメント
	
		POSTパラメータ
			
			body    = 本文
			mail    = コマンド
			name    = 名前 (任意、指定した文字列がニコ割の左上に小さく表示される)
			
		POST先URL
		
			http://watch.live.nicovideo.jp/api/broadcast/[生放送番号]
		
	・アラート
		
		・生放送の情報を取得[XML]
			http://live.nicovideo.jp/api/getstreaminfo/[生放送番号]
		
			streaminfo/default_community = コミュニティID
			communityinfo/name           = コミュニティ名
			streaminfo/title             = 番組名
			streaminfo/description       = 番組説明文
			request_id                   = 生放送番号
			communityinfo/thumbnail      = サムネイルのURL
			
		・放送中番組一覧RSS
		
			[XML-RSS]
			http://live.nicovideo.jp/recent/rss?p=[ページ番号]
			
			* ページ番号は、1から開始
			* 1ページに付き、最大 18件。
			
			ヘッダー
			nicolive:total_count    = 番組数
			
			生放送情報 (item要素)
			
			title                   = 番組名
			link                    = 放送ページのURL
			guid                    = 生放送番号
			pubDate                 = 放送開始日時(Wed, 06 Jan 2010 05:36:08 +0900)
			description             = 番組説明文
			category                = カテゴリー名
			
			dc:creator              = コミュニティ名/コミュニティ番号
			
			media:thumbnail
				属性
					url         = コミュニティのサムネイル
			
			nicolive:community_name = コミュニティ名
			nicolive:community_id   = コミュニティ番号
			nicolive:num_res        = コメント数
			nicolive:view           = 累計視聴者数
			nicolive:member_only    = コミュ限かどうか。 true = コミュ限
			nicolive:type           = 属性 (community or channel)
			nicolive:owner_name     = 放送者名
			
	・枠取り (放送主のみ)
	
		順番待ち[XML]
		http://live.nicovideo.jp/api/waitinfo/[生放送番号]
		
			waitinfo/count         = 待ち人数
			waitinfo/charge_flag   = 順番待ちに変更があったかのフラグ(特に使う必要はないと思う)
			waitinfo/charge_count  = 割り込み回数(これも特に不要かと…)
			waitinfo/start_time    = 開始予定日時
			waitinfo/stream_status = ステータス
							 0 = 順番待ち中
							 1 = 不明
							 2 = 順番キター
							 
			waitinfo/remain_time   = 順番が来たときの300秒待ちのやつ
			waitinfo/exclude       = 不明
			waitinfo/currentstatus = ステータス
							 onair  = 枠が確保できた(順番キター)
							 closed = 枠が終了している?
		
	・延長 (放送主のみ)
	
		・ポイント表[XML]
		
			http://watch.live.nicovideo.jp/api/getsalelist?v=[生放送番号]
			
			getsalelist/item/code  = コード
			getsalelist/item/price = ポイント
			getsalelist/item/num   = 識別番号
			getsalelist/item/item  = 属性
				freeextend = 無料
				extend     = 有料
				
		・延長[XML]
			
			http://watch.live.nicovideo.jp/api/usepoint?v=[生放送番号]&code=[コード]&item=[属性]&token=[トークン]&num=[識別番号]
			
			usepoint/mode          = extend     なら延長成功
			usepoint/new_end_time  = 新しい放送終了時間(Unxi)
			
			* 応答に数十秒掛かる。
			* 仮に延長できたとしてもブラウザの生主用コンソールが更新されないため、
			  コンソールが生放送を切断してしまう。その後、ページを開き直せば、延長されている。
			  
	・コメントサーバー
	
		* XML Socket を使って通信を行う。
		* アラート用のコメントサーバーも同類の方法で使用可能。
		
		・接続
			1, getplayerstatus (API) で番組情報を取得
				(アドレス、ポート、スレッド番号を取得)
				
			2, 下記のXMLを生成
			
				「<thread thread=\"[スレッド番号]\" res_from=\"[過去レス数]\" version=\"20061206\" /> 」
				  
				  * >の右側にに半角スペースが含むことに注意
				  * 過去レス数は、「-200」のように指定。デフォルトは、-50。0は、指定できない。
				  
			3, 接続直後
			
				thread 要素が送られてくる。
				
				属性
					ticket   = チケット番号
					last_res = 最後のレス番号
		
		・受信		
			chat 要素 = コメント
				属性
					no      = レス番号
					date    = 投稿日時(Unxi)
					user_id = ユーザーID
					vpos    = vpos(動画では、コメントの位置情報、生放送では特に不要)
					premium = ユーザーの属性値
							0 = 一般
							1 = プレミアム
							2 = アラート
							3 = 放送主
							6 = 運営
							
					mail    = コマンド
			
			chat_result 要素 = コメント送信結果
				属性
					status = 送信結果
						1 = 失敗
						0 = 成功

		・過去ログ

			接続の際に生成するXMLに waybackkey, when, userid 属性を追加するとwhenで指定した時刻でのコメントを取得できる。

			ウェイバックキー[HTML]

				http://watch.live.nicovideo.jp/api/getwaybackkey?thread=[スレッド番号]

				waybackkey = [ウェイバックキー]
				
				
			過去ログ取得用XML
			
				「<thread thread=\"[スレッド番号]\" res_from=\"[過去レス数]\" version=\"20061206\" when=\"[取得時間]\" waybackkey=\"[ウェイバックキー]\" user_id=\"[ユーザーID]\" /> 」
				  
			
		

HTMLパサー実装参考ページ

http://csfun.blog49.fc2.com/blog-entry-19.html