Python+Appium实现群控软件的快速开发

群控软件:使用计算机程序控制多台移动端设备的App,进行一些定制化的自动操作。

背景

最近应客户需求,开发了几款基于Appium框架的群控软件,如微信自动加好友、抖音自动关注等。将开发过程中用到的一些公共方法进行了封装,用于实现此类软件的快速开发。本文将以QQ自动加好友为例,从需求分析、流程设计、代码编写三个步骤,说说如何实现群控软件的快速开发。

需求分析

客户的需求通常不会十分明确,特别是这类群控软件,可能需求就两句话:“小张啊,我现在有几万个淘宝商家的QQ号,你看能不能写个程序自动添加成好友?”。

那么针对这样一个两句话的需求,如何进行需求分析呢?首先从可行性的角度去考虑,在脑海中模拟一下,想要实现这个需求,会遇到哪些问题,然后将问题一一列出,如QQ自动加好友:

  1. QQ是否有添加好友的开放接口?
  2. 如果没有开放接口,就需要模拟人为操作,那要选用哪个平台?PC端还是移动端?
  3. 这几万个QQ号现在存在哪里?数据库还是Excel文件?
  4. 用于添加这几万个QQ号的QQ是一个还是多个?如果是多个,是将几万个QQ号平均分配还是全部添加?
  5. ……

将这些问题分为两类:技术类(1、2)和业务类(3、4)。将技术类的问题解决后,带着业务类问题与客户进行讨论和确认。以下是技术验证并与客户讨论需求后得出的结论:

  1. 暂时没有找到QQ添加好友的开放接口,因此选择以模拟人为操作的方式实现。
  2. 在PC端操作的话,只能通过坐标定位去模拟,该方式稳定性低;而Appium框架支持手机App中的元素选择,相对来说稳定性较高,因此选用移动端。
  3. QQ号现在存在Excel文件中,文件包含两个字段:商家名称、QQ号。
  4. 多个QQ,全部添加。
  5. ……

确保这些问题全部解决后,就可以进入下一步,流程设计了。

流程设计

流程设计是群控软件的所有开发环节中最简单的一环,只需要电脑连接手机后,配合Appium桌面版,在手机上模拟一遍操作流程,将自动化操作步骤和对应的元素选择器记录下来就行。

比如QQ加好友的步骤为:打开手机QQ→点击右上角的加号→点击加好友→输入QQ号→点击找人→点击加好友→输入验证消息→输入备注→点击发送→点击返回→继续输入QQ号。将这些步骤中涉及到的按钮、文本框等元素的选择器进行记录,通常会通过id或xpath进行选择。

其实就是为接下来编写代码提前打了个草稿,这个过程本是可以在编写代码的时候进行的,但加入这个环节,提前考虑好流程,并将元素选择器准备好,可以有效提高开发效率。

以下是QQ自动加好友的流程设计:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
点击加号
xpath://android.widget.ImageView[@content-desc="快捷入口"]

点击加好友
xpath://android.widget.LinearLayout[@content-desc="加好友/群 按钮"]

输入QQ号
xpath://android.widget.EditText[@content-desc="搜索栏、QQ号、手机号、群、公众号"]
id:com.tencent.mobileqq:id/et_search_keyword

点击找人
xpath://android.widget.LinearLayout[@content-desc="找人:{当前添加的QQ号}"]

点击加好友
id:com.tencent.mobileqq:id/txt

输入验证消息
xpath://android.widget.RelativeLayout/android.widget.EditText[@resource-id="com.tencent.mobileqq:id/name"]

输入备注
xpath://android.widget.LinearLayout/android.widget.EditText[@resource-id="com.tencent.mobileqq:id/name"]

点击发送
id:com.tencent.mobileqq:id/ivTitleBtnRightText

点击返回
xpath://android.widget.TextView[@resource-id="com.tencent.mobileqq:id/ivTitleBtnLeft" and @text="返回"]

从第三步开始循环

代码编写

核心代码

项目源码已上传至GitHub

其中,核心的几个文件为:

  • oappium.py

    实现了两个基类:AppiumAutoTool和MultiAppium。

  • qqaf_auto_tool.py

    继承oappium.py中的AppiumAutoTool,实现自动化流程。

  • qqaf_auto_tool_multi.py

    继承oappium.py中的MultiAppium,实现手机的集群控制。

  • qqaf_auto_tool_ui.py

    使用QtDesiner+PyUic生成的PyQt界面源码。

  • main.py

    连接界面层和底层脚本,进行界面交互和功能整合。

具体代码不做展开说明,可自行参考源码。

集群控制的实现思路

首先简单介绍一下Appium。Appium是一个移动端App的自动化测试框架,使用Python开发时需要安装第三方库Appium-Python-Client,使用该框架能完成一些App上的自动化任务,甚至是爬虫任务。

这有点类似PC端的selenium,不用去关心数据接口和接口参数,而是模拟人工的点击、输入、滑动等操作,并返回界面源码,做到可见即可爬。

Appium控制单台设备的实现方式是,首先开启一个Appium服务器(端口默认为4723),再根据Desired Capabilities(设备及App的相关参数)加上对应的服务器端口(4723)来启动driver驱动来进行控制。

因此多设备集群控制的实现思路就是,使用多线程,根据设备数量在不同端口启动多个Appium服务器,再配置对应的设备参数在对应端口启动多个driver驱动。集群控制的实现代码在oappium.py中的MultiAppium类中。