【Golang】playwright-goでログイン情報を保持する

playwright-goにはブラウザの状態(Cookie、localStorage)をファイルに保存し、次回起動時にログイン済みの状態でブラウザを起動できる機能があります。
この機能を使うと、毎回ログイン操作を行わずにログイン済みの状態でブラウザを操作できます。

コード例

ログイン情報の保存と復元は、StorageStateとNewContextのオプションを使用します。

// ログイン情報の保存
page.Context().StorageState("ログイン情報の保存先ファイルパス.json")

// ログイン情報の復元
context, err = browser.NewContext(playwright.BrowserNewContextOptions{
    StorageStatePath: playwright.String("ログイン情報の保存先ファイルパス.json"),
})

ログイン状態の保存と復元を組み合わせたコードです。

package main

import (
    "bufio"
    "fmt"
    "os"

    "github.com/playwright-community/playwright-go"
)

const sessionFilePath = `./session/session.json`

func main() {
    pw, browser, context, _ := LaunchBrowser(false, sessionFilePath)

    defer pw.Stop()
    defer browser.Close()
    defer context.Close()

    page, _ := context.NewPage()
    defer page.Close()

    // ログイン済みの場合はそのままアクセス可能なページ、ログインしていないときはログインページにリダイレクトされるページを指定
    page.Goto("https://example.com/")
    // ログインページにリダイレクトされた場合、手動または自動でログイン操作を行う

    // WaitForURLなどでログイン完了を待機
    page.WaitForURL("https://example.com/")

    // 何らかの処理

    // 操作完了後、セッション情報を保存
    page.Context().StorageState(sessionFilePath)
}

func LaunchBrowser(headless bool, sessionFilePath string) (*playwright.Playwright, playwright.Browser, playwright.BrowserContext, error) {
    // ブラウザはインストール済みのものを使用するので、インストール処理はスキップする
    runOption := &playwright.RunOptions{
        SkipInstallBrowsers: true,
    }

    err := playwright.Install(runOption)
    if err != nil {
        return nil, nil, nil, fmt.Errorf("ブラウザの初期化に失敗しました: %w", err)
    }

    pw, err := playwright.Run()
    if err != nil {
        return nil, nil, nil, fmt.Errorf("ブラウザのインスタンスの起動に失敗しました: %w", err)
    }

    browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{
        Channel:  playwright.String("chrome"),
        Headless: playwright.Bool(headless),
    })
    if err != nil {
        return nil, nil, nil, fmt.Errorf("ブラウザの起動に失敗しました: %w", err)
    }

    // ログイン情報ファイルの存在確認
    var context playwright.BrowserContext
    if _, err := os.Stat(sessionFilePath); err == nil {
        // ファイルが存在する場合は、情報を読み込んでコンテキストを作成
        context, err = browser.NewContext(playwright.BrowserNewContextOptions{
            StorageStatePath: playwright.String(sessionFilePath),
        })
        if err != nil {
            return nil, nil, nil, fmt.Errorf("ログイン情報の復元に失敗しました: %w", err)
        }
    } else {
        // ファイルが存在しない場合は、ファイルを利用せずコンテキストを作成
        context, err = browser.NewContext()
        if err != nil {
            return nil, nil, nil, fmt.Errorf("コンテキストの作成に失敗しました: %w", err)
        }
    }

    return pw, browser, context, nil
}

セキュリティ上の注意点

Gitリポジトリから除外

ログイン情報ファイルをGit管理に含めないよう、.gitignoreに追加します。

# .gitignore
/session

その他の注意点

  • Cookieの有効期限が切れた場合、再度ログインが必要です。
  • ログイン情報ファイルは認証に関連する情報を含むため、他の人には共有しないでください。
Licensed under CC BY-NC-SA 4.0
Hugo で構築されています。
テーマ StackJimmy によって設計されています。