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

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

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

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/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.t.qq.com/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.WebViewActivityonCreate添加如下代码,进行浏览器的初始化:

@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
= Pattern.compile(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.t.qq.com"></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.t.qq.com开头。
</p>
<p>
授权后,在第三方网站的活动应继续遵守《
<a
href="http://ti.3g.qq.com/g/s?sid=AUV9TkhR9XziFokSOXQRypk1&r=252180&aid=pno"
target
="_blank">腾讯QQ用户服务条款</a>》。
</p>
</div>
<div id="footer">
? 2011 Tencent Inc.
</div>
<script type="text/javascript">
var g_btrace_zhibo = new Image(1,1);
var _u = 'http://btrace.qq.com/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控件获取验证码的方法,解决了上一节的缺陷。


 

课程下载地址:http://u.115.com/file/e60px8bk

文档下载地址:http://download.csdn.net/source/3437652

源码下载地址:http://u.115.com/file/aq2vc2re

转载于:https://www.cnblogs.com/jdsjlzx/archive/2011/07/19/2110911.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再度吐槽,PHP在centos7的安装方式稍不注意可能就打击你的积极性

由于装新机器&#xff0c;没仔细看随便找了篇博文就匆匆安装了php73结果&#xff0c;连配置文件&#xff0c;扩展模块都找不着在哪这里介绍一个linux的查找命令 find / -name php73* 这一命令使用了*这一正则匹配的方法查找php73系列安装文件所处的路径 然而&#xff0c;不幸开…

put请求方式参数如何传_TP5请求(request)变量

可以通过Request对象完成全局输入变量的检测、获取和安全过滤&#xff0c;支持包括$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系统变量&#xff0c;以及文件上传信息。检测变量是否设置可以使用has方法来检测一个变量参数是否设置&#xff0c;如下&…

python numpy的var std cov研究

var&#xff1a;表示方差&#xff0c; 即各项-均值的平方求和后再除以N &#xff0c; std&#xff1a;表示标准差&#xff0c;是var的平方根。 cov&#xff1a;协方差 ,与var类似&#xff0c;但是除以(N-1) import numpy as np# 构建测试数据&#xff0c;均值为10 sc [9.7, 10…

谷歌服务器——为什么选择Jetty?

google服务器为什么选选择Jetty&#xff1f;因为&#xff1a;Jetty是Java领域另一个出色的Web服务器&#xff0c;它同样也是开源的。与tomcat不同的是它可作为一个嵌入式服务器。也就是说&#xff0c;如果我们在应用中加入jetty的核心jar文件&#xff0c;应用即可对外提供http服…

Vue手动封装实现一个五星评价得效果

我是歌谣 放弃很难 但是坚持一定很酷 微信公众号关注小歌谣 一起学习前后端知识 今天要说得是实现一个vue中实现五星评价得效果 简单来说 就是封装组件把 具体需要我们了解组件间得相互传值 数据绑定等知识 先用脚手架起个项目先 脚手架启动 ​ 安装依赖 包括 npm ins…

LetCode-MSSQL查找重复的电子邮箱

sql的题目如下所示&#xff0c;查询出重复的电子邮箱 解法(1):查询出查询出Email相等 Id不相同的数据具体语句如下所示: select a.Email from Person as a,Person as b where a.Emailb.Email and a.Id!b.Id此时我们可以看到我们的语句中输出了2次结果但是预期结果只输出了1次…

鸿蒙内核是闭源吗_鸿蒙出世,中华有为!

作者&#xff1a;飞翔吧&#xff01;橙哥转载授权(文末留言&#xff0c;或添加微信&#xff1a;mzy2117)8月9日&#xff0c;超强台风“利奇马”登陆中国。当沿海各地的人们都在琢磨下班如何回家的时候&#xff0c;在广东东莞举行的华为2019年开发者大会上&#xff0c;华为正式发…

Visual Studio 2003/Visual Studio 2005常用快捷键(快捷方式)

调试快捷键 F6: 生成解决方案 CtrlF6: 生成当前项目 F7: 查看代码 ShiftF7: 查看窗体设计器 F5: 启动调试 CtrlF5: 开始执行(不调试) ShiftF5: 停止调试 CtrlShiftF5: 重启调试 F9: 切换断点 CtrlF9: 启用/停止断点 CtrlShiftF9: 删除全部断点 F10: 逐过程 CtrlF10: 运行到光标…

oracle 添加字段

alter table 表名 add 新增字段名(类型长度);#添加字段alter table asset_orders add remark varchar2(255);#查看describe asset_orders;转载于:https://www.cnblogs.com/zhaojingyu/p/11236747.html

[html] 如果一个标签元素同时出现两个class属性,两个class都会生效吗?为什么?

[html] 如果一个标签元素同时出现两个class属性&#xff0c;两个class都会生效吗&#xff1f;为什么&#xff1f; class类应该是生效的&#xff0c;具体怎么个执行书序取决于样式表中加载顺序&#xff0c;相同属性后来居上个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前…

CListCtrl控件

CListCtrl控件在数据库编程中是用得比较多的控件之一&#xff0c;也是Window控件中较难掌握的一个控件。他可以有四显示方式 1&#xff1a;报告显示方式 在Report方式中&#xff0c;列表控件的显示方式是有行和列的&#xff0c;行有叫做Item&#xff0c;但有多列是我们只能操作…

儿童学文字编程python_手把手教你python数字知识

上篇文章讲述了python的数据类型。 我们先回顾一下&#xff1a;包括&#xff1a;数字&#xff0c;字符串&#xff0c;列表&#xff0c;元组&#xff0c;字典。接下来我们详细的介绍这几种类型。 今天要说的是关于数字的教程。 说到数字&#xff0c;可能你的头脑里首先会反应出&…

LetCode-MSSQL超过5名学生的课

此图关键在于去重后使用having count查询出大于5的值 select class from courses group by class having count(distinct student) > 5;

在laravel5.8中集成swoole组件----初步测试

铺垫前提是先安装swoole组件&#xff0c;我采用从pecl-----php扩展组件网下载swoole扩展包&#xff0c;然后切入到解压缩的扩展包中运行phpize命令&#xff0c; phpize是一种编译命令&#xff0c;可以在安装文件中生成configure文件&#xff0c;从而方便我们编译安装&#xff0…

[html] 写一个鼠标跟随的特效

[html] 写一个鼠标跟随的特效 <!doctype html> <style> #pionter{ width: 20px; height: 20px; background: pink; border-radius: 20px; position:absolute; } </style></head> <body><div id"pionter"></div><scrip…

ListBox的使用

1、添加行 m_ctrlListBox.AddString("第一行"); m_ctrlListBox.AddString("第二行"); 2、清空列表 m_ctrlListBox.ResetContent();3、设置列表控件的背景颜色 ① 先创建一个基于对话框的工程&#xff0c;命名为test&#xff0c;然后在对话框上加入一…

python改文件名_通过python顺序修改文件名字的方法

通过python顺序修改文件名字的方法 更新时间&#xff1a;2018年07月11日 11:48:55 作者&#xff1a;longma666666 今天小编就为大家分享一篇通过python顺序修改文件名字的方法&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。一起跟随小编过来看看吧 问题&…

LetCode-MSSQL从不订购的客户

解法(1)&#xff1a;思路为先查询出订购的客户再使用not in查询出不包含订购客户的其他人也就是从来不订购的客户 查询出订购的客户语句: select a.Id from Customers as a,Orders as b where b.CustomerIda.Id再使用not in 查询 不再里面的客户 select Name as Customers fr…

docker 常用命令 以及常见问题

常见命令 windos 在搜索框 输入 windows powershell&#xff0c;打开。然后输入以下命令#查看镜像列表 docker images #删除单个镜像 docker rmi image-id #删除所有镜像 docker rmi $(docker images -q) #查看运行中的容器 docker ps #查看所有容器 docker ps -a #停止单个容器…

[html] p标签里面嵌套img标签会出现向上高3像素是什么原因?如何处理?

[html] p标签里面嵌套img标签会出现向上高3像素是什么原因&#xff1f;如何处理&#xff1f; 图片是内联元素&#xff0c;内联元素的对齐方式是按照文字基线对齐的&#xff0c;而不是文字底线对齐&#xff0c;所以会出现空隙。方法一&#xff1a;在 img 标签中使用 vertical-a…