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

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

今回は例としてQiita

## バージョン/パッケージ
* go : 1.17
* chromedp: v0.8.3

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

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

```go
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一覧を取得する

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

```go
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を指定して、値を取得する

```go
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)
}