手机群控系统OpenSTF

之前做私域流量,研究了很多微信群发的消息,无意中发现了stf这个非常棒的开源手机群控系统,可以实现远程、实时的操控手机,一部旧android机,一台树莓派即可搭建一个可以实时为自己实现云手机的系统。

并且可以针对于刷榜的手机墙、积分墙、自动化测试、批量执行进行定制开发,极其简单。

在网上搜过一些资料,无非都是复制粘贴的,没什么营养。都是简单搭建简单使用。本次想借此机会把踩的坑都梳理一下并做详细记录。

下面我们来详细了解一下OpenSTF,会从几个角度分别梳理

一、搭建OpenSTF系统

二、连接手机设备

三、系统角色权限

四、远程调试

五、远程访问令牌

六、Jenkins集成

七、App控制

八、分布式部署OpenSTF

(一)搭建OpenSTF系统

有两种方式:

1. 通过Docker

2. 自己按照步骤搭建(坑比较多,不推荐)

鉴于系统搭建的通用性,我们这里暂时只说通过docker方式搭建的情况

docker搭建stf需要三个镜像:stf、rethinkdb、adbd

这里建议使用docker-compose来配置:

version: "3"
services:
  rethinkdb:
    image: rethinkdb
    container_name: rethinkdb
    restart: always
    volumes:
      - "/docker/openstf/rethinkdb:/data"

  adbd:
    image: sorccu/adb:latest
    container_name: adbd
    privileged: true
    restart: always
    volumes:
      - "/dev/bus/usb:/dev/bus/usb"
      - "/data:/data"

  stf:
    build: .
    container_name: stf
    restart: always

配置好后直接执行 docker-compose up就可以了。通过docker配置非常简单。

镜像拉好启动后会看到docker ps中存在:openstf/stf:latest、rethinkdb、sorccu/adb:latest三个容器。

注意!!!这里有个坑!

由于stf连接手机需要大量(上千个)端口,所以需要把服务器的防火墙端口都打开,否则将无法连接手机!!

(二)连接手机设备

本来连接手机设备这步是直接插上即可,但是在实际操作中会有些问题出现,本节只总结问题:

1. 需要打开手机USB调试

2. 需要打开手机允许模拟位置点击(在开发者模式里)

3. 会自动安装STF Service APP (部分手机需要点击允许)

完成以上三项,就可以从stf的后台中看到对应的手机设备并且操作使用了

手机群控系统OpenSTF_第1张图片

需要注意的是,连接STF的手机需要有minicap,否则则无法正常连接。目前已知部分高版本的OPPO/VIVO手机无法连接。如果做群控的话,建议使用小米6左右的机型。 

(三)系统角色权限

OpenSTF本身是支持多种身份验证方式的,本节提供比较通用的方式LDAP。它可以无缝接入,并且可以通过LDAP来配置权限

./stf local --public-ip ${ip} --allow-remote --auth-type ldap --auth-options ‘["–ldap-url",“ldap:服务器地址”, “–ldap-bind-dn”,“你的账号”,"–ldap-search-dn",“DC=sunraycn,DC=cn”, “–ldap-bind-credentials”,“ldap密码”, “–ldap-search-class”,“user”, “–ldap-search-field”, “用户信息字段”]’

 (四)远程调试

首先需要在STF中注册一个keychan

手机群控系统OpenSTF_第2张图片

手机群控系统OpenSTF_第3张图片

 在你需要连接远程手机的调试电脑上生成一个keychan,然后粘贴过来保存即可。设备处随意填写一个可以记住的名称。

添加好keychan后,我们就可以选择一个手机进行控制,进入后可以看到如下画面:

手机群控系统OpenSTF_第4张图片

将红色框框里的远程连接命令copy出来在你的bash中执行即可通过adb远程连接到远程设备了。

当结束调试时记得输入

adb disconnect

来断开远程连接。

注意!!!只有在后台页面中打开手机控制时,才能进行远程调试,否则端口不会打开无法进行调试!!! 

(五)远程访问令牌

STF可以通过远程访问令牌来访问系统的API

在STF后台先生成个令牌:

手机群控系统OpenSTF_第5张图片

生成后一定记得保存,用于之后的API请求中来使用。

STF常用的API:

1、获取用户信息
Method: GET
URL: http://yourdomain/api/v1/user
Header:
Authorization: Bearer 2a91d54cceb54993a468582041c8c67cadb6116881f84fec825e5111bdcde6c9

2、列出所有STF设备(包括断开连接或其他无法访问的设备)
Method: GET
URL: http://yourdomain/api/v1/devices
Header: Authorization: Bearer 2a91d54cceb54993a468582041c8c67cadb6116881f84fec825e5111bdcde6c9

3、返回有关特定设备的信息
Method:GET
URL:http://yourdomain/api/v1/devices/FA6990313540
Header: Authorization: Bearer 2a91d54cceb54993a468582041c8c67cadb6116881f84fec825e5111bdcde6c9

4、返回有关您自己(经过身份验证的用户)的信息
Method:GET
URL:http://yourdomain/api/v1/user
Header: Authorization: Bearer 2a91d54cceb54993a468582041c8c67cadb6116881f84fec825e5111bdcde6c9

