Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Goでブラウザ業務を自動化する

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for shuntaka shuntaka
September 18, 2018
2.4k

 Goでブラウザ業務を自動化する

Avatar for shuntaka

shuntaka

September 18, 2018
Tweet

More Decks by shuntaka

Transcript

  1. 使い方(ドライバーの作成、起動) // driverを定義 var driver *agouti.WebDriver // ブラウザにchromeを指定して起動(自動操作したいブラウザを指定) driver =

    agouti.ChromeDriver(agouti.Browser("chrome")) if err := driver.Start(); err != nil { log.Fatalf("Faild to start driver %v\n", err) } // 関数終了時、ブラウザ終了 defer driver.Stop()
  2. 続き(ページ遷移) // 先程のdriverから、ページを取得 page, err := driver.NewPage() if err !=

    nil { log.Fatalf("Faild to return page %v\n", err) } // Googleに遷移 if err := page.Navigate("https://www.google.com/"); err != nil { log.Fatalf("Faild to open page %v\n", err) }
  3. headlessモード(ブラウザ非表示モード) // non-headless driver = agouti.ChromeDriver(agouti.Browser("chrome")) // headless driver =

    agouti.ChromeDriver( agouti.Browser("chrome"), agouti.ChromeOptions( "args", []string{"--headless", "--disable-gpu"}), )
  4. フォーム処理・ログイン処理方法 // ログイン画面遷移 if err := page.Navigate("https://login..."); err != nil

    { log.Fatalf("driver停止エラー:%v", err) } // ユーザー名入力・ボタン押下 page.FindByClass("input-text").Fill(conf.Gsuite.User) page.FindByClass("input-button").Click() // パスワード入力・ボタン押下 page.Find("#password").Fill(conf.Gsuite.Password) page.FindByClass("input-button").Click() 指定したタグに、値を入力 指定したタグをクリック タグを指定
  5. パラレル実行(フォーム入力・申請) wg := &sync.WaitGroup{} filDay := time.Now() // 1週間分の申請をパラレルに実行 for

    i := 0; i < 5; i++ { go func(day string) { wg.Add(1) Fillday(day) wg.Done() }(filDay.Format("20060102")) filDay = filDay.AddDate(0, 0, 1) // 日付を加算 } wg.Wait() ※イメージ 日付(引数指定)のサーバー利用申請してくれる関数
  6. // 領収書のポップアップ表示されるボタンタグを押下 page.Find("#contentInner > div.table-history > p > a").Click() //

    ポップアップにウィンドウを遷移 page.NextWindow() // スクリーンショットを取得 page.Screenshot(imgfolder + "/" + baseobj.Start + ".png") // 元のウィンドウに戻る page.NextWindow() スクリーンショット機能 保存するパス・ファイル名を指定
  7. 最後に画像エンコード処理を実行 合成後の画像サイズ 5月の領収書画像 out, _ := os.Create("out.png") // エンコード png.Encode(out,

    rgba) /* (0,0)-(670,654) 201701.png (670,0)-(1340,654) 201702.png (0,654)-(670,1308) 201803.png … */ rgba 6月の領収書画像 3月の領収書画像 4月の領収書画像 1月の領収書画像 2月の領収書画像 x y