本文来自依云's Blog,转载请注明。
我从某处下载的QQ2010,其它都好,就是登录时焦点在密码框时,QQ就会崩溃。解决办法是使用QQ自带的软键盘输入密码。但在这个「半字母顺序」排列软键盘上找需要的需要实在费事。作为一名 Linuxer,我自然得想办法将其自动化。
很久之前就已经看到这个Xpresser软件,但可惜的是,它在Arch下跑不起来。但我从中学到了简单的图像匹配,再加上自己对 Xtest 的了解,解决方案呼之欲出。
本来是三个月前就打算写篇文章的,因各种原因迟迟未写。现在因为各种原因再次折腾这家伙,还是写出来分享一下吧。使用OpenCV做图像匹配部分我就不写了,有兴趣的自己去看 Xpresser 或者 winterpy 中的代码。
首先,介绍一下依赖。本脚本依赖众多的东西,其中我自己写的部分在 winterpy 里有,主要是 OpenCV 图像匹配,以及之前写过的 Xtest 调用、使用 GDK 截图。最终,我利用它们写成了 xauto.py 库,功能还十分欠缺,但自动登录Wine QQ足够了,因为我做这些的主要目的就是这可恶的QQ。
#!/usr/bin/env python3 # vim:fileencoding=utf-8 import os import sys from xauto import XAuto, Image QQNo = 'YourQQNo' QQPwd = 'YourQQPassword' def main(): if os.fork() == 0: if os.fork() == 0: os.execlp('rwine', 'rwine') else: sys.exit() os.chdir(os.path.split(sys.argv[0])[0]) rect = (20, 150, 500, 500) xa = XAuto() w, h = xa.screensize target_w, target_h = 500, 300 w, h = w - target_w, h - target_h w, h = w // 2, h // 2 center = (w, h, target_w, target_w) xa.default_rect = center xa.find_and_click('ok.png', repeat=10) or sys.exit('click 确定') xa.find_and_click('qq.png', repeat=10) or sys.exit('find qq no input') xa.wait(1) for k in QQNo: xa.key(k) xa.wait(0.4) pwd_pos = xa.find('input_pwd.png') xa.click(pwd_pos) caps = Image('caps.png') xa.wait(0.4) for ch in QQPwd: xa.find_and_click('%s.png' % ch) or sys.exit(2) xa.wait(0.1) xa.find_and_moveto(caps) xa.wait(0.1) xa.moveto(pwd_pos) xa.wait(0.4) xa.find_and_click('login.png') if __name__ == '__main__': main()
几点说明:
-
执行以下命令禁止QQ记住用户信息,这样再次启动时焦点会在输入QQ号的地方而不是会导致崩溃的密码框。如果你使用我给的压缩包的话应该可以跳过。
rm -rf Users/All\ Users mkdir Users/All\ Users chmod -w Users/All\ Users
- 需要 wine 1.3.32 或更低,以及 wine_gecko 1.3 或更低。新版本在调用 IE 的组件进行显示时会崩溃,这包括「消息管理器」、「查看聊天历史」、「聊天窗口」的侧栏等。
- 我执行的是自己包装过的具有隐私保护功能的「rwine」程序。不过也不是特别安全,QQ仍能够访问剪贴板、截图等。
- 密码当然是明文保存。你觉得有必要折腾的话可以自己修改。
- 程序中需要的图片自己截。应该很容易知道应该截哪里。这样也避免了字体不同导致图像匹配失败。
- 此版本的 QQ 可以在这里下载:115 网盘。
另注:更简洁好用的 TM2009 没有 wine 成功,登录时弹出错误。
2014年3月25日更新:TM2009 以及 TM2013 后来均 Wine 成功了,并且在输入密码时不会崩溃。详情见此文。
Dec 28, 2011 05:44:47 PM
vbox才是一劳永逸的好办法
Dec 28, 2011 05:48:58 PM
webQQ~
Dec 28, 2011 07:22:00 PM
经常登不上去,乱七八糟的东西也太多了。
Dec 28, 2011 07:22:32 PM
来了消息看不到提示啊。而且,我的内存不够用……
Dec 28, 2011 08:39:47 PM
囧,趁现在内存便宜升级算了。
提示的话……不知能不能写个小程序hook到QQ的消息状态,然后在linux里写个服务端,检测到有消息时就发送状态到服务端,然后服务端用osd提示……我都要佩服我的联想能力了……
Dec 28, 2011 09:01:46 PM
你知道吗,内存永远是不够用的……
你可以截图然后比对的,不过我不会 Windows 编程。不知道「按键精灵」行不行。
Dec 29, 2011 11:17:57 AM
这个好,可以用来写游戏挂机外挂,回头试试。按键精灵的广告太恶心了
Dec 30, 2011 03:29:52 PM
这个好,但是用不习惯
Dec 30, 2011 07:44:12 PM
今天 vbox 图形界面出了点问题,于是用命令行界面,然后发现 controlvm 子命令中有 screenshotpng 命令可以用来截图~不过还有个问题:如果聊天窗口已经打开,有什么特征来识别该聊天会话有新消息了呢?
Dec 30, 2011 08:47:42 PM
方法一:养成发完信息随手按ESC的良好习惯……
方法二:既然能判断系统托盘图标是否改变,那对于窗口内容是否改变应该也能判断的啊,那就看窗口内容变了没,变了就说明来信息了。
话说这样搞真蛋疼……
Dec 30, 2011 09:01:00 PM
问题是,托盘图标可以保证显示,窗口不一定会在截图里显示啊。最小化了怎么办,被挡住了怎么办,被 Virtuawin 隐藏了又怎么办?
蛋疼的QQ……