记一次【模拟点击】,WinForm小软件开发过程
前言
年初四月份的时候,有朋友找到我,说想开发一个模拟点击的软件。最终软件做完后,发现效果不理想。唯一开发的我是认为最好是放弃了,做运营的他,坚持说这个没问题,说是改变合作方式。最终也是不了了之了。
不过,在这中间经历了一次重写,三次核心方法的变更,无数次的查资料,找解决办法至凌晨。中间穿插了无数次的讨论修改,修改讨论。虽然功能很简单,但是也花费了三个月的心血。心想,还是想好好总结一下。最后的软件界面如下:



实现思路&使用控件
首先,在内置浏览器里面打开网页,通过Javascript 获取需要的点击的坐标位置;计算网页中的坐标,在屏幕中的坐标位置;通过模拟鼠标的操作(滚动滑轮,移动,点击);以及随机的二次点击。最后再清除缓存,更换IP,更换分辨率,以及User-Agent。来达到欺骗网站,认为是不同的人来点击的目的。
使用的具体方法,如下:
- 内置浏览器,CefSharp 49.0 为了兼容.NET 4.0,大部分Win7可以直接使用;
- 鼠标,键盘模拟输入,InputSimulator , 最早之前是直接调用Windows API的,没有这个好用;
- 切换IP,两种ADSL切换 和 IP精灵软件(ADSL 这个目前没有使用的,DotRas.dll);
- 切换分辨率,是直接拿Github上面代码直接用。ScreenResolutionChanger;
- License 使用EasyLicense;
- 本地数据库SQLite;
- 代码混淆 .NET Reactor;
小小的记录
杀毒软件的坑:使用模拟输入的时候,一直提示 User Interface Privilege Isolation(用户界面特权隔离) 的问题,权限不够。试了关闭Windows的UAC,用超级管理员启动,给软件加数字证书,放到C盘系统目录等等。各种方法都试了就是无法模拟操作。实在没办法了,然后在猪八戒上面发布任务,放上Demo。万万没想到,一个大学生给我解决了,是因为360等杀毒软件导致的。。。。
IP精灵DLL版本的坑:最开始用的他们官网提供的dll,发现他们那个dll基本用不起来,好像是许久不更新了。另外,状态编码也会随意改变,也不发更新通知。造成也结果就是,明明以前好好的,怎么今天就突然用不起来了。
ADSL测试的坑:代码写好后无法测试,或者测试起来很麻烦。现在这年代用ADSL拨号上网的越来越少了,同样想测试也麻烦。好不容易找了个远程的ADSL主机,结果一测试就断网,尴尬。。。
获取网络时间:为了避免用户直接修改系统时间,来达到突破License 。获取到 大门户网站 http header 中的 date 来检验本地时间是否准确。在这中间,我发现大陆封杀了好多的时间同步的网站,只有一两个能用,又极度不稳定,并且中科院的又用不起。坑货!!
SQLite小巧玲珑:之前第一个版本用 纯文本来存放配置文件,记录日志信息。极度不方便,容易出现数组越界这样的bug。后来采用sqlite后,才发现了开发的美好。sqlite拥有完整的sql那一套东西,并且体积又小,不用安装,非常适合做本地少量信息的存储。
屏幕分辨率:最开始是手动实现windows api 来获取列表,改变分辨率的,bug又多又不完善。某天灵光一闪,在github上面找了一下真还有这个代码,省了不少事情。另外,我还发现wiki上面写的,显示分辨率列表 总共只有那么几十个,可见分辨率的大小,不是随意写的。但是通过windows api 获取到的列表 就一大堆有几百个。我分析,是因为分辨率,色深,赫兹。这三个参数排列组合导致的。
Cefsharp文档的重要性:清除缓存,清除cookie,Storage。设置弹出方式,重写http header,执行javascript等等。一系列的内置浏览器的操作,都是看github上面的wiki,以及google看英文文档(baidu就是坑爹货,同样的文章,转来转去;一般第一页80%广告,前三页都是同样的内容,剩下的风马牛不相及)。没有别人帮助,只有硬着头皮翻译一点看一点,然后写代码试。如果找不到实现方法,也要去看看为什么不能实现。记录一些,我认为比较重要的地方:
- ILifeSpanHandler 控制Cefsharp弹出的窗口 事件。(DoClose,OnAfterCreated,OnBeforeClose,OnBeforePopup)
- IRequestHandler 控制Cefsharp发送请求的事件,太多了不一一列举。
- Cef.Initialize 只能初始化一次,如果想彻底清除缓存,必须关闭宿主程序。 如果在主程序内,调用Cef.Shutdown 后再次初始化会报错的。49.0版本有这个问题,后续的版本修复了这个问题。
- 执行 js 的时候,要注意锁的问题,使用 Monitor 更加精细的控制。
- 重新翻译了github上部分Cefsharp文档。
WinForm开发:第一次写winform程序,认为是小程序,各种粗制滥造。尤其是到后期,主窗体代码到达一两千行,逻辑调用混乱,真心看不下去了,修改起来的很费劲。干脆重新写吧。重新设计文档目录,窗体拆分,代码分类,左搞右搞,总算勉强能看,但是今天又把代码翻出来看了看,总感觉什么地方不对,又说不出是哪里不对。。。
- 线程的重要性,写惯了web,极少情况考虑线程的问题。但是在桌面程序里面,线程是非常重要的问题,尤其是非主线程操作UI界面的时候。
- 事件的运用,同样,在桌面程序里面,事件使用起来非常舒服。以前对代理,事件也仅仅知道概念。实践之后,才知道这个是多么优秀的设计。
- VS 所见即所得的窗体设计界面,由于 Cefsharp 运行时加载控件的,也就是开发时设计界面打不开。这也算一点小麻烦。
- 通过句柄的操作。 主要获得主界面句柄,获取按钮句柄,然后SendMessage,来触发按钮事件。还有就是,win7 之前和之后的SendMessage 大有不同,要注意。
辅助进程启动:由于Cef必须完全关掉宿主进程,才可以彻底清除缓存。所以,当时就采用了,辅助进程来重启主进程。这个比较简单,涉及到Process的一些操作,为了方便易用,同时还设计了热键功能。
License 注册:这个比较简单,参照demo。我获取的是本机的CPU序列号,主板序列号,硬盘的ID(为什么不是序列号,因为硬盘市场参差不齐,还有的厂家不存在序列号)。为了防止被猜到,我随便加了点料(当时的真实感受)。最后MD5加密,提取哈希值。如下图:

总结
- 经过这么一折腾,深深得感觉到,程序员主要作用是在组装代码的:把不相干的代码有机的拼装在一起,组成一个可以使用的软件。
- 善于利用google,github,stack overflow,基本能解决99%的技术问题。
- 英语非常非常重要,百度非常非常坑。
- 实在头疼脑热的时候,不舒服的时候,不如去休息。
- 需求的确认,这是非常重要的事情。
记一次【模拟点击】,WinForm小软件开发过程的更多相关文章
- webkit 模拟点击 winform
刚在园子里看到有博主将WebBowser控件替换为Chrome内核(),链接http://www.cnblogs.com/gdyblog/p/WebKitBrowser.html 于是我想既然实现了替 ...
- 七、Selenium与phantomJS----------动态页面模拟点击、网站模拟登录
每天一个小实例1(动态页面模拟点击,并爬取你想搜索的职位信息) from selenium import webdriver from bs4 import BeautifulSoup # 调用环境变 ...
- visual studio 设计第一个WinForm小程序
WinForm小程序之消息框 首先打开visual studio 软件,然后[文件]-[新建]-[项目]-[Visual C#]-[Windows],选择Windows窗体应用程序,根据自己的需要修改 ...
- Android开发——Accessibility机制实现模拟点击(微信自动抢红包实现)
1. 何为Accessibility机制 许多Android使用者因为各种情况导致他们要以不同的方式与手机交互.对于那些由于视力.听力或其它身体原因导致不能方便使用Android智能手机的用户,And ...
- C# WinForm小程序(技术改变世界-cnblog)
WinForm小程序(技术改变世界-cnblog) 需求: 1.点击按钮 更新 当前时间 2.输入 身份证,必须身份证 排序(类似银行卡那样的空格),自动生成空格排序 3.实现 必须按 第一个按 ...
- Mac 上使用 Shell 脚本 + adb shell 实现简单的 Android 模拟点击自动化测试
需求 在 A 界面,点击跳转到 B 界面(该界面会执行一些业务),再点击返回键出现 Dialog 弹窗,点击确认退出按钮,返回 A 界面.不断循环. 思路 一开始想到的就是按键精灵,下了 mac 版使 ...
- js javascript 模拟点击 超级链接点击 转
转自:http://mo2g.com/view/42/ 我尝试过多次用jQuery模拟用户点击a标签的功能,但都没有成功,并且困扰了很久.前段时间的一次发呆,冒出了新的想法,于是就动手进行了测试. 先 ...
- 鼠标模拟点击a标签
今天写程序遇到的,想要用鼠标模拟点击a标签 html代码如下: <a id="jump"></a> js代码如下: var page = ....; $(' ...
- JavaScript或jQuery模拟点击超链接和按钮
有时候我们需要页面自动点击超链接或者按钮,可以用js或者jQuery利用程序去点击,方法很简单,按钮或超链接代码如下: <a href="url" target=" ...
随机推荐
- spring boot 登录注册 demo (三) -- 前后端传递
前端页面通过thymeleaf渲染 <dependency> <groupId>org.springframework.boot</groupId> <art ...
- 【MySQL】Linux下MySQL 5.5、5.6和5.7的RPM、二进制和源码安装
[MySQL]Linux下MySQL 5.5.5.6和5.7的RPM.二进制和源码安装 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后, ...
- 使用xorm工具,根据数据库自动生成 go 代码
使用xorm工具,根据数据库自动生成 go 代码 引入 使用 golang 操作数据库的同学都会遇到一个问题 -- 根据数据表结构创建对应的 struct 模型.因为 golang 的使用首字母控制可 ...
- JS函数-我调用自己试试看
前言 最近在读<JavaScript语言精粹>,对递归函数有了进一步的认识,希望总结下来: 递归是一种强大的编程技术,他把一个问题分解为一组相似的子问题,每一问题都用一个寻常解去解决.递归 ...
- open文件操作之mode模式剖析
Python可以使用open函数来实现文件的打开,关闭,读写操作: Python3中的open函数定义为: open(file, mode='r', buffering=None, encoding= ...
- Sublime Text3 最常用快捷键
软件快捷键再多,平时常用的也就那么几个,先总结如下: 全选:Ctrl+A 复制:Ctrl+C 粘贴:Ctrl+V 删除:Ctrl+X 快速复制到下一行:Ctrl+Shift+D 快速向上移动代码:Ct ...
- ASP.NET Core 2.0 自定义 _ViewStart 和 _ViewImports 的目录位置
在 ASP.NET Core 里扩展 Razor 查找视图目录不是什么新鲜和困难的事情,但 _ViewStart 和 _ViewImports 这2个视图比较特殊,如果想让 Razor 在我们指定的目 ...
- String 操作
String nbbms ="col_1_1_1_1,col_2_2_2_@,"; @ 实现将最后一个逗号去掉:从第一个字符串到最后一个逗号之前的字符串截取[java] Strin ...
- jenkins到底如何拉取代码 如何部署的
tips:jenkins通过配置,将之前编译.打包.上传.部署到Tomcat中的过程交由jenkins,jenkins通过指定的代码地址url,将代码拉取到其jenkins的安装位置,进行编译.打包和 ...
- C++重写(override)、重载(overload)、重定义(redefine)以及虚函数调用
一.基本概念 对于C++中经常出现的函数名称相同但是参数列表或者返回值不同的函数,主要存在三种情况: 1.函数重写(override) 函数重载主要实现了父类与子类之间的多态性,子类中定义与父类中名称 ...