やりたいこと
とあるサービスをブラウザで開いたときに、ブラウザの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)
}