aisenWeibo登录流程

微博登录
界面启动后执行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;
        }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。