読者です 読者をやめる 読者になる 読者になる

Python2 ニコニコ動画のコメント取得

コメント取得には,ニコニコ動画のIDではなく,固有のスレッドIDが必要らしい.

  1. http://flapi.nicovideo.jp/api/getflv/sm** でスレッドIDとニコニココメント取得APIをのアドレス取得(動画毎にapiの番号が違うから気をつけて).この操作にはニコニコ動画のログイン情報のクッキーが必要.
  2. 取得したAPIにgetリクエストすればコメントのxmlを得られる.リクエストの形式は「http://msg.nicovideo.jp/**/api/thread?version=20090904&thread=***&res_from=-***」という具合.res_from=-***を指定すると,直近***件のコメントを取得できる.
  3. コメントのパースを適当にする.

ソースコード

# -*- coding: utf-8 -*-
import urllib2, cookielib
from urlparse import parse_qs
import re

class NiconicoCommentGetter:
	def __init__(self,username,password):
		cj = cookielib.CookieJar()              # Cookieを格納するオブジェクト
		cjhdr = urllib2.HTTPCookieProcessor(cj) # Cookie管理を行うオブジェクト
		self.opener = urllib2.build_opener(cjhdr)    # OpenDirectorオブジェクトを返す
		self.opener.open("https://secure.nicovideo.jp/secure/login","mail=%s&password=%s" % (username,password) )
	
	def get(self,smID):
		# smIDからthreadIDの取得
		r = self.opener.open('http://flapi.nicovideo.jp/api/getflv/' + smID)
		html = r.read()
		res = parse_qs(urllib2.unquote(html))		
		
		# threadIDからコメントxmlの取得
		r = self.opener.open("%sthread?version=20090904&thread=%s&res_from=-1000" % (res['ms'][0],res['thread_id'][0]) )
		xml = r.read()
		
		# コメントのパース(無理やり,仕様変わってダメになるかも)
		comments = []
		rm = re.compile(">(.*)</chat")
		for line in xml.split('><') :
			g = rm.search(line)
			if( g != None ) : comments.append(g.group(1))
		return comments 

commentGetter = NiconicoCommentGetter("email", "pw")
for i in commentGetter.get("sm7"):
	print(i)

出力例

a
懐かしいな
最も古い動画?
こんなのあるんだ
sm7がなんで今更出現したの?
はえ^~
7コメ、記念カキコ
とうこうびなぞすぎ
6と8無いよ
なんでsm7が今更wwwwww
...(略)

参考資料

ニコニコ動画のコメント解析 – nanoway

urllib2でCookieを使う - ひきメモ