📺

Python で、帰ってきたニコニコのコメントを取得する

2024/08/24に公開

私はこれまで、ニコニコに投稿した動画のコメントを Python で取得していたのですが、この度ニコニコのバージョンが「帰ってきたニコニコ」となったことに伴い、コメントの取得方法が変わったらしく、今までの方法では取得できなくなりました。
そこで、帰ってきたニコニコでコメントを取得する方法がないか調べたところ、TypeScript で実装したという以下の記事を見つけました。
https://zenn.dev/doma_itachi/articles/c448d4b6271d32
こちらを参考にさせて頂いて Python で実装した、というのが本記事の内容です。

スクリプト

get_comments.py
import json
import re
import requests

from bs4 import BeautifulSoup

movie_id = "sm9"  # 動画 ID

url = f"https://www.nicovideo.jp/watch/{movie_id}"
source = requests.get(f"https://nicovideo.jp/watch/{movie_id}")
soup = BeautifulSoup(source.text, "html.parser")
soup = str(soup)

threadIdRegex = r'threadIds":\[\{"id":(.*?),"'
threadKeyRegex = r'"threadKey":"(eyJ0eXAiOiJKV1Qi.*?)"'

threadId = re.findall(threadIdRegex, soup)[0]
threadKey = re.findall(threadKeyRegex, soup)[0]

headers = {"x-frontend-id": "6"}
params = {
    "params": {
        "targets":[
            {
                "id": threadId,
                "fork": "owner"  # 投稿者コメント
            },
            {
                "id": threadId,
                "fork": "main"  # 通常コメント
            },
            {
                "id": threadId,
                "fork": "easy"  # かんたんコメント
            }
        ],
        "language": "ja-jp"
    },
    "threadKey": threadKey,
    "additionals": {},
}
endpoint = "https://public.nvcomment.nicovideo.jp/v1/threads"
res = requests.post(endpoint, json.dumps(params), headers=headers).json()

comment_data = res["data"]["threads"]
# comment_data[0] : 投稿者コメント
# comment_data[1] : 通常コメント
# comment_data[2] : かんたんコメント

comment_type = ["投稿者コメント", "通常コメント", "かんたんコメント"]
for n in range(3):
    print(comment_type[n])
    for d in sorted(comment_data[n]["comments"], key=lambda x:x["vposMs"]):
        # d["vposMs"] : コメントの動画内時刻[ms]
        minutes = d["vposMs"] // (1000 * 60)
        seconds = d["vposMs"] // 1000 % 60

        comment = d['body']

        print(f"{minutes:0>2}:{seconds:0>2}\t{comment}")
    print()

実行結果の例

動画の ID として sm9 を指定したときの実行結果です。
動画内時刻の小さい順に出力されます。

実行環境

OS : Windows10
Python : 3.8.2
beautifulsoup4 : 4.11.1

C:\> python get_comments.py
投稿者コメント

通常コメント
00:01   コメント消えるのやめてくれ(´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥`)
00:01   やばw
00:01   うぽつ
00:02   コメント消えるのどうにかしてくれ…(´;ω;`)
00:02   変な🍣←これとかいいから(´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥`)
00:03   (今は平成35年です)
00:04   ジェダイ☆
00:06   ピコちゃんまってたぞーーーー
00:07   うぽつ
00:09   きたきたwww
00:10   ニコニコおかえり
(中略)

かんたんコメント
00:07   うぽつ
00:09   うぽつ
00:10   うぽつ
00:10   うぽつ
00:10   うぽつ
(中略)
05:12   88888888
05:12   88888888
05:13   88888888
05:16   おつ
05:18   88888888

補足

表示環境やコーデックによっては、絵文字などの特殊文字が正しく表示されなかったり、実行結果をファイルにリダイレクトしたときにエラーが発生したりします。例えば、Windows の標準出力では、CP932 というコーデックが使われており、リダイレクト時に CP932 へ変換できない文字がコメントに含まれていると以下のようになります。

C:\> python get_comments.py > comments.txt
Traceback (most recent call last):
  File "get_comments.py", line 63, in <module>
    print(f"{minutes:0>2}:{seconds:0>2}\t{comment}")
UnicodeEncodeError: 'cp932' codec can't encode character '\u0325' in position 22: illegal multibyte sequence

解決策の一つとして、変換できない文字を無視する方法があります。CP932 の場合は、以下のような記述を付け足すことでエラーが解消します。

import codecs
comment = comment.encode("cp932", "ignore").decode("cp932")

参考記事

https://zenn.dev/doma_itachi/articles/c448d4b6271d32
https://qiita.com/butada/items/33db39ced989c2ebf644
https://zenn.dev/negima1072/articles/howto-get-nicovideo-comments

最後に

とんでもねぇ、待ってたんだ・・・(ニコニコ復活)

Discussion