程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

自动化登录:利用安卓模拟器实现网页二维码扫描登录

hfteth 2025-02-15 15:42:24 技术文章 11 ℃

导读:本文主要讨论利用安卓模拟器实现网页二维码扫描登录,主要基于以下技术来实现自动化登录。

  • AirtestProject(APP 内元素定位)
  • adb(桥梁)
  • 安卓模拟器(运行 APP)
  • playwright-python(网页自动化)

adb

Android Debug Bridge (adb) 是一种功能多样的命令行工具,可与设备进行通信。adb 命令可用于执行各种设备操作,例如安装和调试应用。当启动某个 adb client 时,该客户端会先检查是否有 adb server 进程已在运行。如果没有,它会启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb client 发出的命令。adb server 会与所有正在运行的设备建立连接。后续就可以通过 adb 命令来访问和操作这些设备。

// adb 下载
https://developer.android.com/tools/releases/platform-tools?spm=5176.28103460.0.0.297c5d275YV4Te&hl=zh-cn
// 环境变量配置(win10)
打开“控制面板”或“设置” -> “系统” -> “关于” -> “高级系统设置” -> PATH 加入
D:\Program Files\platform-tools-latest-windows\platform-tools
// 验证
adb version

安卓模拟器

安卓模拟器有很多,如 Bluestacks(蓝叠)、LDPlayer(雷电模拟器)等。这里笔者使用的是蓝叠模拟器(部分 APP 会检测识别特定的模拟器),它支持自定义控制配置,多开,脚本编写等功能。安装好模拟器后需要开启支持 adb 调试。

// 查看设备连接情况
adb devices -l

// 打印如下
List of devices attached
emulator-5554   device   // 每个模拟器占用两个端口,奇数给控制台连接,偶数给 adb 连接, 状态 device 表示已经连上

//如果配置正确但是 adb 识别不到,则可通过重启 adb 解决
adb kill-server

在模拟器上预先下载好 APP,并登陆好账号。模拟器如果运行比较卡,可做适当调整。

AirtestProject

是一个跨平台的UI自动化框架,此处笔者用于定位安卓APP上的元素。它提供了一个 IDE ,其支持自动化脚本录制,可以录制我们的操作并生成相应的代码和文件,十分方便。后续可将这些生成的代码嵌入到我们自己的 python 程序中。关于详细的操作可自行查阅官方文档。

它主要由以下三部分组成:

  • Airtest 基于图像识别的自动化测试框架
  • Poco 基于 UI 控件识别的自动化测试框架
  • AirtestIDE 编辑器

将生成代码嵌入到我们的 python 代码中时需要安装相应的库(注意 python 版本 <= 3.9)

// 安装Airtest框架
pip install airtest

// 安装Poco框架;编写了Poco语句就需要安装
pip install pocoui

实践:结合 playwright-python 实现打开网页自动扫码登陆的思路

playwright-python 是一个 Python 库用于浏览器自动化操作,首先我们可以基于它实现打开浏览器,跳转到指定网站,并模拟点击直到扫码登陆界面。接下来对二维码进行截图,并通过 adb 命令推送到模拟器上(注意,push 后模拟器相册不会立马更新,需要 broadcast 广播一下)。接下来通过 adb 连接模拟器并实现 APP 扫码操作(打开扫码界面 - 从相册中选择照片),这些 APP 定位和操作元素代码均可借助 AirtestProject 协助生成。

部分参考代码如下:

# 截图
filename = generate_uuid_string(13) + ".png"
source_path = "D:/PythonProject/Temp/images/" + filename
target_path = "/sdcard/DCIM/Camera/" + filename
broadcast_path = "file:///sdcard/DCIM/Camera/" + filename
await page.screenshot(path=source_path)
await asyncio.sleep(3)
# 推送到模拟器上
adn_command = "adb -s  emulator-5554 push " + source_path + " " + target_path
subprocess.run(adn_command, capture_output=True, text=True, shell=True)
# push后相册没有立马更新,需要广播一下
adn_command = "adb -s  emulator-5554 shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d " + broadcast_path
subprocess.run(adn_command, capture_output=True, text=True, shell=True)

# 连接设备
auto_setup(__file__, devices=["android://127.0.0.1:5037/127.0.0.1:5555"])
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)

# 进入到扫码界面
touch(Template(r"../images/tpl1726731649836.png", record_pos=(-0.458, -0.811), resolution=(900, 1600)))
await asyncio.sleep(2)
touch(Template(r"../images/tpl1726732113466.png", record_pos=(-0.031, -0.803), resolution=(900, 1600)))
await asyncio.sleep(2)
touch(Template(r"../images/tpl1726732129931.png", record_pos=(0.279, 0.72), resolution=(900, 1600)))
# 选取第一张二维码进行扫码
await asyncio.sleep(2)
poco("com.ss.android.ugc.aweme:id/ni6").click()
# 同意
await asyncio.sleep(2)
touch(Template(r"../images/tpl1727151787833.png", record_pos=(-0.014, 0.701), resolution=(900, 1600)))        

相关文档

蓝叠:
https://www.bluestacks.cn/keymaping.html

AirtestProject :https://airtest.doc.io.netease.com/tutorial/1_quick_start_guide/

如何脱离AirtestIDE跑自动化脚本:
https://airtest.doc.io.netease.com/IDEdocs/faq/0_no_airtestide/

ADB:https://developer.android.com/tools/adb?spm=5176.28103460.0.0.297c5d275YV4Te&hl=zh-cn#options

playwright-python:https://github.com/microsoft/playwright-python

Tags:

最近发表
标签列表