やりたいこと
Puppeteerでの自動操作でログイン後のURLを取得したい
今出来ていること
PuppeteerでログインフォームにIDとPWを入力してログインボタンを押すまで。
躓いているところ
ログイン後に表示されるURLが表示されるまでの待機は可能だが、その際にURLの取得が出来ない。
環境
Windows10
node v12.16.0
Git v2.25.0
Nodist v0.9.1
puppeteer v2.1.1
コード
const puppeteer = require('puppeteer'); //URLハンドリング var http = require('http'); var fs = require("fs"); //urlオブジェクトを使えるようにする。 var url = require("url"); //初期設定 var url_loginpat = "url_login"; var url_acceptpat = "url_accept"; var url_codepat = "code="; var redirecturl = "" const loginID = "loginID" const Passwd = "PW" process.on('unhandledRejection', console.dir); ( async() => { // ブラウザ起動と設定 const browser = await puppeteer.launch({ // モード選択 / デフォルトtrue headless: false, // SSL証明書エラー無視する場合(オレオレ証明書など) "ignoreHTTPSErrors" : true, // 目視確認用に操作遅延(ms) "slowMo" : 200, // 他設定 args: [ // プロキシ使う場合はここ //'--proxy-server=192.168.100.252:8080', // Chromeウィンドウのサイズ '--window-size=800,650', // Chromeウィンドウのポジション '--window-position=100,50', '--no-sandbox' ] }); const page = await browser.newPage(); // 画面の大きさ設定 // Chromeのウィンドウ自体の大きさの調整ではないです //await page.setViewport({width: 1600, height: 950}); try { // 対象URLを開く タイムアウト 10000ms //await page.goto(process.argv[2], {waitUntil: 'networkidle2', timeout: 10000}); const response = await page.goto(process.argv[2], {waitUntil: 'networkidle2'}); for(const req of response.request().redirectChain()) { //console.log(`${req.url()} => ${req.response().headers().location}`); //console.log("リクエストURL"); //console.log(`${req.url()}`); //console.log("リダイレクトURL"); //console.log(`${req.response().headers().location}`); redirecturl = `${req.response().headers().location}`; } //①ログインページの場合 if(redirecturl.indexOf(url_loginpat) > -1){ //テスト確認用 // OSがWindowsなら"USERPROFILE", Mac, Linuxは"HOME"を参照 //var dir_home = process.env[process.platform == "win32" ? "USERPROFILE" : "USERPROFILE"]; //var dir_desktop = require("path").join(dir_home, "Desktop"); //var file_fullpath = dir_desktop + "/out.txt"; //var text = "ログインページです"; //fs.writeFileSync(file_fullpath, text); console.log('ログインページ'); //メールアドレスの入力 await page.type('input[name="LOGIN_ID"]', loginID,0); //次へボタン await page.click('button#nextbtn') //パスワードの入力 await page.type('input[name="PASSWORD"]', Passwd,0); //サインインボタン await page.click('button#nextbtn'); //コード発行待ち(ページ遷移待ち) await page.waitForNavigation(1500); } //②ログインはパスされ、OAuth認証許可の場合 if(redirecturl.indexOf(url_acceptpat) > -1) { } //③①②のページに行かず、APIコードの場合 ////→理想は③で常に動くなるようになる //console.log(page.title); } catch (e) { // エラー出力 console.log("キャッチのエラーです"); console.log(e); // ブラウザを閉じて終了 await browser.close(); process.exit(200); } // ブラウザを閉じて終了 await browser.close(); })();
知見をお持ちの方がおりましたら、
ぜひお力を貸していただけますでしょうか?
あなたの回答
tips
プレビュー