1
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 3 years have passed since last update.

chromedp で Chrome を見える状態(not headless)で起動して、かつ終了しないようにする

Posted at

銀行とかのサイトで 1password でもログインできないようなサイトに対して(セキュリティカードでの追加の認証が必要とか)、chromedp を使ってプログラム上から ID/PASS やそのほか認証情報を渡して自動でログインするやり方を思いついた。ブラウザ拡張作るやり方でもいいんだけど。
大昔は C++ で CComPtr 使いながらひたすら QueryInterface して COM で IE 操作してたけど、今となっては Puppeteer/Playwright とか Go なら chromedp とかがあるのでこちらを利用することにした。

自動ログインを行うには、Chrome が headless ではない状態(否定語の連続で分かりにくい)で起動し、プログラムの終了後も Chrome が閉じないようにすればいいので、次のようにすることで要件を満たすことができた。

main.go
package main

import (
	"context"
	"log"

	"github.com/chromedp/chromedp"
)

func main() {
	opts := append(chromedp.DefaultExecAllocatorOptions[:],
		chromedp.Flag("headless", false), // headless=false に変更
		chromedp.Flag("disable-gpu", false),
		chromedp.Flag("enable-automation", false),
        chromedp.Flag("disable-extensions", false),
        chromedp.Flag("hide-scrollbars", false),
        chromedp.Flag("mute-audio", false),
	)

	// allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
    // defer cancel()
    // ↓に書き換えた
    allocCtx, _ := chromedp.NewExecAllocator(context.Background(), opts...) // cancel() を呼ばないように変更

	// ctx, cancel := chromedp.NewContext(allocCtx, chromedp.WithLogf(log.Printf))
    // defer cancel()
    // ↓に書き換えた
    ctx, _ := chromedp.NewContext(allocCtx, chromedp.WithLogf(log.Printf)) // cancel() を呼ばないように変更

	// navigate to a page, wait for an element, click
	var example string
	err := chromedp.Run(ctx,
		chromedp.Navigate(`https://golang.org/pkg/time/`),
		// wait for footer element is visible (ie, page is loaded)
		chromedp.WaitVisible(`body > footer`),
		// find and click "Expand All" link
		chromedp.Click(`#pkg-examples > div`, chromedp.NodeVisible),
		// retrieve the value of the textarea
		chromedp.Value(`#example_After .play .input textarea`, &example),
	)
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("Go's time.After example:\n%s", example)
}

chromedp.Flag("headless", false) で head モードにしているのと、Context#cancel を呼び出さないようにしているのがポイント。
というのも、Context#cancel のタイミングで Chrome を閉じるようにしているらしい。

参考:chromedpでGopherのための自動化を目指す

これを元にいろいろ自動ログインするプログラムを作ろうと思う。

1
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
1
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?