1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 腾讯微博Android客户端开发——自动获取验证码

腾讯微博Android客户端开发——自动获取验证码

时间:2018-09-14 20:46:57

相关推荐

腾讯微博Android客户端开发——自动获取验证码

上一节给大家讲解通过调用android系统自带的浏览器进行授权认证的,使用该种方式能很容易的完成认证,但是该种方式有个弊端,也就是如果使用第三方的浏览器如UC、天天等,输入完QQ账号信息点击“授权”后并不能再次跳转到MainActivity,导致我们的认证失败。这个问题应该是非常严重的问题,因为大部分用户都会选择第三方的浏览器作为默认的浏览器。本次给大家讲解自动获取验证码的第二种解决方案,克服上一种方法的缺陷。

第二种解决方案的主角就是我们的WevView控件,我们可以使用WebView控件来进行浏览器的操作,而不使用系统或者第三方的浏览器。

1.首先创建一个Activity,命名为WebViewActivity,该Activity种只包含一个WevView控件:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<WebView

android:id="@+id/web"

android:layout_height="wrap_content"

android:layout_width="wrap_content"

/>

</ScrollView>

2.在MainActivity种添加一个Button,用于启动WebViewActivity:

String url = "https://open./cgi-bin/authorize";

Weibo weibo = new Weibo();

//修改getRequestToken()方法,返回结果为HashMap

Map<String, String> map = weibo.getRequestToken();

//获取oauth_token

oauthToken = map.get("oauth_token");

oauthTokenSecret = map.get("oauth_token_secret");

Log.i(TAG, "Request Token="+oauthToken);

Log.i(TAG, "Request Token Secret="+oauthTokenSecret);

//有些时候获取oauth_token失败,因此再次获取

if (TextUtil.isEmpty(oauthToken))

{

getVerifier();

return;

}

//构造请求的URL

StringBuilder urlBuilder = new StringBuilder();

urlBuilder.append(url);

urlBuilder.append("?");

urlBuilder.append("oauth_token="+oauthToken);

Intent intent = new Intent(MainActivity.this,WebViewActivity.class);

Bundle bundle=new Bundle();

bundle.putString("url", urlBuilder.toString());

intent.putExtras(bundle);

//启动WebViewActivity

startActivity(intent);

3.给WebViewActivity的onCreate添加如下代码,进行浏览器的初始化:

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.webview);

WebView webView = (WebView) findViewById(R.id.web);

Intent intent = this.getIntent();

if (!intent.equals(null))

{

Bundle bundle = intent.getExtras();

if (bundle != null)

{

if (bundle.containsKey("url"))

{

String url = bundle.getString("url");

WebSettings webSettings = webView.getSettings();

// 支持JavScript

webSettings.setJavaScriptEnabled(true);

webSettings.setSupportZoom(true);

webView.requestFocus();

webView.loadUrl(url);

Log.i(TAG, "WebView Starting....");

}

}

}

}

此时如果我们运行模拟器,点击按钮启动WebViewActivity按钮后,运行效果和启动浏览器差不多,我们输入QQ账户信息,点击“授权”,如果callback为空,则Activity会显示授权码。

4.下面我们需要处理的就是如何自动获取授权码。我们知道WebView是支持JavaScript,我们可以通过JavaScript进行授权码的获去,在onCreate()方法中添加如下代码

//绑定java对象到JavaScript中,这样就能在JavaScript中调用java对象,实现通信。

//这种方法第一个参数就是java对象,第二个参数表示java对象的别名,在JavaScript中使用

webView.addJavascriptInterface(new JavaScriptInterface(), "Methods");

WebViewClient client = new WebViewClient()

{

/**

* 回调方法,当页面加载完毕后执行

*/

@Override

public void onPageFinished(WebView view, String url)

{

Log.i(TAG, "WebView onPageFinished");

//执行获取授权码的JavaScript

view.loadUrl("javascript:window.Methods.getHTML('<head>'+document.getElementsByTagName('body')[0].innerHTML+'</head>');");

super.onPageFinished(view, url);

}

};

