Puppeteerで途中でユーザに入力してもらうようにする

日本の情シスはMicrosoft365然り、G Suite然り、20年前の知識を持ってあらゆる制限を掛けることがお仕事と思ってる人達が居たりします。その結果として、各種APIが用意されているにも関わらず制限し、ユーザの業務効率化を妨げる悪の枢軸になってたりします。

さて、そんな制限が掛けられている場合に仕方ないのでウェブ自動化を使うのにPupppeteerを使って操作をするのが、業務効率化で残された手段の1つになります。今回は、outlook.comにログイン部分はユーザに行わせて、そこから先を自動化するといった手法を実現してみます。

今回使用するライブラリ等

今回はログイン部分はユーザが行うので、promptsは利用しません(サンプルのEXEでは使用しています)。

今回のウェブページアクセス上の問題点

Microsoft365のログインページは少々特殊な作りになっていて、今回ユーザにあえてパスワードの部分だけは入力させるために待たせるようにしています。

  1. メールアドレス入力⇒ボタンクリック⇒パスワードを入力して⇒ボタンクリックでログイン出来る仕様です(どちらもボタンのIDは同じ)
  2. パスワード欄だけはユーザが入力し、サインインを実行するまで、Puppeteerは待機させます。
  3. 無事にログインが完了したら、自動実行の続きを行います。
  4. Outlookからサインイン出来ても、別のURLを実行した場合セッションが切れるので、必ずクリックさせて移動させる必要があります。
  5. 最終的には予定表画面へと遷移させます。

図:パスワード画面で一時停止。ユーザの入力を待つ

ソースコード

冒頭部分

  • mail変数の部分にメールアドレスを事前に入力しておく必要があります。
  • グローバル変数でデスクトップのパスを取得しておきます。
  • つづけて、getprompt()を実行してユーザの入力を受付待ちします。
  • chromeはいつもの「C:\Program Files (x86)\Google\Chrome\Application\chrome.exe」ではなく、「C:\Users\ユーザー名\AppData\Local\Google\Chrome\Application\chrome.exe」となるため、ユーザ毎のパスを取得して、chromepathに格納する

Puppeteer部分

  • 普通にメアドだけこれまで通り入力させる
  • パスワード画面で一時停止。ユーザにパスワードを入力してもらう。
  • サインインのボタンのIDはChrome Developer Toolで探索するとidSIButton9がそれだとわかります。
  • この時、サインインボタンにwaitEvent関数にて、exposeFunctionメソッドにてfuncmanという関数を作ってChromeに送り込み、サインインボタンにイベントを追加で割り当てます。
  • サインインボタンをクリックすると、funcmanが実行されて、resolveにてresult_input変数へと返されます。
  • その後、予定表ボタンをクリックして、カレンダーを表示して終了
  • Microsoft365全般の操作や、Dynamics、他の作業から連動させてカレンダーにイベント登録、Teamsへの投稿、Sharepointへの投稿などに繋げられるのではないかと思います。本来はGraph APIで素早く実現できるんですが・・・・
  • このコードは単発のPuppeteerで使うよりは、Electronなどのアプリに組み込んで使うと効果があると思います。
  • Graph APIよりもOAuth2.0認証の実装をせずに済む点でもメリットがあると言えます。
  • また、ID/PWは自動入力としても、変動する二段階認証の数値などを入力する画面などで活躍すると思います。

単一実行ファイルを作成する

Node.js 18よりSingle executable applicationsという機能が装備され、標準で単独実行ファイルが作成できるようになりました。結果pkgはプロジェクト終了となっています。よって、以下のエントリーの単一実行ファイルを作成するを参考に、Node18以降はexeファイルを作成することが可能です。

Puppeteerを使ってX(旧Twitter)へのポストを自動化する

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)