微博登录
界面启动后执行LoadHtmlTask 看看他做了什么
读取oauth.js,替换变量
String js = FileUtils.readAssetsFile("oauth.js", GlobalContext.getInstance());
js = js.replace("%username%", mAccount).replace("%password%", mPassword);
oauth.js里面有2个js方法,fillAccount看起来是做自动登录操作的,getAccount方法后面分析
function fillAccount() {
document.getElementById("userId").value ='%username%';
document.getElementById("passwd").value ='%password%';
document.getElementById("submit").click();
}
function getAccount() {
window.loginjs.setAccount(document.getElementById("userId").value, document.getElementById("passwd").value);
}
接下来用Jsoup读取网页,微博登录的网址如下
https://api.weibo.com/oauth2/authorize?client_id=2362431378&scope=friendships_groups_read,friendships_groups_write,statuses_to_me_read,follow_app_official_microblog&redirect_uri=http://boyqiang520.s8.csome.cn/oauth2/&display=mobile&forcelogin=true
把上面读出的oauth.js注入到网页,再给网页的用户名密码输入框加入事件监听getAccount。
Document dom = Jsoup.connect(url).get();
String html = dom.toString();
html = html.replace("<html>", "<html id='all' >").replace("</head>", js + "</head>").replace("action-type=\"submit\"", "action-type=\"submit\" id=\"submit\"");
// 通过监听input标签的oninput事件,来获取账户密码
// onchange是value改变,且焦点改变才触发
// oninput是value改变就触发
try {
dom = Jsoup.parse(html);
Element inputAccount = dom.select("input#userId").first();
inputAccount.attr("oninput", "getAccount()");
Element pwdAccount = dom.select("input#passwd").first();
pwdAccount.attr("oninput", "getAccount()");
Logger.d(TAG, inputAccount.toString());
Logger.d(TAG, pwdAccount.toString());
html = dom.toString();
Logger.d(TAG, "添加input监听事件");
} catch (Throwable e) {
e.printStackTrace();
}
在WebView初始化的地方会这增加个js对象loginjs,getAccount会调用这个对象,其实就是调用的就是LoginJavaScriptInterface。
mWebView.addJavascriptInterface(new LoginJavaScriptInterface(), "loginjs");
final class LoginJavaScriptInterface {
public LoginJavaScriptInterface() {
Logger.d(TAG, "new LoginJavaScriptInterface()");
}
@JavascriptInterface
public void setAccount(String account, String password) {
Logger.d(TAG, "account = %s, password = %s", account, password);
mAccount = account;
mPassword = password;
}
}