webView.setWebViewClient(client);

其中JavaScriptInterface类是进行js处理的类:

class JavaScriptInterface

{

private static final String TAG = "MainActivity";

public void getHTML(String html)

{

Log.i(TAG, html);

String verifier = getVerifier(html);

if (!TextUtil.isEmpty(verifier))

{

Log.i(TAG, "verifier:"+verifier);

}

}

public String getVerifier(String html)

{

String ret = "";

String regEx = "授权码:[0-9]{6}";

Pattern p = pile(regEx);

Matcher m = p.matcher(html);

boolean result = m.find();

if (result)

{

ret = m.group(0).substring(4);

}

return ret;

}

}

getVerifier()方法是通过正则表达式进行授权码的查找,该正则表达式是根据腾讯微博开放平台返回验证码的html源文件进行设置:

<head>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<meta name="viewport"

content="minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0, width=device-width, user-scalable=no">

<title></title>

<link href="/style/oauth/mobel.css" rel="stylesheet" type="text/css">

<style>

* {

TEXT-DECORATION: none;

}

</style>

<script type="text/javascript">

var step = 0;

var sub = 0;

function callback(){

}

function cl(){

sub = 0;

document.getElementById('errCode').innerHTML = '你拒绝了授权此应用访问你的腾讯微博帐户,将不能使用此应用功能。';

document.getElementById('errCode').style.display = 'block';

var c = document.getElementById('conter');

var ql = document.getElementById('loginform');

c.removeChild(ql);

}

function changeimg(){

var i = document.getElementById('imgVerify');

i.src = ".jpg?d="+step;

step++;

/*

i.innerHTML = '';

window.setTimeout(function(){i.innerHTML = '<img id="imgVerify" width="130" height="53" src=".jpg" οnclick="changeimg();" />';},200);

*/

}

function subForm(){

var u = document.getElementById('u');

var p = document.getElementById('p');

if(u.value != '' && p.value!=''){

document.getElementById('login_btn').disabled= true;

}else{

return false;

}

}

function subForm1(){

var u = document.getElementById('u');

var p = document.getElementById('p');

var v = document.getElementById('v');

if(u.value != '' && p.value!='' && v.value != ''){

document.getElementById('login_btn').disabled= true;

}else{

return false;

}

}

</script>

</head>

<body id="body">

<div id="header">

<a href="http://open."></a>

<p></p>

</div>

<div id="headerTxt">

<h1>

授权使用腾讯微博帐号

</h1>

<cite>授权后 <span>Android开发</span> 将可访问并使用你的微博帐号</cite>

</div>

<div id="conter">

<ul>

<li>

授权码:240547

</li>

</ul>

</div>

<div id="info">

<p>

腾讯官方授权页面不允许第三方内嵌或伪造

</p>

<p>

授权页面地址为http://open.开头。

</p>

<p>

授权后,在第三方网站的活动应继续遵守《

<a

href="http://ti./g/s?sid=AUV9TkhR9XziFokSOXQRypk1&r=252180&aid=pno"

target="_blank">腾讯QQ用户服务条款</a>》。

</p>

</div>

<div id="footer">

? Tencent Inc.

</div>

<script type="text/javascript">

var g_btrace_zhibo = new Image(1,1);

var _u = '/collect?ftime=1310183089&sIp=-1266685874&iQQ=0&sBiz=moauth&sOp=inter&iSta=0&iTy=424&iFlow=0&t=3&c=0&oa=1200b4a5a24f45509478a4a809d75495&r=7';

g_btrace_zhibo.src = _u;

</script>

</body>

</head>

至此我们就完成了如何通过WebView控件获取验证码的方法,解决了上一节的缺陷。

课程下载地址:/file/e60px8bk

文档下载地址:/source/3437652

源码下载地址:/file/aq2vc2re

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。