19日に更新してた

アフィリエイトはないよ

chromedp を使って msedge.exe で YouTube の script 中の json をファイルにしてみた。

YouTube の個別の動画ページの html を見ていて、script 中に url が書かれていたので手繰っていったら、json ぽかったので chromedp で抽出できるかなと思ったら出来たので書いてみました。

ちなみに、これで出てきたのを struct にすると590行くらいになりましたが、struct にして読み込みしてもサクサク動いてました。

そんなバカでかい struct を意味なくここに書くのもどうかと思いますので動かしてみてください。

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"log"
	"os"

	"github.com/chromedp/cdproto/runtime"
	"github.com/chromedp/chromedp"
)

func main() {
	allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), []chromedp.ExecAllocatorOption{
		chromedp.ExecPath(`C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe`),
		chromedp.NoFirstRun,
		chromedp.NoDefaultBrowserCheck,

		chromedp.Headless,

		chromedp.Flag("disable-extensions", false),
		chromedp.Flag("enable-automation", false),
		chromedp.Flag("restore-on-startup", false),
	}...)
	defer cancel()

	ctx, cancel := chromedp.NewContext(allocCtx, chromedp.WithErrorf(log.Printf))
	defer cancel()

	var res *runtime.RemoteObject
	err := chromedp.Run(ctx,
		chromedp.Navigate(`https://www.youtube.com/watch?v=ZRtdQ81jPUQ`),
		chromedp.EvaluateAsDevTools(`ytInitialPlayerResponse`, &res, chromedp.EvalAsValue),
	)
	if err != nil {
		log.Println(err)
	}

	jsonMarshaled, err := json.Marshal(res)
	if err != nil {
		log.Println(err)
	}

	// json ファイル作成用

	file := "ytInitialPlayerResponse.json"

	fp, err := os.Create(file)
	if err != nil {
		log.Println(err)
		return
	}
	defer fp.Close()

	err = os.WriteFile(file, []byte(jsonMarshaled), 0664)
	if err != nil {
		log.Println(err)
	}
}