, не вводите жесткую информацию для входа в скрипт.

я проверю<input type="password"/> из моего сценария Tampermonkey и наблюдать изменения, используяchange обработчик для поля пароля, которое заполняется функцией диспетчера паролей в Chrome, значение остается пустым, пока я физически не выполню настоящий щелчок на странице. В своем скрипте я пробовал щелкать по странице, но Chrome знает, что это не настоящий щелчок. Когда я физически нажимаю на странице,change событие неожиданно срабатывает, поле пароля получает значение, и затем мой скрипт реагирует правильно (из-за наличияchange мероприятие). Но я написал этот сценарий, чтобы избежать необходимости взаимодействовать со страницей в первую очередь, так что это противоречит смыслу моего сценария.

Есть ли способ заставить TamperMonkey пометить страницу, как если бы пользователь взаимодействовал с ней (например, некоторые гипотетическиеGM_setUserTouched() или жеGM_autoFillPasswords() API), так что функция Менеджер паролей фактически заполняет<input type="password"/> без необходимости, чтобы я нажал на странице?

Фон

В Chrome это поведение описано в# 352527 комментарий 15, где поведение репортера неожиданно а также# 398805 где есть случай, когда Chrome не может реализовать поведение, которое я не хочу, Считается, что когда автозаполнение и встроенный в Chrome менеджер паролей заполняют форму, символы пароля отображаются пользователю в поле пароля, но DOMHTMLInputElement.value установлен в"", Когда пользователь взаимодействует со страницей, например, нажимая на нее или нажимая клавишу, Chrome изменяетHTMLInputElement.value содержать пароль иchange событие запускается в элементе. Причиной этого является «соображения безопасности» (например, если скрипт веб-сайта читал из элемента пароля, у него была бы возможность сделать это только в том случае, если пользователь просматривал страницу… так что всплывающие окна или невидимые фреймы не сможет сделать это или что-то?Я не уверен, от чего это вас защищает: когда пользователь взаимодействует со страницей, все сценарии в любом случае будут иметь доступ к паролю. И если плохие сценарии обслуживаются из того же происхождения, что и<input type="password"/>У самого сайта есть недостаток безопасности, а не у Chrome…).

Greasemonkey исторически имеетвспомогательные API и@grant Система, позволяющая usercript работать с такими проблемами. Редактировать: при создании репрограммы (ниже) я обнаружил, что Firefox делает пароль автозаполнения доступным для DOM, не дожидаясь, пока пользователь будет взаимодействовать с окном. Таким образом, Greasemonkey не нуженGM_forceAutofill() API, потому что Firefox не демонстрирует эту причуду Chrome. В результате Tampermonkey не имеет такого API.

репродукция

Поскольку люди не верят мне, когда я описываю поведение Chrome, я подготовил репродукцию. Требуется некоторая работа, чтобы привести Chrome в состояние, когда он еще не думал, что пользователь взаимодействовал со страницей, но вы должны увидеть то, что я вижу, используя эти шаги:

Откройте Chrome. Я использую Chrome 61.0.3163.91 64-разрядный на Windows 10.Перейдите кhttps://fiddle.jshell.net/xqfynp3e/22/show/light/Введите поддельное имя пользователя и пароль и нажмите ввод или нажмите кнопку. Chrome предложит вам сохранить пароль.Сохраните пароль.Откройте инструменты разработчика.Введите это в Консоль (чтобы перейти на страницу без случайного взаимодействия с ней):window.location.href = 'https://fiddle.jshell.net/xqfynp3e/22/show/light/?1'Бегатьdocument.querySelector('input[type=password]').value в консоли.Соблюдайте этопароль формыпоявляется быть заполненным визуально и все же читая элемент DOM в консоли, дает"".Нажмите в документе.Бегатьdocument.querySelector('input[type=password]').value снова в консоли.Соблюдайте этопароль формы не изменил внешний вид, но чтение элемента DOM в консоли позволяет получить поддельный пароль, который вы сохранили.

Повторяю мой вопрос: как я могу заставить Tampermonkey выполнить шаг «Кликни в документе»? Как сообщить автозаполнителю паролей в Chrome, что я взаимодействовал со страницей без физического взаимодействия со страницей?

РЕДАКТИРОВАТЬ: я нашел альтернативный способ безопасного хранения паролей в Chrome и доступа к ним через пользовательские скрипты с помощью автоматической поддержки посредничества веб-API Credentials:https://imgur.com/a/ts2W1

 binki18 сент. 2017 г., 19:50
@BrockAdams Да, я уверен. Chrome отображает поле паролябудто в нем есть значение для пользователя, но когда вы проверяете его в консоли, оно пустое. После «взаимодействия» со страницей,change События запускаются, и DOM внезапно имеет значение. Он задокументирован на трекере проблем Chrome как «функция безопасности». Я обновил свой вопрос с фоном
 binki19 сент. 2017 г., 05:39
@BrockAdams Пожалуйста, попробуйте предоставленную мной репродукцию, в которой я демонстрирую, что Chrome не выполняет автоматическое заполнение пароля до тех пор, пока он не «взаимодействует» со страницей. Вы можете легко просмотреть страницу, которую я использую для воспроизведения, чтобы увидеть, что на самой странице нет условия, препятствующего отображению пароля. И двух скриншотов может быть достаточно, чтобы убедить вас в том, что Chrome будетвизуально отображать предварительно заполненный пароль без фактического предварительного заполнения в представлении JavaScript DOM.
 binki18 сент. 2017 г., 19:53
@wOxxOm Я не ищу способ отправлять реальные события на страницу, обязательно. Просто API, чтобы сказать Chrome «эй, пользователь взаимодействовал с этой страницей таким образом, чтобы вызывать автозаполнение паролей». Если имитировать реальные события «ключ / мышь», это может быть приемлемым вариантом, если он запускает Chrome для автозаполнения пароля.
 binki18 сент. 2017 г., 19:52
@BrockAdams То, что вы можете устанавливать все больше и больше расширений в Chrome, например, менеджер паролей, не означает, что я хочу этого. Да, самому Chrome не хватает функции автоматического входа, поэтому я хочу реализовать простую глупую функцию с пользовательскими скриптами. Кроме того, Менеджер паролей Chrome синхронизируется с вашей учетной записью Google, вашим Android-устройством, мобильным приложением Chrome и т. Д. Он работает так хорошо, что я никогда не чувствовал необходимости тратить время на изучение сторонних вещей…
 wOxxOm17 сент. 2017 г., 23:12
Сама цельisTrusted Свойство события, установленное браузером для реальных взаимодействий, позволяет избежать сценариев, способных имитировать это.

Ответы на вопрос(1)

используя встроенное хранилище паролей Google, потому что, как вы сами заявили,Chrome требует взаимодействия с пользователем для включения таких паролей - как элемент безопасности.

В частности, Chrome требует событие сisTrusted свойство установлено вtrue, Tampermonkey не может обойти это, потому чтодаже расширения Chrome не могут установитьisTrusted свойство.

Смотрите также,этозапрос связанной функции с 2015 года.

Одним из решений является использование менеджера паролей, который заполняет эти поля без использования встроенного хранилища Google.
Доступно множество различных вариантов поддержки различных устройств и браузеров.

Или вы можете написать свой собственный скрипт Tampermonkey для заполнения этих полей, независимо от того, что хранится в Chrome.

Если вы пишете скрипт Tampermonkey, я рекомендую вам использоватьбезопасная структура хранения, не вводите жесткую информацию для входа в скрипт.

Ваш ответ на вопрос