12
28
2011
11

利用脚本提升 Wine QQ 登录体验

本文来自依云'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()

几点说明:

  1. 执行以下命令禁止QQ记住用户信息,这样再次启动时焦点会在输入QQ号的地方而不是会导致崩溃的密码框。如果你使用我给的压缩包的话应该可以跳过。
    rm -rf Users/All\ Users
    mkdir Users/All\ Users
    chmod -w Users/All\ Users
    
  2. 需要 wine 1.3.32 或更低,以及 wine_gecko 1.3 或更低。新版本在调用 IE 的组件进行显示时会崩溃,这包括「消息管理器」、「查看聊天历史」、「聊天窗口」的侧栏等。
  3. 我执行的是自己包装过的具有隐私保护功能的「rwine」程序。不过也不是特别安全,QQ仍能够访问剪贴板、截图等。
  4. 密码当然是明文保存。你觉得有必要折腾的话可以自己修改。
  5. 程序中需要的图片自己截。应该很容易知道应该截哪里。这样也避免了字体不同导致图像匹配失败。
  6. 此版本的 QQ 可以在这里下载:115 网盘

另注:更简洁好用的 TM2009 没有 wine 成功,登录时弹出错误


2014年3月25日更新:TM2009 以及 TM2013 后来均 Wine 成功了,并且在输入密码时不会崩溃。详情见此文

Category: Linux | Tags: python QQ wine 腾讯 | Read Count: 7830
jiazhoulvke 说:
Dec 28, 2011 05:44:47 PM

vbox才是一劳永逸的好办法

Avatar_small
依云 说:
Dec 28, 2011 07:22:00 PM

经常登不上去,乱七八糟的东西也太多了。

Avatar_small
依云 说:
Dec 28, 2011 07:22:32 PM

来了消息看不到提示啊。而且,我的内存不够用……

jiazhoulvke 说:
Dec 28, 2011 08:39:47 PM

囧,趁现在内存便宜升级算了。
提示的话……不知能不能写个小程序hook到QQ的消息状态,然后在linux里写个服务端,检测到有消息时就发送状态到服务端,然后服务端用osd提示……我都要佩服我的联想能力了……

Avatar_small
依云 说:
Dec 28, 2011 09:01:46 PM

你知道吗,内存永远是不够用的……
你可以截图然后比对的,不过我不会 Windows 编程。不知道「按键精灵」行不行。

nswutong 说:
Dec 29, 2011 11:17:57 AM

这个好,可以用来写游戏挂机外挂,回头试试。按键精灵的广告太恶心了

泥灸 说:
Dec 30, 2011 03:29:52 PM

这个好,但是用不习惯

Avatar_small
依云 说:
Dec 30, 2011 07:44:12 PM

今天 vbox 图形界面出了点问题,于是用命令行界面,然后发现 controlvm 子命令中有 screenshotpng 命令可以用来截图~不过还有个问题:如果聊天窗口已经打开,有什么特征来识别该聊天会话有新消息了呢?

jiazhoulvke 说:
Dec 30, 2011 08:47:42 PM

方法一:养成发完信息随手按ESC的良好习惯……
方法二:既然能判断系统托盘图标是否改变,那对于窗口内容是否改变应该也能判断的啊,那就看窗口内容变了没,变了就说明来信息了。
话说这样搞真蛋疼……

Avatar_small
依云 说:
Dec 30, 2011 09:01:00 PM

问题是,托盘图标可以保证显示,窗口不一定会在截图里显示啊。最小化了怎么办,被挡住了怎么办,被 Virtuawin 隐藏了又怎么办?
蛋疼的QQ……


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

部分静态文件存储由又拍云存储提供。 | Theme: Aeros 2.0 by TheBuckmaker.com