5、返回经过身份验证的用户当前正在使用的设备的列表
Method:GET
URL:http://yourdomain/api/v1/user/devices
Header: Authorization: Bearer 2a91d54cceb54993a468582041c8c67cadb6116881f84fec825e5111bdcde6c9

6、尝试在经过身份验证的用户控制下添加设备。 这类似于在UI中按下“使用”
Method:POST
URL:http://yourdomain/api/v1/user/devices
Header:
(1)Authorization: Bearer 2a91d54cceb54993a468582041c8c67cadb6116881f84fec825e5111bdcde6c9
(2)Content-Type:application/json
Body:{"serial":"521df70f"}

7、从经过身份验证的用户的设备列表中删除设备。 这类似于在UI中按下“停止使用”
Method:DELETE
URL:http://yourdomain/api/v1/user/devices/521df70f
Header:Authorization: Bearer 2a91d54cceb54993a468582041c8c67cadb6116881f84fec825e5111bdcde6c9

8、获取设备远程连接url
Method:POST
URL:http://yourdomain/api/v1/user/devices/521df70f/remoteConnect
Header:Authorization: Bearer 2a91d54cceb54993a468582041c8c67cadb6116881f84fec825e5111bdcde6c9

9、断开设备远程调试会话
Method:DELETE
URL:http://yourdomain/api/v1/user/devices/521df70f/remoteConnect
Header:Authorization: Bearer 2a91d54cceb54993a468582041c8c67cadb6116881f84fec825e5111bdcde6c9
 

(六)Jenkins集成

Jenkins中有OpenSTF插件可以安装,但是版本比较老了貌似已经没有人维护了

手机群控系统OpenSTF_第6张图片

安装后在构建步骤中可以添加STF中空闲的手机进行执行构建内容

(七)App控制

鉴于我们推荐使用Docker的形式来搭建OpenSTF,所以在想针对app进行控制执行一些自动化操作时,可以使用adb来实现。区别于adb debug,可以 通过进入到docker容器内直接调取adb命令,以下是打开微信的示例:

docker exec openstf_adb_1 adb -s $element shell am start com.tencent.mm/com.tencent.mm.ui.LauncherUI

因为STF中会连接多部设备,所以需要通过adb -s 来区分连接哪部设备。当然如果使用jenkins来构建的话,可以直接写个shell来遍历设备id。

同理,可以通过命令行来执行monkey测试、UI自动化测试。

(八)分布式部署STF

STF分布式有2种方案,方案如下:

  • 主节点部署STF服务并允许远程访问API,子节点只需部署ADB,保证ADB 5037端口对外暴露即可。这种方案的优点是部署简单,而且子节点无需部署STF服务。缺点就是子节点新增机器需要在主节点重新运行STF命令以识别子节点上新增的机器。
  • 主节点部署STF服务并允许远程访问API,子节点也部署STF服务并允许远程访问API。然后主节点连接子节点。这种方案的优点是子节点新增设备可以自动识别。缺点就是子节点也需要部署STF服务。

手机群控系统OpenSTF_第7张图片

第一种情况,以Window子节点为例

(1)开启ADB,并对外暴露5037端口

adb nodaemon server -a -P 5037

如果出现adb端口被占用的情况,则通过命令查找5037端口占用进程并杀死进程即可。

netstat -aon|findstr 5037
taskkill /pid 5018 /f

(2)到MAC Master主节点运行stf provider命令连接Window子节点

Window的IP为:192.168.27.247,MAC机器IP为:192.168.27.180

stf provider --name GHL.local --min-port 7400 --max-port 7700 --connect-sub tcp://127.0.0.1:7114 \
--connect-push tcp://127.0.0.1:7116 --group-timeout 900 --public-ip 192.168.27.180 \
--storage-url http://localhost:7100/ \
--adb-host 192.168.27.247 --adb-port 5037 \
--vnc-initial-size 600x800 --mute-master never --allow-remote

上面这么多参数,可以查看Master主节点STF启动日志即可查到,这里主要就是通过新增

--adb-host 192.168.27.247 --adb-port 5037 \

来连接Window机器。

第二种情况,以Linux子节点为例

Linux上部署一个STF服务并运行远程访问API,Linux的IP为:192.168.27.200,MAC机器IP为:192.168.27.180 那么我们只需在Linux上运行stf provider连接Master节点即可,命令如下:

stf provider --name centerOs.local --min-port 7400 --max-port 7700 \ 
--connect-sub tcp://192.168.27.180:7114 --connect-push tcp://192.168.27.180:7116 \
--group-timeout 20000 --public-ip 192.168.27.180 --storage-url http://192.168.27.180:7100/ \ 
--vnc-initial-size 600x800 --allow-remote

这里可以看到无需输入adb远程端口,此时Linux节点上插入机器,Master节点就可以实时的查看到Linux上挂载的机器。而无需在Master节点重新输入stf provider命令。

综上总结,OpenSTF还是一个比较通用、简单的开源群控集成工具。

楼主猜测像各大平台的云测试系统就是根据OpenSTF进行二次开发的,当然各大平台的云测系统会有更复杂的任务分发、权限控制及日志回收、报告输出等。

你可能感兴趣的:(Android,私域流量,测试相关,android,微信,持续集成系统,群控,自动化测试)