安卓端使用网页方式登录百度

2016-10-03 - 3,433 Views - 0 Goods - 4 条评论

Update:2016-10-11
对贴吧uwp进行抓包发现对于客户端登录,百度提供了一个接口,登录成功后会获得所有你需要的信息
登录接口:

https://wappass.baidu.com/passport/login?clientfrom=native&tpl=tb&login_share_strategy=silent&client=ios&adapter=3&act=implicit&loginLink=0&smsLoginLink=0&lPFastRegLink=0&lPlayout=0&is_voice_sms=1

登录成功后会获得这种格式的信息sapi://loginSucceed/{"..."}
于是对代码进行了重写
重写shouldOverrideUrlLoading()方法

    @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if(url.startsWith("sapi://loginSucceed")){
                    BDUSS=url.substring(url.indexOf("<bduss>")+7,url.indexOf("</bduss>"));
                    uid=url.substring(url.indexOf("<uid>")+5,url.indexOf("</uid>"));
                    SharedPreferences sp = getApplicationContext().getSharedPreferences("BDUSS", MODE_PRIVATE);
                    SharedPreferences.Editor editor = sp.edit();
                    editor.putString("BDUSS", BDUSS);
                    editor.putString("ID", uid);
                    editor.commit();
                    startActivity(new Intent(WebLoginActivity.this,MainActivity.class));
                    finish();
                }else if(url.startsWith("http"))
                    webView.loadUrl(url);
                return true;
            }

有了接口实现起来就是方便,也不至于像上次那样绕一大圈image_emoticon22

- - - - - - - - - - - - - - - - - - - - - - -分割线- - - - - - - - - - - - - - - - -- - - - - - - - -
背景
最近偶然发现之前写到一半的百度贴吧登录接口挂了,于是就借这个机会重启这个项目。
看了一下百度系的产品好像都换成网页登陆了,我就想我也直接用网页的算了。

过程
百度账号的登录无非就是获取BDUSS和uid这两个东西了,好像没什么难度,那就开始做了。
既然是用网页登录,那就要用的WebView了。
最开始的时候,我是想直接从webview获取response,里面肯定有BDUSS
于是重写了onPageStarted(WebView view, String url)这个方法,使用HttpRequest来访问url,再使用loadData(String data)来使网页显示出来。刚开始好像很顺利,但后来真机调试的时候出问题了,网页乱码了。网页编码是utf-8的,我用的是loadData(data,"text/html","utf-8"),然而就是乱码。后来去网上找了一下,发现要用loadData(data,"text/html;charset=utf-8",null)。没搞懂是怎么回事,官方sdk文档里就是按第一种使用,可就是乱码。
解决完这个问题,网页也正常显示了,以为很快就能解决了。我还是太天真image_emoticon12
又出现了一个奇葩的问题”The 'Access-Control-Allow-Origin' header has a value that is not equal to the supplied origin.“
据说是网页跨域访问问题,没仔细研究过网页方面,不是很懂,去网上找到了两个解决方案
1.在webview setting中加入这一句

settings.setAllowUniversalAccessFromFileURLs(true);

然并卵
2,在服务端加入header("Access-Control-Allow-Origin: *")。可是服务器是度娘的image_emoticon1
没办法,只能放弃这个方案了
然后就去翻sdk文档,无意中发现了webkit里有CookieManager这东西。这就好办了,当初怎么没想到取cookie,取什么response,蠢哭了image_emoticon22

正文
重写onPageFinished(WebView view, String url)

        @Override
        public void onPageFinished(WebView view, String url){
            cookieManager = CookieManager.getInstance();
            String cookie = cookieManager.getCookie(url);
            Log.e("cookie",cookie);
            super.onPageFinished(view, url);
        }

成功取到BDUSS
你以为这就结束了?naiveimage_emoticon16还有uid呢
我找了半天没找到uid,这坑爹的百度image_emoticon6
后来在登录成功跳转到百度首页后才找到了uid。可是webview取不到html内容啊
这时候就需要java去调用js代码来获得uid了
首先定义一个class
ps:JSCallBack是我的在获取id后通知界面更新用的

public class JavaScriptInterface {
    private String id;
    private JSCallBack jsCallBack;

    public JavaScriptInterface(JSCallBack jsCallBack) {
        this.jsCallBack=jsCallBack;
    }

    @JavascriptInterface
    public void getHtml(final String html){
        id=html.substring(0,html.length()-7);
        Log.e("id",id);
        if (id!=null){
            jsCallBack.setId(id);
        }

    }
}

实现JSCallBack

        jsCallBack=new JSCallBack() {
            @Override
            public void setId(String id) {
                SharedPreferences sp = getApplicationContext().getSharedPreferences("BDUSS", MODE_PRIVATE);
                SharedPreferences.Editor editor = sp.edit();
                editor.putString("ID", id);
                editor.commit();
                cookieManager.removeAllCookie();
                startActivity(new Intent(WebLoginActivity.this,MainActivity.class));
                finish();
            }
        };

然后向js暴露你的这个类

JavaScriptInterface getID=new JavaScriptInterface(jsCallBack);
webView.addJavascriptInterface(getID,"getID");

然后重写onPageFinished(WebView view, String url)

@Override
public void onPageFinished(WebView view, String url) {                
    view.loadUrl("javascript:window.getID.getHtml(document.getElementById('commonBase').getAttribute('data-pid'))");
    super.onPageFinished(view, url);
}

成功获得uidimage_emoticon22

瞎扯
之前做贴吧碰到了一个比较棘手的问题,有一个模块虽然说实现了功能,但用户体验很差,我都用不下去。正好那时有点别的事情,贴吧就暂时搁置了。现在虽说重启了贴吧,但是我估计我不会有很多时间来做,但我会尽量把他做完,毕竟当初选择软件工程有一部分原因是想做出一个第三方贴吧客户端。
最后来晒张图吧huaji
screenshot_20161003-172905
screenshot_20161003-215739

转载请注明原文链接:首页 -> 学习记录 -> Android学习记录 -> 安卓端使用网页方式登录百度

FuZhou . FuJian

"Never start something you're not willing to finish"