2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GoでヘッドレスChromeを動かして、ブラウザのLocalStorage取得するメモ

Last updated at Posted at 2022-08-27

やりたいこと

とあるサービスをブラウザで開いたときに、ブラウザのlocalStorageに保存されている情報を取り出したい

今回は例としてQiita

バージョン/パッケージ

  • go : 1.17
  • chromedp: v0.8.3

該当のページをヘッドレスChromeで開くまでのコード

まずは該当のページを開くまで
以下のコードではQiitaのトップ画面のURLをurl変数に入れています。

package main

import (
	"context"
	"fmt"
	"github.com/chromedp/cdproto/emulation"
	"log"
	"time"

	"github.com/chromedp/chromedp"
)

var userAgent string = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"

// 開きたいサービスのURL
var url string = "https://qiita.com/"

func main() {
    // chromeを開くときのoptionを設定している
	opts := append(chromedp.DefaultExecAllocatorOptions[:],
		chromedp.Flag("headless", true), 
	)

	allocCtx, _ := chromedp.NewExecAllocator(context.Background(), opts...)

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

	ctx, cancel = context.WithTimeout(ctx, 20*time.Second)
	defer cancel()

// chromeを立ち上げてページを開く
	err := chromedp.Run(ctx,
		emulation.SetUserAgentOverride(userAgent),
		chromedp.Navigate(url),
	)

	if err != nil {
		fmt.Println("例外吐いてる")
		log.Fatal(err)
	}
}

localStorageに保存されている値を取得する

localStorageに保存されているkey一覧を取得する

上記のコードに処理を追加する

package main

import (
	"context"
	"fmt"
	"github.com/chromedp/cdproto/emulation"
	"log"
	"time"

	"github.com/chromedp/chromedp"
)

var userAgent string = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"

// 開きたいサービスのURL
var url string = "https://qiita.com/"

func main() {
	// chromeを開くときのoptionを設定している
	opts := append(chromedp.DefaultExecAllocatorOptions[:],
		chromedp.Flag("headless", false),
	)

	allocCtx, _ := chromedp.NewExecAllocator(context.Background(), opts...)

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

	ctx, cancel = context.WithTimeout(ctx, 20*time.Second)
	defer cancel()

    // 取得したkey一覧を格納する変数
	var res []string

	// chromeを立ち上げてページを開く
	err := chromedp.Run(ctx,
		emulation.SetUserAgentOverride(userAgent),
		chromedp.Navigate(url),

        // localStorageのkey一覧を取得
		chromedp.Evaluate(`Object.keys(window.localStorage);`, &res),
	)

	if err != nil {
		fmt.Println("例外吐いてる")
		log.Fatal(err)
	}

    // 取得したkey一覧を標準出力する
	fmt.Println(res)
}


localStorageからkeyを指定して、値を取得する

package main

import (
	"context"
	"fmt"
	"github.com/chromedp/cdproto/emulation"
	"log"
	"time"

	"github.com/chromedp/chromedp"
)

var userAgent string = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"

// 開きたいサービスのURL
var url string = "https://qiita.com/"

func main() {
	// chromeを開くときのoptionを設定している
	opts := append(chromedp.DefaultExecAllocatorOptions[:],
		chromedp.Flag("headless", false),
	)

	allocCtx, _ := chromedp.NewExecAllocator(context.Background(), opts...)

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

	ctx, cancel = context.WithTimeout(ctx, 20*time.Second)
	defer cancel()

	var res string

	// chromeを立ち上げてページを開く
	err := chromedp.Run(ctx,
		emulation.SetUserAgentOverride(userAgent),
		chromedp.Navigate(url),
		// 以下のkeyには適宜書き換える
		chromedp.Evaluate("localStorage.getItem('key')", &res),
	)

	if err != nil {
		fmt.Println("例外吐いてる")
		log.Fatal(err)
	}

	fmt.Println(res)
}
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?