命令控制qq自动申请远程控制

 


 

适应环境:

操作系统:win7 家庭版,winxp

Qq版本:Qq2011,qq2011(安全保护)

 

 

原始需求:

因为公司的网络安全非常的严格,但是有的时候的确需要链接回公司干活。最初想找找合适的远程控制工具,但是多半都需要IP和端口一类的,而电脑在很深的内网,离外网的接口机都还有一段距离,要搞定网络配置颇为麻烦。于是考虑使用qq的远程控制功能。

 

具体实现思路:

离开公司的时候,开启qq,打开一个我在家使用qq的窗口,然后做一个工具每隔一段时间(比如30秒)就去看看qq窗口有没有命令发过来,如果接收到了命令,就进行相应的操作。

 

方案选择:

方案选择当然是在满足条件的基础上尽可能简单了,qtp和testcomplete都太复杂,难道为了这么简单的一个功能还要启动这么庞大的一个工具,显然杀鸡用牛刀了。试了试vbs,也不是太理想。这几个工具都面临一个问题,就是对象无法识别,本来用vbs想直接键盘操作,结果发现腾讯公司还是有对策,当做到申请控制的时候,键盘无法操作,即便用TAB切到按钮上,回车和空格不起作用,怎么样都不能按下按钮,只好作罢。要是调用鼠标点击,又是屏幕绝对坐标定位,适应性太差了。

 

最终翻了箱底,搜出来以前搞过的autoit,直接鼠标操作绕过对象识别算了。autoit的鼠标操作可以活动窗体的坐标系定位。

 

方案优缺点:

优点:

适应性好,不用识别对象,不管你是什么qq版本,只要基本流程一致,大不了修改一下每次点击的位置就行了。

 

缺点:

Qq的版本太多了,不同用户的qq窗口,远程协助按钮的位置在窗体中坐标都可能是不同的,分辨率影响,所以为了适应这么多不同,就得在配置文件中修改按钮<远程协助>、<确定>(qq2011有这个按钮,其他版本多半没有)、<申请控制>和<断开>在qq窗体中的相对坐标。

 

 

得,咱废话少说,就直接说工具的使用吧。

 

录制autoit键盘鼠标操作脚本工具:

http://download.csdn.net/detail/testingba/4583600

 

控制qq自动申请远程控制工具:

http://download.csdn.net/detail/testingba/4583605

 

 

相关的工具是两个:

第一个是自动控制qq的工具,里面有两个文件,一个是qqctl.exe,另一个是配置文件qqctl.ini,exe文件是可以更名的,不过同时ini修改文件名为一致的就可以了;

第二个是将键盘和鼠标操作自动录制为autoit脚本,这个是为了将配置文件修改的和实际情况一致使用的。

 

看看配置文件先:

[section1]

title1="title1"

x1=315

y1=65

x2=352

y2=107

x3=484

y3=426

x4=480

y4=420

x5=475

y5=456

 

 

解释一下:

Title1是qq窗体的名字,也就是主控端的那个qq的备注名字;

X1,y1,x2,y2是点击远程协助的坐标,为什么是两个呢,你看看下面的图就明白了:

 

001.jpg

 

X3,y3:是<确定>的坐标

X4,y4:是<申请受控>的坐标

X5,y5:是<断开>的坐标

 

 

Qq2011的整个交互过程是这样的:

A:被控端

B:主控端

A上的qq和B上的qq互相加为好友;

 

B启动qq,打开Aqq的窗口;

B启动程序;

A启动qq,打开Bqq,发送命令:远程协助

Bqq接收到<远程协助>的命令,就去点击远程协助;

Aqq接收到远程协助的请求,点击接受;

Bqq上弹出要求确定的按钮;

Aqq上发送<确定>命令;

Bqq接收到确定的请求,点击确定;

此时Aqq可以看到B的桌面了;

Aqq再发送<申请受控>的命令;

Bqq接收到申请受控的请求,点击申请受控按钮;

