年初四月份的时候,有朋友找到我,说想开发一个模拟点击的软件。最终软件做完后,发现效果不理想。唯一开发的我是认为最好是放弃了,做运营的他,坚持说这个没问题,说是改变合作方式。最终也是不了了之了。
不过,在这中间经历了一次重写,三次核心方法的变更,无数次的查资料,找解决办法至凌晨。中间穿插了无数次的讨论修改,修改讨论。虽然功能很简单,但是也花费了三个月的心血。心想,还是想好好总结一下。最后的软件界面如下:
首先,在内置浏览器里面打开网页,通过Javascript 获取需要的点击的坐标位置;计算网页中的坐标,在屏幕中的坐标位置;通过模拟鼠标的操作(滚动滑轮,移动,点击);以及随机的二次点击。最后再清除缓存,更换IP,更换分辨率,以及User-Agent。来达到欺骗网站,认为是不同的人来点击的目的。
使用的具体方法,如下:
杀毒软件的坑:使用模拟输入的时候,一直提示 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%广告,前三页都是同样的内容,剩下的风马牛不相及)。没有别人帮助,只有硬着头皮翻译一点看一点,然后写代码试。如果找不到实现方法,也要去看看为什么不能实现。记录一些,我认为比较重要的地方:
WinForm开发:第一次写winform程序,认为是小程序,各种粗制滥造。尤其是到后期,主窗体代码到达一两千行,逻辑调用混乱,真心看不下去了,修改起来的很费劲。干脆重新写吧。重新设计文档目录,窗体拆分,代码分类,左搞右搞,总算勉强能看,但是今天又把代码翻出来看了看,总感觉什么地方不对,又说不出是哪里不对。。。
辅助进程启动:由于Cef必须完全关掉宿主进程,才可以彻底清除缓存。所以,当时就采用了,辅助进程来重启主进程。这个比较简单,涉及到Process的一些操作,为了方便易用,同时还设计了热键功能。
License 注册:这个比较简单,参照demo。我获取的是本机的CPU序列号,主板序列号,硬盘的ID(为什么不是序列号,因为硬盘市场参差不齐,还有的厂家不存在序列号)。为了防止被猜到,我随便加了点料(当时的真实感受)。最后MD5加密,提取哈希值。如下图: