ニコニコ動画の再生リストの動画URLをリストにする
再生リストから動画URLのリストを作れば良さそう
手ではぜっったいにやりたくないあんも.icon*2
動画URL一括出力はサポートされていない
知識があったとしても、第一に選ぶ方法ではないと思う
サイトのリクエストからもらってくれば簡単そう
ここも自動化できるとよいのかな?あんも.icon
手でやっても問題ないところだけど
手でやっている部分をどうやったらスクリプトにできるんだろう?
多分できるあんも.icon
HTTPリクエストでもらってきて、それをそのまま整形して保存すればいい
手でやる必要がなくなる
再生リストを渡すようになるのかな?
要素をどうやって指定するのが良い方法なのか?
行数でやるのは賢くなさそうあんも.icon
<script type="application/ld+json">のタグでもらうのがまるい
利用する手段としてはこの優先度か
1. サイトの機能を利用する
一般的な機能
3. 開発者機能から覗き見する
やっぱり第一にとる方法ではなさそうあんも.icon
「ニコニコ」のサーバーに過度の負担を及ぼす行為
「ニコニコ」の運営を妨害する行為
運営会社の許諾を得ない売買行為、オークション行為、金銭支払やその他の類似行為
運営会社が不適切であると考える行為
取ってきたリストを使って変なことをしなければよいのかなあんも.icon
大量のURLリストで何度もニコニコ動画にアクセスする
他人に売る?
これを例に使う
実はYouTube版があるあんも.icon
じゃあこのスクリプトいらなくない???あんも.icon
https://gyazo.com/a03196d100a834068c70e8286a15dfd4
検索からwatchで調べるといい感じの文字列が見つかる
動画URLがhttps://www.nicovideo.jp/watch/sm37195183のような形式で与えられているから
実際は/がエスケープされてhttps:\/\/www.nicovideo.jp\/watch\/sm37195183の形式で指定されている
code:html
<script type="application/ld+json">{"@context":"http:\/\/schema.org","@type":"ItemList","itemListElement":[{"@type":"VideoObject","position":1,"@id":"https:\/\/www.nicovideo.jp\/watch\/sm37192083","name":"◆学校であった怖い話 実況プレイ◆part1","description":"▽1995年発売のSFCソフト『学校であった怖い話』の実況プレイ。(プレイ自体はWiiUのバチャコ","caption":"▽1995年発売のSFCソフト『学校であった怖い話』の実況プレイ。(プレイ自体はWiiUのバチャコ","url":"https:\/\/www.nicovideo.jp\/watch\/sm37192083","duration":"PT1976S","uploadDate":"2020-07-15T17:30:00+09:00","embedUrl":"https:\/\/embed.nicovideo.jp\/watch\/sm37192083?autoplay=1","interactionStatistic":{"@type":"InteractionCounter","interactionType":"http:\/\/schema.org\/WatchAction","userInteractionCount":854522},{"@type":"InteractionCounter","interactionType":"http:\/\/schema.org\/WantAction","userInteractionCount":3549},"requiresSubscription":false,"isAccessibleForFree":true,"thumbnail":{"@type":"ImageObject","url":"https:\/\/img.cdn.nimg.jp\/s\/nicovideo\/thumbnails\/37192083\/37192083.91052013.original\/r1280x720l?key=0ca752aa3260055d3a2e611156dfa1d41a80d650ac382f7d0a7a461a277c92ae"},{"@type":"ImageObject","url":"https:\/\/nicovideo.cdn.nimg.jp\/thumbnails\/37192083\/37192083.91052013.L","width":360,"height":270},{"@type":"ImageObject","url":"https:\/\/nicovideo.cdn.nimg.jp\/thumbnails\/37192083\/37192083.91052013.M"},{"@type":"ImageObject","url":"https:\/\/nicovideo.cdn.nimg.jp\/thumbnails\/37192083\/37192083.91052013","width":130,"height":100},"thumbnailUrl":"https:\/\/img.cdn.nimg.jp\/s\/nicovideo\/thumbnails\/37192083\/37192083.91052013.original\/r1280x720l?key=0ca752aa3260055d3a2e611156dfa1d41a80d650ac382f7d0a7a461a277c92ae","https:\/\/nicovideo.cdn.nimg.jp\/thumbnails\/37192083\/37192083.91052013.L","https:\/\/nicovideo.cdn.nimg.jp\/thumbnails\/37192083\/37192083.91052013.M","https:\/\/nicovideo.cdn.nimg.jp\/thumbnails\/37192083\/37192083.91052013"},{"@type":"VideoObject","position":2,"@id":"https:\/\/www.nicovideo.jp\/watch\/sm37195186","name":"◆学校であった怖い話 実況プレイ◆part2","description":"▽1995年発売のSFCソフト『学校であった怖い話』の実況プレイ。(プレイ自体はWiiUのバチャコ","caption":"▽1995年発売のSFCソフト『学校であった怖い話』の実況プレイ。(プレイ自体はWiiUのバチャコ","url":"https:\/\/www.nicovideo.jp\/watch\/sm37195186","duration":"PT1102S","uploadDate":"2020-07-16T17:30:00+09:00","embedUrl":"https:\/\/embed.nicovideo.jp\/watch\/sm37195186?autoplay=1","interactionStatistic":{"@type":"InteractionCounter","interactionType":"http:\/\/schema.org\/WatchAction","userInteractionCount":314802},{"@type":"InteractionCounter","interactionType":"http:\/\/schema.org\/WantAction","userInteractionCount":328},"requiresSubscription":false,"isAccessibleForFree":true,"thumbnail":{"@type":"ImageObject","url":"https:\/\/img.cdn.nimg.jp\/s\/nicovideo\/thumbnails\/37195186\/37195186.82737947.original\/r1280x720l?key=5b16e14a75fc7ea7522dd5a3f8ee364f872cbe6988ab173ad6b5cc20812d45b2"},{"@type":"ImageObject","url":"https:\/\/nicovideo.cdn.nimg.jp\/thumbnails\/37195186\/37195186.82737947.L","width":360,"height":270},{"@type":"ImageObject","url":"https:\/\/nicovideo.cdn.nimg.jp\/thumbnails\/37195186\/37195186.82737947.M"},{"@type":"ImageObject","url":"https:\/\/nicovideo.cdn.nimg.jp\/thumbnails\/37195186\/37195186.82737947","width":130,"height":100},"thumbnailUrl":"https:\/\/img.cdn.nimg.jp\/s\/nicovideo\/thumbnails\/37195186\/37195186.82737947.original\/r1280x720l?key=5b16e14a75fc7ea7522dd5a3f8ee364f872cbe6988ab173ad6b5cc20812d45b2","https:\/\/nicovideo.cdn.nimg.jp\/thumbnails\/37195186\/37195186.82737947.L","https:\/\/nicovideo.cdn.nimg.jp\/thumbnails\/37195186\/37195186.82737947.M","https:\/\/nicovideo.cdn.nimg.jp\/thumbnails\/37195186\/37195186.82737947"}]}</script> 2つ目の要素までの例
JSONファイルとして読んでもらえるように、頭の<script type="application/ld+json">とお尻の<\script>は削除しておく これをメモ帳とかでdata.txtとでも保存しておく
JSONファイルとして読んでURLの部分を抜き出す
JSONファイルの構造を知らないあんも.icon
配列とほとんど同じ?
ChatGPT.iconが書いてくれた
code:jl
using JSON
data = read("data.txt", String)
parsed_data = JSON.parse(data)
urls = []
push!(urls, video_url)
end
# テキストファイルに保存
open("video_urls.txt", "w") do file
for url in urls
println(file, url)
end
end
うまくできているあんも.icon
code:video_urls.txt
関数にしておく
rawリテラルを渡すsave_urls(raw"C:\フォルダ名\動画シリーズ名.txt")
めんどくさいからあとで直すあんも.icon
code:save-urls.jl
using JSON
function save_urls(filename)
# 動画シリーズ名を取得
series_name = split(basename(filename), ".")1 # フォルダのパスを取得
folder_path = dirname(filename)
# 出力ファイルのパスを生成
output_path = joinpath(folder_path, series_name * "_urls.txt")
# JSON データを読み込む
data = read(filename, String)
parsed_data = JSON.parse(data)
# 動画のURLを抽出
urls = []
push!(urls, video_url)
end
# テキストファイルに保存
open(output_path, "w") do file
for url in urls
println(file, url)
end
end
println("保存完了: $output_path")
end
JSON.parse(data)にどんな形式で入っているかがわかったら他の要素も取れそうあんも.icon
code:jl
Dict{String, Any} with 3 entries:
"itemListElement" => Any[Dict{String, Any}("requiresSubscription"=>false, "isAccessibleForFree"=>…
"@type" => "ItemList"
JSON.parse(data)["itemListElement"]?あんも.icon
"@type"が混じっているように見えるのが気になる
要素の大枠を指定して見てみよう
全部自動でできるようにする
ニコニコ静画の再生リストのページの構造を調べる
code:bash
curl -o nico.txt "$url"
grep -o '<^>*>' nico.txt > tags.txt sed '/^:space:*$/d' tags.txt > minify_tags.txt
<script type="application/ld+json">のタグは1つしかないので、これをキーにして抽出できそう
中身のJSONがない
人間がアクセスしないともらえないらしい?あんも.icon
ブラウザの動作をエミュレートする?
APIを叩く?
多分調査されていると思うあんも.icon
一旦止めるあんも.icon*4
100個もあるのを手で取りたくなかった
次のページもあるから100個以上ある
スクリプトを組むのに1時間くらいかかってしまった
なぜ見るからに大変そうな手段を最初にとってしまったのか?
実はJSONファイルだったのでパーザを使うと楽だった、という話 ニコニコがラベルを変更しない限りうまく動きそう
関数にしておいた
入力周りのことが全然わからない