Aqq同意,整个过程就搞定了,要想中断可以直接叉掉,或者发送<断开>命令,控制Bqq点击断开按钮。

 

 

以上的测试很顺利的就在本机完成了。

 

等到用的时候,发现被控机的qq版本是qq2011(安全保护),交互过程是不同的。

主要区别是,远程协助的按钮不在子菜单下面,就直接是第一级按钮;

远程协助接受以后,Bqq端并不需要按确定按钮,就直接申请受控了。

 

解决法子:

X1,y1,x2,y2设置为同一个就是了,点击了申请协助后,再点一次没啥问题。

至于确定,你别发送确定的命令就行了。

 

 

录制工具的使用需要说明吗,好像不用了,太简单了,手工完成整个过程,录制好ini文件中需要的内容就行了。

 

 

记得那四条命令就行了:

远程协助

确定

申请受控

断开

 

 

另:

考虑了一些特殊使用场景,程序有一定的适应能力:

1.      比如B端界面上冒出来一个什么窗口,比如qq的弹出窗口挡住了Aqq的窗口,这个可以程序自动激活获得Aqq窗体的焦点;

2.      如果网络不稳定,突然断掉了,重新发起命令,照样可以重新连接;

 

 

脚本改进:

1.      断开命令是个傻帽命令,没有场景会用到,应该直接删除相关代码;

2.      控制好了以后,那个程序会老是去激活Aqq窗体,这个有些讨厌,退掉qqctl.exe,又怕中途断了连接不回来。


这个我是这么考虑的,增加两条新的命令<已经连接>和<已经中断>,当监控收到<已经连接>,就不再去激活窗体进行监控,如果中途断掉了,或者直接关闭了窗口,等网络能够连接了,就发送<已经中断>过去,监控收到命令,就重新监控其他几条命令,这么说不知道大家听懂了没有。回头自己尝试一下吧,我有空也写一个出来。

分析:这个想法是错误的,因为如果发送了<已经连接>,程序不再激活窗体监控,如何得知接收到了新的命令<已经中断>,一旦停止监控,就无法再继续监控了。所以必须监控qq进程相关的链接才行,链接掉了就是中断了控制,如果多个qq,只能监控到第一个启动的qq,虽然不够完美,但是可以限制监控的qq是第一个启动的来实现。


这里新写了一个监控qq是否远程监控的函数,测试通过:


#include


Func fQQcnt()
Local $strPid
Local $line
Local $blnCnt


$line=""
$blnCnt=False
$strPid=ProcessExists("qq.exe")


Local $foo = Run(@ComSpec & " /c netstat -ano -p TCP|find /i """ & $strPid & """|find /i ""ESTABLISHED""|find /V "":80 ""|find /V "":443 """, @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD )


While 1
$line = $line & StdoutRead($foo)
If @error Then ExitLoop
Wend


if $line="" Then
$blnCnt=False
Else
$blnCnt=True
EndIf


Return $blnCnt
EndFunc


唉,这个方法还是错误的,因为在申请了远程协助以后,连接就已经建立了,而此时还没有申请控制,结果因为已经连接,停止监控的结果就是无法收到<申请受控>的命令了。


这个东西比我想象的复杂,得另外想法子了。总算想出法子来了,说穿了很简单,就是剪切图片进行比对。不过技术细节可就不是那么简单了,这个倒是很有用,图片比对呀,通用法子,还有啥搞不定的。等我倒腾出来了,回头另外开一篇。


好了,已经完善了,新写了一篇:

http://blog.csdn.net/testingba/article/details/8020020




这个脚本过于简单,没啥含金量,算了吧,懒得讲了,不过有兴趣的同学可以下载来参考参考。技术深浅不是最重要的,能解决问题最重要。

 

autoit3安装程序:

http://download.csdn.net/detail/testingba/4583878

 

命令控制qq自动申请远程控制代码:

http://download.csdn.net/detail/testingba/4583884

 

 

如果搞不定,可以qq:2310095680

进行交流

 

 

 

 

你可能感兴趣的:(脚本,qq控制,autoit)