質問: ●実現したいこと ツールやアプリ等は使わずに、chromeのブックマークマーク登録を自動で行えるようにしたいです。 ※batファイルとjavascript を使用して作成してみました。 javascript 初心者です。 ●自動化したい操作 1chromeの起動 2Googleへログイン(URL表示) 3ブックマークに登録するタイトルを入力 4 3の名前でブックマーク登録(登録フォルダの振り分けを行う) 5完了メッセージ出力 ●試した事 batファイルとjavascriptはブックマークレットを使用して、部分的に実装しました。 1chromeの起動は、batファイルを作成しました。 ``` @echo off start chrome.exe ``` 2googleへログイン ``` //ログイン javascript:location.href="https://〜ログイン画面URL〜"; ``` ``` //ID入力 javascript:(function(){n=document.getElementsByName("identifier"); n.item(0).value="Googleアカウント";})();document.getElementById("identifierNext").click(); ``` ``` //PW入力 javascript:(function(){n=document.getElementsByName("password"); n.item(0).value="Googleパスワード";})();document.getElementById("passwordNext").click(); ``` 3ブックマークに登録する名前を入力 ``` javascript:window.prompt("番号を入力"); javascript:window.prompt("名前を入力"); ``` 5完了メッセージ ``` javascript:alert("登録完了"); ``` ●困っていること 部分的に再現する事は出来ましたが、これらをどのように繋げて一つの動作にしたらいいか分かりません。 Googleログイン時の、アカウント入力とPW入力をひとつのブックマークレットに登録してみましたが、アカウント入力で止まってしまい、PW入力までいきませんでした。 また、ブックマークにどのように登録したらいいのか分かりません。 イメージは、ブックマークフォルダの階層 その他のブックマーク 階層1 I—モバイルのブックマーク 階層 2 lー 登録フォルダ 階層3 lー1番目・・ここに登録 階層3 lー2番目・・ここに登録 →入力した番号の頭文字と同じ番号フォルダにブックマーク登録する 番号入力に 143 と入力 名前入力に テスト と入力 →1番目のフォルダに、『 143 テスト』という名前でブックマークします。 chrome起動から自動化出来るのが理想ですが、chromeのブックマークレットを一つ起動すると、登録が行える仕組みでも構いません。 この方法で実装するにはどのようにしたらいいのかご存知でしたら、教えて頂けますでしょうか。 また他に良い方法があるようでしたら教えてください。
回答: ### まず初めに **ChromeではJSによるブックマーク登録はサポートしていません。** また、**ページ遷移先で、遷移元やブックマークレットによるJSを実行するのは難しい**と思います。 (あくまでもGoogleのログインページについてからブックマークレットを実行しなければらなない) ###### よって本回答では、以下想定の元コードを記載いたしますので、使えそうな部分があれば参考にしてください。 * Googleログインページについてからブックマークレットを実行 * 自動でログインするだけ ### パスワードが入力されない理由 GoogleのログインページはIDとパスワードでページが分かれているようです。 非同期等が原因になり、ページ更新される前にパスワードが入力されてしまっています。 但し、ID入力画面からパスワード入力画面のページ遷移は、あくまでもDOM操作とURL操作が伴うだけで、実際にはページが遷移した訳ではなくそう見えるだけなので、JavaScriptを2ページまたいで使えます ### ID入力ページ→パスワード入力ぺージ間の画面更新を待つ ``` const inputPassword = function() { const n = document.getElementsByName("password"); n.item(0).value = password; document.getElementById("passwordNext").click(); } const secondWait = function(){ const secondWaitInterval = setInterval(function() { if (location.href.indexOf("https://accounts.google.com/signin/v2/sl") === 0) { inputPassword(); clearInterval(secondWaitInterval); } }, 300) } const inputAccount = function() { const n = document.getElementsByName("identifier"); n.item(0).value = account; document.getElementById("identifierNext").click(); secondWait(); } const firstWait = function(){ const firstWaitInterval = setInterval(function() { if (location.href.indexOf("https://accounts.google.com/signin/v2/identifier") === 0) { inputAccount(); clearInterval(firstWaitInterval); } }, 300) } const account = "Googleアカウント"; const password = "Googleパスワード"; //ダメだった location.href = "https://www.google.com/accounts?hl=ja-JP"; firstWait(); ``` ### コールバック地獄バージョン ``` const account = "Googleアカウント"; const password = "Googleパスワード"; const firstWaitInterval = setInterval(function() { if (location.href.indexOf("https://accounts.google.com/signin/v2/identifier") === 0) { clearInterval(firstWaitInterval); const id = document.getElementsByName("identifier"); id.item(0).value = account; document.getElementById("identifierNext").click(); const secondWaitInterval = setInterval(function() { if (location.href.indexOf("https://accounts.google.com/signin/v2/sl") === 0) { clearInterval(secondWaitInterval); const pw = document.getElementsByName("password"); pw.item(0).value = password; document.getElementById("passwordNext").click(); } }, 300) } }, 300) ``` ### ブックマークレット変換サイト ※IDとパスワードのURIエスケープが必要だと思うのでご自身で変換をお願いします。 ### 追記 postMessageやWeb Messaging API等を使い、iframeや子Windowsを使いクロスドメインをまたいだJSの実行を行えば、Googleにログインする事はできなくないかもしれませんが、不正アクセスみたいで少しナンセンスと思い記載しておりません。