Android JavaScript 自动完成表单 WebView
Android JavaScript autocomplete form WebView
使用此代码,我可以轻松地将用户名和密码自动粘贴到 facebook.com
目的是为用户选择的每个站点自动粘贴用户名和密码。许多应用程序都这样做,但我还没有找到方法。感谢您的帮助
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
progressBar.setVisibility(View.GONE);
String user = "user";
String pwd = "pass";
view.loadUrl("javascript:(function(){document.getElementsByName('email')[0].value='"
+ user
+ "';document.getElementsByName('pass')[0].value='"
+ pwd + "';document.getElementsByTagName('form')[0];})()");
}
您的代码目前在 facebook.com 中有效。但是当引入多个站点时,您应该对那些特定站点实施 URL 检查,因为您不应该 运行 WebView 上所有可能的脚本以及所有用户名和密码。例如
if(url.contains("facebook.com")){ your facebook username & password injection code here }
多个脚本来自这样一个事实,即并非每个页面都对登录元素使用相同的元素名称/ID。
如果你想让它在其他网站上工作,你需要单独检查和定义这些网站(在你的应用程序内)以查看元素使用的名称/ID(据我所知,没有办法找到登录表单自动从不同的站点),然后为每个站点进行相同类型的注射。
作为额外提示,您还可以简化 JavaScript,因为您可能不会在同一页面加载中再次调用该函数。
view.loadUrl("javascript:document.getElementsByName('email')[0].value='"+ user+ "';document.getElementsByName('pass')[0].value='"+ pwd + "';document.getElementsByTagName('form')[0];");
正如 Speditz 所说,并非每个登录页面都使用相同的 name
/ id
元素。
一般来说,大部分网站都是使用type="email"
或type="text"
作为用户名,type="password"
作为密码登录,你可以做一些字段存在检查并在网页加载后执行注入
view.loadUrl(
"javascript:window.onload= (function(){"
+ "var selectElementName = document.querySelector('input[type=\"email\"]');"
+"if(selectElementName){selectElementName.value = \"" + user + "\";}"
+"var selectElementName = document.querySelector('input[type=\"text\"]');"
+"if(selectElementName){selectElementName.value = \"" + user + "\";}"
+"var selectElementpassword = document.querySelector('input[type=\"password\"]');"
+"if(selectElementpassword){selectElementpassword.value = \"" + pwd + "\";}"
+"})();"
);
为了更容易理解,这是在JavaScript上面的纯文本:
window.onload= function(){
var selectElementName = document.querySelector('input[type="email"]');
if(selectElementName){selectElementName.value = "username";}
var selectElementName = document.querySelector('input[type="text"]');
if(selectElementName){selectElementName.value = "username";}
var selectElementpassword = document.querySelector('input[type="password"]');
if(selectElementpassword){selectElementpassword.value = "password";}
};
使用此代码,我可以轻松地将用户名和密码自动粘贴到 facebook.com
目的是为用户选择的每个站点自动粘贴用户名和密码。许多应用程序都这样做,但我还没有找到方法。感谢您的帮助
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
progressBar.setVisibility(View.GONE);
String user = "user";
String pwd = "pass";
view.loadUrl("javascript:(function(){document.getElementsByName('email')[0].value='"
+ user
+ "';document.getElementsByName('pass')[0].value='"
+ pwd + "';document.getElementsByTagName('form')[0];})()");
}
您的代码目前在 facebook.com 中有效。但是当引入多个站点时,您应该对那些特定站点实施 URL 检查,因为您不应该 运行 WebView 上所有可能的脚本以及所有用户名和密码。例如
if(url.contains("facebook.com")){ your facebook username & password injection code here }
多个脚本来自这样一个事实,即并非每个页面都对登录元素使用相同的元素名称/ID。
如果你想让它在其他网站上工作,你需要单独检查和定义这些网站(在你的应用程序内)以查看元素使用的名称/ID(据我所知,没有办法找到登录表单自动从不同的站点),然后为每个站点进行相同类型的注射。
作为额外提示,您还可以简化 JavaScript,因为您可能不会在同一页面加载中再次调用该函数。
view.loadUrl("javascript:document.getElementsByName('email')[0].value='"+ user+ "';document.getElementsByName('pass')[0].value='"+ pwd + "';document.getElementsByTagName('form')[0];");
正如 Speditz 所说,并非每个登录页面都使用相同的 name
/ id
元素。
一般来说,大部分网站都是使用type="email"
或type="text"
作为用户名,type="password"
作为密码登录,你可以做一些字段存在检查并在网页加载后执行注入
view.loadUrl(
"javascript:window.onload= (function(){"
+ "var selectElementName = document.querySelector('input[type=\"email\"]');"
+"if(selectElementName){selectElementName.value = \"" + user + "\";}"
+"var selectElementName = document.querySelector('input[type=\"text\"]');"
+"if(selectElementName){selectElementName.value = \"" + user + "\";}"
+"var selectElementpassword = document.querySelector('input[type=\"password\"]');"
+"if(selectElementpassword){selectElementpassword.value = \"" + pwd + "\";}"
+"})();"
);
为了更容易理解,这是在JavaScript上面的纯文本:
window.onload= function(){
var selectElementName = document.querySelector('input[type="email"]');
if(selectElementName){selectElementName.value = "username";}
var selectElementName = document.querySelector('input[type="text"]');
if(selectElementName){selectElementName.value = "username";}
var selectElementpassword = document.querySelector('input[type="password"]');
if(selectElementpassword){selectElementpassword.value = "password";}
};