WPF做12306验证码点击效果
一、效果
和12306是一样的,运行一张图上点击多个位置,横线以上和左边框还有有边框位置不允许点击,点击按钮输出坐标集合,也就是12306登陆的时候,需要向后台传递的参数。
二、实现思路
1、获取验证码图片
首先,我们看12306登陆页面,F12,通过如图的位置,我们可以观察到,验证码的请求URL是“https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&0.8291445260649148”,
我不知道0.8291445260649148这一串数字是如何得到的,所以,先把它从里面去掉,只留下“https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand”,
写一个Request请求,发现,可以请求到验证码图像,并且每次都不一样,因此,这段URL就够了。
图片的大小一直都是293*190,这是为了方便拿取坐标。
2、分析验证码图片
通过在12306官网的点击,可以发现,横线以上的部分是不让点击的,左侧和右侧的空白部分也不让点击,那我们在做的时候,就需要选取一个范围,作为鼠标可点击的范围。
通过GetPosition方法,可以轻松的获取到中心图片的四个角的坐标为(5,40)(5,180)(288,40)(288,180)也就是说,我们的可点击区域就是5=<X<=288 && 40=<Y<=180。
这样的话,我们在触发鼠标点击实践的时候,判别Position是否在这个范围。
3、鼠标点击,打上铁老大的Logo
在鼠标点击验证码的时候,将铁老大的Logo打上去,其实很简单,就是给Logo设置一个Canvas的附加属性,但是需要注意的是,我们默认打上去的时候,并不是Logo的中心位置,而是左上角位置,因此,还要计算中心
比如,我的Logo是32*32的,也就是说Position.X-16,Position.Y-16,这样,才能保证Logo上去以后,是中心为鼠标点击的位置。
当点击Logo时,Logo从Canvas里移除掉,这样就可以实现点击取消的效果。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Canvas x:Name="cav" Grid.Row="0">
<Image x:Name="img" Height="190" Width="293" MouseLeftButtonDown="img_MouseLeftButtonDown" />
</Canvas>
<Button Grid.Row="1" Content="坐标集合" x:Name="btn" Click="btn_Click" />
</Grid>
private void img_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
BitmapImage imageIcon = new BitmapImage(new Uri(@"pack://application:,,,/12306SecurityCode;component/favicon.ico", UriKind.RelativeOrAbsolute));
System.Windows.Point pointImg = e.GetPosition(img);
System.Windows.Point pointCav = e.GetPosition(cav);
if (pointImg.X >= && pointImg.X <= && pointImg.Y >= && pointImg.Y <= )
{
System.Windows.Controls.Image imgIco = new System.Windows.Controls.Image()
{
Source = imageIcon
};
imgIco.MouseLeftButtonDown += ImgIco_MouseLeftButtonDown;
Canvas.SetLeft(imgIco, pointCav.X - );
Canvas.SetTop(imgIco, pointCav.Y - );
cav.Children.Add(imgIco);
ImgicoList.Add(imgIco);
}
}
private void ImgIco_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
System.Windows.Controls.Image imgico = (System.Windows.Controls.Image)sender;
cav.Children.Remove(imgico);
ImgicoList.Remove(imgico);
}
4、获取剩下的Logo位置
不断的增加Logo,不断的减少Logo,获取最后留下的Logo,其实,就是一个用一个List集合来保存,最开始是想保存坐标的,但是发现如果保存坐标的话,控制起来会很费事,因此,就保存Logo的集合,最后,读取Logo的坐标
private System.Windows.Point GetIcoPoint(System.Windows.Controls.Image image)
{
System.Windows.Point point = new System.Windows.Point();
point.X = Canvas.GetLeft(image) + ;
point.Y = Canvas.GetTop(image) + - ;
return point;
}
因为,这部分坐标是要传回给12306,用来解析的,因此,我们首先需要还原,原来点击时的坐标,也就是需要加上Logo的半径大小16。
然后,我们看12306接收的坐标信息 7%2C11%2C282%2C10,(2,11)(282,10),这里的Y是11或者是10,也就是减去了横线以上的高度,为了方便,我们减掉40。
5、拼接字符串
因为图片中写的是“所有的”,因此是不需要判别先后循序的,只需要取得所有留下点的坐标就OK了,增加“%2C”作为标志,拼接所有的X和Y值
private void btn_Click(object sender, RoutedEventArgs e)
{
string s = string.Empty;
foreach (var item in ImgicoList)
{
System.Windows.Point point = GetIcoPoint(item);
s += point.X + "%2C" + point.Y + "%2C";
}
s = s.Substring(, s.Length - );
MessageBox.Show(s);
}
WPF做12306验证码点击效果的更多相关文章
- 使用 WPF 做个 PowerPoint 系列 基于 OpenXML 解析实现 PPT 文本描边效果
本文是使用 WPF 做个 PowerPoint 系列的博客,本文来告诉大家如何解析 PPT 里面的文本描边效果,在 WPF 应用中绘制出来,实现像素级相同 背景知识 在开始之前,期望你了解了 PPT ...
- wpf做的3d滑动gallery
原文:wpf做的3d滑动gallery wpf做的3d滑动gallery 随着iphone\ipad的流行及热捧,现在做移动产品不管是什么平台的,领导总想做成像ios系统的样子.自从微软发布了wind ...
- C# WPF 左侧菜单右侧内容布局效果实现
原文:C# WPF 左侧菜单右侧内容布局效果实现 我们要做的效果是这样的,左侧是可折叠的菜单栏,右侧是内容区域,点击左侧的菜单项右侧内容区域则相应地切换. wpf实现的话,我的办法是用一个tabcon ...
- 让低版本的 Android 项目显示出 Material 风格的点击效果
每天都被不同的需求纠缠的生活是幸福而又不幸的,这不我们家亲爱的设计师们又让我们在低版本的 Android 平台上实现一下类似于 Material Design 的点击效果. 虽然大家都知道 Mater ...
- WebView加载本地Html文件并实现点击效果
Webview是用来与前端交互的纽,可以加载本地Html文件,和网页并实现交互的功能. WebView通过WebSetting可以使用Android原生的JavascriptInterface来进行j ...
- Android之Button自定义点击效果
我们在界面上经常会用到button按钮,但通常button点击后看不到点击的效果,如果用户连续点击了两次,就会报NAR错误,这样交互性就比较差了.如果我们自定义了button点击效果,比如我们点击了b ...
- Golang做的验证码(2)
前面一篇文章介绍了2个用Golang做的验证码 http://www.cnblogs.com/ghj1976/p/3392847.html 这里再补充几个: 1.在GAE上使用的Google的验证码 ...
- AndroidRichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)
代码地址:https://github.com/Luction/AndroidRichText AndroidRichText帮助实现像QQ,微信一样的,一个TextView里既有文字又有表情又有图片 ...
- 利用jquery+iframe做一个ajax上传效果
以下是自学it网--中级班上课笔记 网址:www.zixue.it html页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict ...
随机推荐
- mysql每秒最多能插入多少条数据 ? 死磕性能压测
前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...
- 让 windows 下的命令行程序 cmd.exe 用起来更顺手
在 Windows 下使用 Larave 框架做开发,从 Composer 到 artisan 总是避免不了和 cmd.exe 打交道,系统默认的命令行界面却是不怎么好看,且每行显示的字符数是做了限制 ...
- spring源码分析之freemarker整合
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一款程 ...
- AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache
这篇我们就要介绍AFAutoPurgingImageCache这个类了.这个类给了我们临时管理图片内存的能力. 前言 假如说我们要写一个通用的网络框架,除了必备的请求数据的方法外,必须提供一个下载器来 ...
- [Egret]优雅的写http
首先,自从使用链式调用的写法后,就一发不可收拾的喜爱上了这种优雅的方式.不管是写架构还是写模块,我都会不自觉的使用这种最优雅的方式.链式写法既减少了代码量,又非常优雅的. 在使用 egret 的htt ...
- 用FSM一键制作逐帧动画雪碧图 Vue2 + webpack
因为工作需要要将五六十张逐帧图拼成雪碧图,网上想找到一件制作工具半天没有找到,就自己用canvas写了一个. 写成之后就再没有什么机会使用了,因此希望有人使用的时候如果遇到bug了能及时反馈给我. 最 ...
- VS2015常用快捷键总结
生成解决方案 F6,生成项目Shift+F6 调试执行F5,终止调试执行Shift+F5 执行调试Ctrl+F5 查找下一个F3,查找上一个Shift+F3 附加到进程Ctrl+Alt+P,逐过程F1 ...
- MSYS2环境下编译X265
HEVC(High Efficiency Video Coding),是一种新的视频压缩标准.可以替代H.264/ AVC编码,使得保持相同质量的情况下,体积减少40%左右.目前有多种实现版本,x26 ...
- Javascript中的valueOf与toString
基本上,javascript中所有数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题,本文将详细介绍,有需要的朋友可以参考下. t ...
- 从零自学Hadoop(22):HBase协处理器
阅读目录 序 介绍 Observer操作 示例下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,Sour ...